Fix updating subscription when invoice paid. Revert renewal_date logic

The actual issue was that `get_or_create_user_by_email' tried to
create a subscription even if it already existed.

With updated logic:
- New subscription is only created when it doesn't already exist in
  `get_or_create_user_by_email'
- `set_user_subscription' just updates the subscription state as
  user subscription object creation is already managed by
  `get_or_create_user_by_email'. So the other conditionals are
  unnecessary
This commit is contained in:
Debanjum Singh Solanky
2024-01-18 16:19:15 +05:30
parent 9b1a66c969
commit 9dfe1bb003
2 changed files with 16 additions and 24 deletions

View File

@@ -89,6 +89,8 @@ async def get_or_create_user_by_email(email: str) -> KhojUser:
user, _ = await KhojUser.objects.filter(email=email).aupdate_or_create(defaults={"username": email, "email": email}) user, _ = await KhojUser.objects.filter(email=email).aupdate_or_create(defaults={"username": email, "email": email})
await user.asave() await user.asave()
user_subscription = await Subscription.objects.filter(user=user).afirst()
if not user_subscription:
await Subscription.objects.acreate(user=user, type="trial") await Subscription.objects.acreate(user=user, type="trial")
return user return user
@@ -124,19 +126,11 @@ def get_user_subscription(email: str) -> Optional[Subscription]:
async def set_user_subscription( async def set_user_subscription(
email: str, is_recurring=None, renewal_date=None, type="standard" email: str, is_recurring=None, renewal_date=None, type="standard"
) -> Optional[Subscription]: ) -> Optional[Subscription]:
# Get or create the user object # Get or create the user object and their subscription
user = await get_or_create_user_by_email(email) user = await get_or_create_user_by_email(email)
user_subscription = await Subscription.objects.filter(user=user).afirst() user_subscription = await Subscription.objects.filter(user=user).afirst()
if not user_subscription:
user = await get_user_by_email(email) # Update the user subscription state
if not user:
return None
user_subscription = await Subscription.objects.acreate(
user=user, type=type, is_recurring=is_recurring, renewal_date=renewal_date
)
return user_subscription
elif user_subscription:
user_subscription.type = type user_subscription.type = type
if is_recurring is not None: if is_recurring is not None:
user_subscription.is_recurring = is_recurring user_subscription.is_recurring = is_recurring
@@ -146,8 +140,6 @@ async def set_user_subscription(
user_subscription.renewal_date = renewal_date user_subscription.renewal_date = renewal_date
await user_subscription.asave() await user_subscription.asave()
return user_subscription return user_subscription
else:
return None
def subscription_to_state(subscription: Subscription) -> str: def subscription_to_state(subscription: Subscription) -> str:

View File

@@ -51,7 +51,7 @@ async def subscribe(request: Request):
if event_type in {"invoice.paid"}: if event_type in {"invoice.paid"}:
# Mark the user as subscribed and update the next renewal date on payment # Mark the user as subscribed and update the next renewal date on payment
subscription = stripe.Subscription.list(customer=customer_id).data[0] subscription = stripe.Subscription.list(customer=customer_id).data[0]
renewal_date = datetime.fromtimestamp(subscription["lines"]["data"][0]["period"]["end"], tz=timezone.utc) renewal_date = datetime.fromtimestamp(subscription["current_period_end"], tz=timezone.utc)
user = await adapters.set_user_subscription(customer_email, is_recurring=True, renewal_date=renewal_date) user = await adapters.set_user_subscription(customer_email, is_recurring=True, renewal_date=renewal_date)
success = user is not None success = user is not None
elif event_type in {"customer.subscription.updated"}: elif event_type in {"customer.subscription.updated"}: