Assistant: codex Assistant-Model: gpt-5.6-sol Assistant-Session: 01a02b7c-1c49-76a0-955a-49e7b3ddfc0d
44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
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)
|