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,15 +1,12 @@
from __future__ import annotations
from pydantic import BaseModel
class PublishReadinessValidationSummary(BaseModel):
sectors_count: int
groups_count: int
seats_count: int
priced_seats_count: int
unpriced_seats_count: int
duplicate_seat_ids_count: int
seats_with_missing_contract_count: int
is_publishable: bool
class PublishReadinessSnapshot(BaseModel):
available: bool
categories_count: int
rules_count: int
class PublishReadinessPricingCoverage(BaseModel):
@@ -19,12 +16,6 @@ class PublishReadinessPricingCoverage(BaseModel):
coverage_percent: float
class PublishReadinessSnapshot(BaseModel):
available: bool
categories_count: int
rules_count: int
class PublishReadinessFlags(BaseModel):
validation_publishable: bool
snapshot_available: bool
@@ -38,17 +29,17 @@ class PublishReadinessResponse(BaseModel):
scheme_id: str
scheme_version_id: str
status: str
validation_summary: PublishReadinessValidationSummary
validation_summary: dict
pricing_coverage: PublishReadinessPricingCoverage
snapshot: PublishReadinessSnapshot
readiness: PublishReadinessFlags
class SchemePublishActionResponse(BaseModel):
class PublishExecutionResponse(BaseModel):
scheme_id: str
scheme_version_id: str
status: str
current_version_number: int
published_at: str | None
pricing_snapshot: dict
validation_summary: PublishReadinessValidationSummary
validation_summary: dict