39 lines
1.4 KiB
Python
39 lines
1.4 KiB
Python
|
|
"""
|
||
|
|
Felles feiloversettelse: Postgres-constraint-brudd -> rene HTTP-feil.
|
||
|
|
|
||
|
|
Mønsteret (unik nøkkel, fremmednøkkel, CHECK) gjentar seg på tvers av routerne
|
||
|
|
(lag-navn, roster, sesjons-rekkefølge, lås). Meldingene er generiske og lekker
|
||
|
|
aldri rå Postgres-tekst (constraint-/tabellnavn) til klienten.
|
||
|
|
"""
|
||
|
|
|
||
|
|
from contextlib import asynccontextmanager
|
||
|
|
|
||
|
|
import asyncpg
|
||
|
|
from fastapi import HTTPException, status
|
||
|
|
|
||
|
|
|
||
|
|
# async (ikke bare @contextmanager) slik at den kan stå i samme
|
||
|
|
# "async with org_connection(...) as conn, translate_db_errors():"-setning som
|
||
|
|
# org_connection — Python krever at ALLE ledd i én async with er async
|
||
|
|
# context managers. Kroppen selv gjør ingenting async, den bare venter på at
|
||
|
|
# koden inni with-blokken (som awaiter) kaster.
|
||
|
|
@asynccontextmanager
|
||
|
|
async def translate_db_errors():
|
||
|
|
try:
|
||
|
|
yield
|
||
|
|
except asyncpg.UniqueViolationError as e:
|
||
|
|
raise HTTPException(
|
||
|
|
status_code=status.HTTP_409_CONFLICT,
|
||
|
|
detail="Raden finnes allerede (dupliserer noe som skal være unikt).",
|
||
|
|
) from e
|
||
|
|
except asyncpg.ForeignKeyViolationError as e:
|
||
|
|
raise HTTPException(
|
||
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
||
|
|
detail="Refererer til noe som ikke finnes.",
|
||
|
|
) from e
|
||
|
|
except asyncpg.CheckViolationError as e:
|
||
|
|
raise HTTPException(
|
||
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
||
|
|
detail="Verdien bryter en regel for feltet.",
|
||
|
|
) from e
|