from dataclasses import asdict from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from api.database import get_session from api.schemas.identifier_migration import ( SealedProjectionRepairReceiptRead, SealedProjectionRepairSubmit, ) from api.services.work_record_identifier_migration import ( IdentifierMigrationError, repair_absent_prederivation_projection, ) router = APIRouter(prefix="/identifier-migrations", tags=["identifier-migrations"]) @router.post( "/sealed-projection-repairs", response_model=SealedProjectionRepairReceiptRead, ) async def repair_sealed_projection( body: SealedProjectionRepairSubmit, session: AsyncSession = Depends(get_session), ) -> dict: """Restore one exact pre-derivation workplan unit into an absent projection.""" try: receipt = await repair_absent_prederivation_projection( session, body.plan, body.repo_slug, body.unit, expected_plan_sha256=body.expected_plan_sha256, source_revision=body.source_revision, source_fingerprint=body.source_fingerprint, source_clean=body.source_clean, source_synchronized=body.source_synchronized, primary_confirmed=body.primary_confirmed, projection_identity=body.projection_identity, ) except IdentifierMigrationError as exc: raise HTTPException(status_code=409, detail=str(exc)) from exc return asdict(receipt)