48 lines
1.4 KiB
Python
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)
|