feat: add subscription and transaction repositories
- Implemented SubscriptionRepository with methods to get, create, and update subscriptions. - Added BalanceTXRepository for creating and retrieving balance transactions. - Introduced a test script for simulating Pally webhook for local testing.
This commit is contained in:
74
repositories/subscriptions.py
Normal file
74
repositories/subscriptions.py
Normal file
@@ -0,0 +1,74 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user