- unify typed API errors across draft, pricing and publish flows - add stale draft and publish-state mutation guards - add publish readiness contract and guarded publish flow - add sellability reason codes to test seat preview - add pricing diagnostics and strengthen snapshot/publish lifecycle consistency
42 lines
792 B
Python
42 lines
792 B
Python
from __future__ import annotations
|
|
|
|
from fastapi import HTTPException, status
|
|
|
|
|
|
def raise_conflict(
|
|
*,
|
|
code: str,
|
|
message: str,
|
|
details: dict | None = None,
|
|
) -> None:
|
|
payload: dict = {
|
|
"code": code,
|
|
"message": message,
|
|
}
|
|
if details is not None:
|
|
payload["details"] = details
|
|
|
|
raise HTTPException(
|
|
status_code=status.HTTP_409_CONFLICT,
|
|
detail=payload,
|
|
)
|
|
|
|
|
|
def raise_unprocessable(
|
|
*,
|
|
code: str,
|
|
message: str,
|
|
details: dict | None = None,
|
|
) -> None:
|
|
payload: dict = {
|
|
"code": code,
|
|
"message": message,
|
|
}
|
|
if details is not None:
|
|
payload.update(details)
|
|
|
|
raise HTTPException(
|
|
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
|
detail=payload,
|
|
)
|