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:
greebo
2026-03-19 20:41:08 +03:00
parent 8d4255181b
commit ac3a62f108
8 changed files with 224 additions and 116 deletions

View File

@@ -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,
)