feat(backend): add publish readiness contract and guarded publish flow
add backend readiness contract for publish prechecks guard publish flow with explicit validation and version-aware checks make publish behavior more predictable for clients and safer against stale state
This commit is contained in:
@@ -3,40 +3,29 @@ from __future__ import annotations
|
||||
from fastapi import HTTPException, status
|
||||
|
||||
|
||||
def build_error_detail(
|
||||
*,
|
||||
code: str,
|
||||
message: str,
|
||||
details: dict | None = None,
|
||||
) -> dict:
|
||||
payload = {
|
||||
def raise_conflict(*, code: str, message: str, details: dict | None = None) -> None:
|
||||
payload: dict = {
|
||||
"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),
|
||||
detail=payload,
|
||||
)
|
||||
|
||||
|
||||
def raise_unprocessable(
|
||||
*,
|
||||
code: str,
|
||||
message: str,
|
||||
details: dict | None = None,
|
||||
) -> None:
|
||||
def raise_unprocessable(*, code: str, message: str, details: dict | None = None) -> None:
|
||||
payload: dict = {
|
||||
"code": code,
|
||||
"message": message,
|
||||
}
|
||||
if details:
|
||||
payload["details"] = details
|
||||
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
||||
detail=build_error_detail(code=code, message=message, details=details),
|
||||
detail=payload,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user