feat(subscription): improve subscription sync and renewal logic.
This commit is contained in:
@@ -49,7 +49,9 @@ class RenewalService:
|
||||
)
|
||||
return utils.calculate_price(plan)
|
||||
|
||||
async def _renew_subscription_in_rw(self, subscription: Subscription) -> None:
|
||||
async def _renew_subscription_in_rw(
|
||||
self, subscription: Subscription, expire_at: datetime.datetime
|
||||
) -> None:
|
||||
rw_user = await rw_service.get_user_by_telegram_id(self.rw_sdk, subscription.user_id)
|
||||
if not rw_user:
|
||||
raise RenewalServiceError(f"RW user not found for user_id={subscription.user_id}")
|
||||
@@ -58,7 +60,7 @@ class RenewalService:
|
||||
if subscription.whitelists:
|
||||
squads.append(InternalSquads.WHITELISTS)
|
||||
|
||||
await rw_service.add_days(self.rw_sdk, rw_user.uuid, subscription.duration_days)
|
||||
await rw_service.update_expire_at(self.rw_sdk, rw_user.uuid, expire_at)
|
||||
await rw_service.update_squads(self.rw_sdk, rw_user.uuid, squads)
|
||||
await rw_service.set_hwid_limit(self.rw_sdk, rw_user.uuid, subscription.devices)
|
||||
|
||||
@@ -89,7 +91,9 @@ class RenewalService:
|
||||
await self.subscription_repository.update_subscription_autorenew(
|
||||
session, user_id, False
|
||||
)
|
||||
await self._notify_user(user_id, AUTORENEWAL_INSUFFICIENT_FUNDS)
|
||||
await self._notify_user(
|
||||
user_id, AUTORENEWAL_INSUFFICIENT_FUNDS.format(price=price, balance=user.balance)
|
||||
)
|
||||
return False
|
||||
|
||||
renewed_user = await self.user_repository.decrease_user_balance(
|
||||
@@ -104,8 +108,14 @@ class RenewalService:
|
||||
logger.error("Failed to decrease balance for user %d", user_id)
|
||||
return False
|
||||
|
||||
now_utc = datetime.datetime.now(datetime.UTC)
|
||||
if subscription.end_date > now_utc:
|
||||
new_expire = subscription.end_date + datetime.timedelta(days=subscription.duration_days)
|
||||
else:
|
||||
new_expire = now_utc + datetime.timedelta(days=subscription.duration_days)
|
||||
|
||||
try:
|
||||
await self._renew_subscription_in_rw(subscription)
|
||||
await self._renew_subscription_in_rw(subscription, new_expire)
|
||||
except RenewalServiceError:
|
||||
logger.exception("Failed to renew subscription in RW for user %d", user_id)
|
||||
await self.user_repository.increase_user_balance(
|
||||
@@ -117,11 +127,10 @@ class RenewalService:
|
||||
)
|
||||
return False
|
||||
|
||||
new_end_date = subscription.end_date + datetime.timedelta(days=subscription.duration_days)
|
||||
await self.subscription_repository.update_sub(
|
||||
session,
|
||||
user_id,
|
||||
end_date=new_end_date,
|
||||
end_date=new_expire,
|
||||
autorenew=True,
|
||||
status=SubscriptionStatus.ACTIVE,
|
||||
devices=subscription.devices,
|
||||
@@ -134,7 +143,7 @@ class RenewalService:
|
||||
user_id,
|
||||
AUTORENEWAL_SUCCESS.format(
|
||||
price=price,
|
||||
end_date=new_end_date.strftime("%d.%m.%Y"),
|
||||
end_date=new_expire.strftime("%d.%m.%Y"),
|
||||
),
|
||||
)
|
||||
await notify_subscription_renewal(
|
||||
@@ -146,7 +155,7 @@ class RenewalService:
|
||||
devices=subscription.devices,
|
||||
duration_days=subscription.duration_days,
|
||||
whitelists=subscription.whitelists,
|
||||
end_date=new_end_date.strftime("%d.%m.%Y"),
|
||||
end_date=new_expire.strftime("%d.%m.%Y"),
|
||||
)
|
||||
|
||||
logger.info("Successfully renewed subscription for user %d", user_id)
|
||||
|
||||
Reference in New Issue
Block a user