add backend readiness contract for publish prechecks add pricing diagnostics to explain publish-blocking conditions make publish decisions more explicit and easier to debug for clients
43 lines
875 B
Python
43 lines
875 B
Python
from __future__ import annotations
|
|
|
|
from fastapi import HTTPException, status
|
|
|
|
|
|
def build_error_detail(
|
|
*,
|
|
code: str,
|
|
message: str,
|
|
details: dict | None = None,
|
|
) -> dict:
|
|
payload = {
|
|
"code": code,
|
|
"message": message,
|
|
}
|
|
if details:
|
|
payload["details"] = details
|
|
return payload
|
|
|
|
|
|
def raise_conflict(
|
|
*,
|
|
code: str,
|
|
message: str,
|
|
details: dict | None = None,
|
|
) -> None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_409_CONFLICT,
|
|
detail=build_error_detail(code=code, message=message, details=details),
|
|
)
|
|
|
|
|
|
def raise_unprocessable(
|
|
*,
|
|
code: str,
|
|
message: str,
|
|
details: dict | None = None,
|
|
) -> None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
|
detail=build_error_detail(code=code, message=message, details=details),
|
|
)
|