feat(backend): add stale draft guards and reference validation for draft mutations

add stale draft protection for mutation flows

validate referenced entities before applying draft changes
reduce invalid draft writes caused by stale state and broken references

keep mutation behavior explicit and version-aware
This commit is contained in:
greebo
2026-03-19 19:25:44 +03:00
parent fbeac890be
commit 62550d5cb5
3 changed files with 233 additions and 37 deletions

View File

@@ -47,9 +47,11 @@ from app.schemas.editor import (
from app.security.auth import require_api_key
from app.services.draft_guard import get_current_draft_context
from app.services.editor_validation import (
validate_bulk_seat_patch_references,
validate_bulk_seat_patch_uniqueness,
validate_group_patch_uniqueness,
validate_sector_patch_uniqueness,
validate_single_seat_patch_references,
validate_single_seat_patch_uniqueness,
)
from app.services.structure_diff import build_structure_diff
@@ -318,6 +320,11 @@ async def patch_draft_seat(
seat_record_id=seat_record_id,
new_seat_id=payload.seat_id,
)
await validate_single_seat_patch_references(
scheme_version_id=version.scheme_version_id,
sector_id=payload.sector_id,
group_id=payload.group_id,
)
row = await update_scheme_version_seat_by_record_id(
scheme_version_id=version.scheme_version_id,
@@ -373,6 +380,10 @@ async def bulk_patch_draft_seats(
scheme_version_id=version.scheme_version_id,
items=items,
)
await validate_bulk_seat_patch_references(
scheme_version_id=version.scheme_version_id,
items=items,
)
rows = await bulk_update_scheme_version_seats_by_record_id(
scheme_version_id=version.scheme_version_id,