Files
trumpsignal-backend/app/api/subscribe.py
T
2026-04-21 19:33:24 +08:00

48 lines
1.4 KiB
Python

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)