import logging from datetime import datetime, timezone from fastapi import APIRouter, Depends from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.models import Subscription from app.schemas import SubscribeRequest, SubscribeResponse from app.services.signed_request import verify_signed_request router = APIRouter() logger = logging.getLogger(__name__) ACTION_SUBSCRIBE = "subscribe" @router.post("/subscribe", response_model=SubscribeResponse) async def subscribe(body: SubscribeRequest, db: AsyncSession = Depends(get_db)): wallet = body.wallet.lower().strip() verify_signed_request( action=ACTION_SUBSCRIBE, wallet=wallet, timestamp_ms=body.timestamp, signature=body.signature, body=None, ) result = await db.execute( select(Subscription).where(Subscription.wallet_address == wallet) ) sub = result.scalar_one_or_none() now = datetime.now(timezone.utc).replace(tzinfo=None) if sub is None: sub = Subscription(wallet_address=wallet, active=True, subscribed_at=now) db.add(sub) else: sub.active = True if sub.subscribed_at is None: sub.subscribed_at = now await db.commit() logger.info("Subscription activated for wallet %s", wallet) return SubscribeResponse(status="ok", wallet=wallet)