Fix subscription state detection for users based on phone numbers, emails (#633)

* Fix subscription state detection for users based on phone numbers, emails
* Fix unit tests for api_user4
* Use a single method for determining subscription from user
* Pass user object, rather than user.email for getting subscription state
This commit is contained in:
sabaimran
2024-01-30 18:18:55 -08:00
committed by GitHub
parent fc4b57d9f6
commit 4daac334bc
2 changed files with 5 additions and 3 deletions

View File

@@ -160,7 +160,7 @@ class UserAuthenticationBackend(AuthenticationBackend):
if subscribed:
return (
AuthCredentials(["authenticated", "premium"]),
AuthenticatedKhojUser(user),
AuthenticatedKhojUser(user, client_application),
)
return AuthCredentials(["authenticated"]), AuthenticatedKhojUser(user, client_application)
if state.anonymous_mode:

View File

@@ -207,6 +207,8 @@ def subscription_to_state(subscription: Subscription) -> str:
return SubscriptionState.TRIAL.value
elif subscription.is_recurring and subscription.renewal_date >= datetime.now(tz=timezone.utc):
return SubscriptionState.SUBSCRIBED.value
elif not subscription.is_recurring and subscription.renewal_date is None:
return SubscriptionState.EXPIRED.value
elif not subscription.is_recurring and subscription.renewal_date >= datetime.now(tz=timezone.utc):
return SubscriptionState.UNSUBSCRIBED.value
elif not subscription.is_recurring and subscription.renewal_date < datetime.now(tz=timezone.utc):
@@ -222,11 +224,11 @@ def get_user_subscription_state(email: str) -> str:
return subscription_to_state(user_subscription)
async def aget_user_subscription_state(email: str) -> str:
async def aget_user_subscription_state(user: KhojUser) -> str:
"""Get subscription state of user
Valid state transitions: trial -> subscribed <-> unsubscribed OR expired
"""
user_subscription = await Subscription.objects.filter(user__email=email).afirst()
user_subscription = await Subscription.objects.filter(user=user).afirst()
return subscription_to_state(user_subscription)