phase 3 22 qr-code-renew

This commit is contained in:
2026-03-10 11:39:37 +00:00
parent 0e08e08fe1
commit 887a718a65
2 changed files with 192 additions and 43 deletions

View File

@@ -15,7 +15,7 @@ from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_asyn
from core.minio import ensure_bucket_exists, upload_pdf
from core.pdf_generator import generate_qr_ticket
from database.models import Ticket
from database.models import Seat, Ticket, Tournament
logging.basicConfig(
level=logging.INFO,
@@ -40,22 +40,37 @@ async def _handle_ticket_paid(
log.error("Event 'ticket_paid' missing 'ticket_id': %s", payload)
return
result = await db_session.execute(select(Ticket).where(Ticket.id == ticket_id))
ticket: Ticket | None = result.scalar_one_or_none()
# JOIN: Ticket → Seat → Tournament (one query, no N+1)
stmt = (
select(Ticket, Seat, Tournament)
.join(Seat, Ticket.seat_id == Seat.id)
.join(Tournament, Seat.tournament_id == Tournament.id)
.where(Ticket.id == ticket_id)
)
row = (await db_session.execute(stmt)).first()
if ticket is None:
log.error("Ticket %s not found in DB", ticket_id)
if row is None:
log.error("Ticket %s (or related Seat/Tournament) not found in DB", ticket_id)
return
ticket, seat, tournament = row
if ticket.pdf_url:
log.info("Ticket %s already has a PDF, skipping (idempotency guard)", ticket_id)
return
# Format event date: "DD.MM.YYYY HH:MM"
date_str = tournament.event_date.strftime("%d.%m.%Y %H:%M")
log.info("Generating PDF for ticket %s", ticket_id)
pdf_bytes = generate_qr_ticket(
ticket_id=ticket.id,
user_id=ticket.user_id or 0,
seat_id=ticket.seat_id,
title=tournament.title,
date_str=date_str,
sector=seat.sector,
row=seat.row,
number=seat.number,
price=seat.price,
)
object_name = f"tickets/ticket_{ticket_id}.pdf"