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

@@ -1,3 +1,5 @@
from __future__ import annotations
from app.repositories.audit import create_audit_event
from app.repositories.scheme_version_pricing import replace_scheme_version_pricing_snapshot
from app.repositories.scheme_versions import get_current_scheme_version
@@ -41,13 +43,20 @@ async def publish_current_draft_scheme(
readiness = await build_publish_readiness(
scheme_id=scheme.scheme_id,
scheme_version_id=version.scheme_version_id,
status=version.status,
)
if not readiness["readiness"]["is_ready_to_publish"]:
raise_conflict(
code="publish_not_ready",
message="Draft scheme does not satisfy publish readiness requirements.",
details={"readiness": readiness["readiness"]},
message="Scheme is not ready to publish in current draft state.",
details={
"scheme_version_id": version.scheme_version_id,
"readiness": readiness["readiness"],
"validation_summary": readiness["validation_summary"],
"pricing_coverage": readiness["pricing_coverage"],
"snapshot": readiness["snapshot"],
},
)
snapshot = await replace_scheme_version_pricing_snapshot(