getUserSubscription method
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');
}
}