90 lines
2.6 KiB
Python
90 lines
2.6 KiB
Python
from datetime import datetime
|
|
|
|
from sqlalchemy import select, update
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from db.models.subscriptions import Subscription, SubscriptionStatus
|
|
|
|
|
|
class SubscriptionRepository:
|
|
async def get_subscription_by_user_id(
|
|
self, session: AsyncSession, user_id: int
|
|
) -> Subscription | None:
|
|
stmt = select(Subscription).where(Subscription.user_id == user_id)
|
|
res = await session.execute(stmt)
|
|
return res.scalar_one_or_none()
|
|
|
|
async def create_subscription(
|
|
self,
|
|
session: AsyncSession,
|
|
*,
|
|
user_id: int,
|
|
end_date: datetime,
|
|
devices: int,
|
|
duration_days: int,
|
|
plan_price_paid: int,
|
|
whitelists: bool,
|
|
autorenew: bool = False,
|
|
status: SubscriptionStatus = SubscriptionStatus.EXPIRED,
|
|
) -> Subscription:
|
|
subscription = Subscription(
|
|
user_id=user_id,
|
|
end_date=end_date,
|
|
autorenew=autorenew,
|
|
status=status,
|
|
devices=devices,
|
|
whitelists=whitelists,
|
|
duration_days=duration_days,
|
|
plan_price_paid=plan_price_paid,
|
|
)
|
|
session.add(subscription)
|
|
await session.commit()
|
|
|
|
return subscription
|
|
|
|
async def update_sub(
|
|
self,
|
|
session: AsyncSession,
|
|
user_id: int,
|
|
*,
|
|
end_date: datetime,
|
|
devices: int,
|
|
whitelists: bool,
|
|
duration_days: int,
|
|
plan_price_paid: int,
|
|
autorenew: bool = False,
|
|
status: SubscriptionStatus = SubscriptionStatus.ACTIVE,
|
|
) -> Subscription | None:
|
|
stmt = (
|
|
update(Subscription)
|
|
.where(Subscription.user_id == user_id)
|
|
.values(
|
|
end_date=end_date,
|
|
autorenew=autorenew,
|
|
status=status,
|
|
devices=devices,
|
|
whitelists=whitelists,
|
|
duration_days=duration_days,
|
|
plan_price_paid=plan_price_paid,
|
|
)
|
|
.returning(Subscription)
|
|
)
|
|
result = await session.execute(stmt)
|
|
await session.commit()
|
|
return result.scalar_one_or_none()
|
|
|
|
async def update_subscription_autorenew(
|
|
self, session: AsyncSession, user_id: int, autorenew: bool
|
|
) -> Subscription | None:
|
|
stmt = (
|
|
update(Subscription)
|
|
.where(Subscription.user_id == user_id)
|
|
.values(
|
|
autorenew=autorenew,
|
|
)
|
|
.returning(Subscription)
|
|
)
|
|
result = await session.execute(stmt)
|
|
await session.commit()
|
|
return result.scalar_one_or_none()
|