getUserSubscription method

  1. @override
Future<void> getUserSubscription()
override

Implementation

@override
Future<void> getUserSubscription() async {
  AppConfig.logger.d('getUserSubscription');

  try {
    List<UserSubscription> subscriptions = await UserSubscriptionFirestore().getByUserId(user.id);

    if(subscriptions.isNotEmpty) {
      // Check for suspended subscription first
      final suspended = subscriptions.firstWhereOrNull(
        (sub) => sub.status == SubscriptionStatus.suspended,
      );
      if (suspended != null) {
        _isSubscriptionSuspended = true;
        AppConfig.logger.w('User subscription ${suspended.subscriptionId} is SUSPENDED');
      } else {
        _isSubscriptionSuspended = false;
      }

      _userSubscription = subscriptions.firstWhereOrNull((subscription) => subscription.status == SubscriptionStatus.active);

      // Check if active subscription has a scheduled cancellation that has passed
      if (_userSubscription != null && _userSubscription!.endDate > 0) {
        final now = DateTime.now().millisecondsSinceEpoch;
        if (now >= _userSubscription!.endDate) {
          AppConfig.logger.i('Subscription ${_userSubscription!.subscriptionId} has passed its end date — marking as cancelled');
          UserSubscriptionFirestore().cancel(_userSubscription!.subscriptionId);
          // Reset profile verification level back to general
          if (user.profiles.isNotEmpty) {
            final profile = user.profiles.first;
            ProfileFirestore().updateVerificationLevel(profile.id, VerificationLevel.none);
            profile.verificationLevel = VerificationLevel.none;
          }
          _userSubscription = null;
          _subscriptionLevel = SubscriptionLevel.freemium;
          updateSubscriptionId('');
          return;
        }
      }

      if(userSubscription?.subscriptionId == user.subscriptionId) {
        _subscriptionLevel = userSubscription?.level ?? SubscriptionLevel.freemium;
        AppConfig.logger.d('User ${userSubscription?.subscriptionId} is the same as ${user.subscriptionId} for ${subscriptionLevel.name}');
      } else if(userSubscription?.subscriptionId.isNotEmpty ?? false) {
        user.subscriptionId = userSubscription?.subscriptionId ?? '';
        _subscriptionLevel = userSubscription?.level ?? SubscriptionLevel.freemium;
        AppConfig.logger.d('User subscription is different from user.subscriptionId');
      }
    } else if(user.subscriptionId.isNotEmpty) {
      _isSubscriptionSuspended = false;
      if (CoreUtilities.isWithinFirstMonth(user.createdDate)) {
        _subscriptionLevel = SubscriptionLevel.freeMonth;
        AppConfig.logger.i('User subscriptionId ${user.subscriptionId} is still within free month for SubscriptionLevel ${subscriptionLevel.name}');
      } else {
        AppConfig.logger.w('User subscriptionId ${user.subscriptionId} is out of free month');
        user.subscriptionId = "";
      }
    } else if(user.userRole.value > UserRole.subscriber.value){
      AppConfig.logger.d('No user subscription found');
      _subscriptionLevel = SubscriptionLevel.ambassador;
      _isSubscriptionSuspended = false;
    }
  } catch (e, st) {
    NeomErrorLogger.recordError(e, st, module: 'neom_core', operation: 'getUserSubscription');
  }

}