from fastapi import APIRouter, HTTPException from pydantic import BaseModel from typing import Optional from api.db.subscription import get_subscription, set_subscription, extend_subscription import uuid from datetime import datetime, timedelta router = APIRouter(prefix="/subscription", tags=["subscription"]) class SubscriptionInfo(BaseModel): user_id: int uuid: str until: datetime class SubscriptionCreate(BaseModel): user_id: int months: int @router.get("/{user_id}", response_model=Optional[SubscriptionInfo]) async def get_user_subscription(user_id: int): sub = await get_subscription(user_id) if not sub: return None return SubscriptionInfo(user_id=user_id, uuid=sub["uuid"], until=sub["until"]) @router.post("/new", response_model=SubscriptionInfo) async def create_subscription(data: SubscriptionCreate): sub_id = str(uuid.uuid4()) until = datetime.now() + timedelta(days=30*data.months) await set_subscription(data.user_id, sub_id, until) return SubscriptionInfo(user_id=data.user_id, uuid=sub_id, until=until) @router.post("/extend", response_model=SubscriptionInfo) async def extend_user_subscription(data: SubscriptionCreate): new_until = await extend_subscription(data.user_id, data.months) if not new_until: raise HTTPException(status_code=404, detail="Subscription not found") sub = await get_subscription(data.user_id) return SubscriptionInfo(user_id=data.user_id, uuid=sub["uuid"], until=new_until)