teecup/app/blind_draw.py

42 lines
1.5 KiB
Python
Raw Normal View History

"""
Delte spørringer for blind draw-synlighet (ADR-013).
Finkornet synlighet håndheves i APP-laget, ikke RLS begge lag i en turnering
ligger i samme organisasjon, RLS (som filtrerer organization_id) kan ikke
skille dem fra hverandre. Disse to hjelperne brukes av både
routers/tournaments.py (økt-listing: vise lås-status) og routers/matches.py
(match-listing: filtrere deltakere).
"""
from asyncpg import Connection
async def locked_team_ids(conn: Connection, session_id: str) -> set[str]:
"""Hvilke lag som har låst oppstillingen sin for denne økten."""
rows = await conn.fetch(
"SELECT team_id::text AS team_id FROM lineup_lock WHERE session_id = $1",
session_id,
)
return {r["team_id"] for r in rows}
async def own_team_ids(conn: Connection, tournament_id: str, user_id: str) -> set[str]:
"""Hvilke(t) lag brukeren selv er rostret på i denne turneringen.
Går via player.user_id (nullable) -> team_roster -> team. En org-admin uten
egen player-rad har ingen "eget lag" og får dermed tomt sett her bevisst,
ikke en feil (se matches.py).
"""
rows = await conn.fetch(
"""
SELECT DISTINCT tr.team_id::text AS team_id
FROM team_roster tr
JOIN team t ON t.id = tr.team_id
JOIN player p ON p.id = tr.player_id
WHERE t.tournament_id = $1 AND p.user_id = $2
""",
tournament_id,
user_id,
)
return {r["team_id"] for r in rows}