US04-05: Operate Rename Plans in the Browser (#69)
This commit was merged in pull request #69.
This commit is contained in:
@@ -17,6 +17,7 @@ from photo_pipeline.schemas import (
|
||||
)
|
||||
from photo_pipeline.services.albums import AlbumService
|
||||
from photo_pipeline.services.proposals import ConflictError, ProposalError, ProposalService
|
||||
from photo_pipeline.services.rename_journal import RenameJournal
|
||||
|
||||
router = APIRouter(tags=["albums"])
|
||||
|
||||
@@ -37,6 +38,22 @@ def _error(status: int, code: str, message: str) -> JSONResponse:
|
||||
return JSONResponse(status_code=status, content={"error": {"code": code, "message": message}})
|
||||
|
||||
|
||||
def _unresolved_rename(request: Request) -> JSONResponse | None:
|
||||
"""Refuse work that feeds renaming while the library may be half-renamed.
|
||||
|
||||
An unresolved rename means some folder paths on disk disagree with the database,
|
||||
so evidence gathered now — and any approval based on it — could describe a
|
||||
location that no longer exists. Reading stays available; only mutation stops.
|
||||
"""
|
||||
if RenameJournal(request.app.state.session_factory).blocks_mutation():
|
||||
return _error(
|
||||
409,
|
||||
"rename_recovery_required",
|
||||
"an unresolved rename is in progress; resolve it before changing album names",
|
||||
)
|
||||
return None
|
||||
|
||||
|
||||
@router.get("/albums/evidence")
|
||||
def evidence(
|
||||
request: Request,
|
||||
@@ -47,8 +64,8 @@ def evidence(
|
||||
|
||||
|
||||
@router.post("/albums/proposals")
|
||||
def generate(body: GenerateProposalsRequest, request: Request) -> dict:
|
||||
return _proposals(request).generate(body.albums)
|
||||
def generate(body: GenerateProposalsRequest, request: Request):
|
||||
return _unresolved_rename(request) or _proposals(request).generate(body.albums)
|
||||
|
||||
|
||||
@router.get("/albums/proposals")
|
||||
@@ -76,6 +93,9 @@ def edit_proposal(album: str, body: EditProposalRequest, request: Request):
|
||||
|
||||
@router.post("/albums/proposals/{album:path}/approve")
|
||||
def approve_proposal(album: str, body: ApproveProposalRequest, request: Request):
|
||||
blocked = _unresolved_rename(request)
|
||||
if blocked is not None:
|
||||
return blocked
|
||||
try:
|
||||
return _proposals(request).approve(album, expected_version=body.expected_version)
|
||||
except ConflictError as error:
|
||||
|
||||
Reference in New Issue
Block a user