37 lines
1.6 KiB
Python
37 lines
1.6 KiB
Python
from fastapi import APIRouter, Header, Request
|
|
|
|
from app.core.config import get_settings
|
|
from app.core.deps import CurrentUser, DbSession
|
|
from app.core.rate_limit import enforce_rate_limit
|
|
from app.schemas.orders import TicketPublic
|
|
from app.schemas.tickets import TicketDetailPublic, TicketVerifyRequest, TicketVerifyResponse
|
|
from app.services.orders import get_ticket_for_user, list_user_tickets, ticket_to_public
|
|
from app.services.tickets import assert_checkin_authorized, get_ticket_detail_for_user, verify_ticket_at_gate
|
|
|
|
router = APIRouter(prefix="/tickets", tags=["tickets"])
|
|
|
|
|
|
@router.get("/my", response_model=list[TicketPublic])
|
|
def my_tickets(db: DbSession, user: CurrentUser) -> list[TicketPublic]:
|
|
rows = list_user_tickets(db, user.id)
|
|
return [TicketPublic.model_validate(ticket_to_public(row)) for row in rows]
|
|
|
|
|
|
@router.post("/verify", response_model=TicketVerifyResponse)
|
|
def verify_ticket(
|
|
body: TicketVerifyRequest,
|
|
request: Request,
|
|
db: DbSession,
|
|
x_check_in_key: str | None = Header(default=None, alias="X-Check-In-Key"),
|
|
) -> TicketVerifyResponse:
|
|
enforce_rate_limit(request, scope="ticket_verify", limit=60, window_seconds=60)
|
|
settings = get_settings()
|
|
assert_checkin_authorized(settings, x_check_in_key)
|
|
result = verify_ticket_at_gate(db, body.qr_token.strip())
|
|
return TicketVerifyResponse.model_validate(result)
|
|
|
|
|
|
@router.get("/{ticket_id}", response_model=TicketDetailPublic)
|
|
def get_ticket(ticket_id: int, db: DbSession, user: CurrentUser) -> TicketDetailPublic:
|
|
detail = get_ticket_detail_for_user(db, ticket_id, user.id)
|
|
return TicketDetailPublic.model_validate(detail)
|