sponsor_prompt.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. """API routes for the in-app sponsor toast."""
  2. import logging
  3. from fastapi import APIRouter, Depends, status
  4. from sqlalchemy.ext.asyncio import AsyncSession
  5. from backend.app.core.auth import RequirePermissionIfAuthEnabled
  6. from backend.app.core.database import get_db
  7. from backend.app.core.permissions import Permission
  8. from backend.app.models.user import User
  9. from backend.app.schemas.sponsor_prompt import (
  10. SponsorPromptCheckResponse,
  11. SponsorPromptDismissRequest,
  12. )
  13. from backend.app.services import sponsor_prompt as service
  14. logger = logging.getLogger(__name__)
  15. router = APIRouter(prefix="/sponsor-prompt", tags=["sponsor-prompt"])
  16. def _user_id(current_user: User | None) -> int | None:
  17. return current_user.id if current_user is not None else None
  18. @router.get("/check", response_model=SponsorPromptCheckResponse)
  19. async def check_sponsor_prompt(
  20. current_user: User | None = RequirePermissionIfAuthEnabled(Permission.SETTINGS_READ),
  21. db: AsyncSession = Depends(get_db),
  22. ):
  23. """Return the next eligible sponsor-toast trigger, or `{show: false}`."""
  24. trigger = await service.evaluate(db, _user_id(current_user))
  25. await db.commit()
  26. if trigger is None:
  27. return SponsorPromptCheckResponse(show=False)
  28. return SponsorPromptCheckResponse(
  29. show=True,
  30. milestone=trigger.milestone,
  31. family=trigger.family,
  32. threshold=trigger.threshold,
  33. payload=trigger.payload,
  34. )
  35. @router.post("/dismiss", status_code=status.HTTP_204_NO_CONTENT)
  36. async def dismiss_sponsor_prompt(
  37. data: SponsorPromptDismissRequest,
  38. current_user: User | None = RequirePermissionIfAuthEnabled(Permission.SETTINGS_READ),
  39. db: AsyncSession = Depends(get_db),
  40. ):
  41. """Anchor the 14-day cooldown and record the milestone as shown."""
  42. await service.dismiss(db, _user_id(current_user), data.milestone)
  43. await db.commit()
  44. return None