diff --git a/apps/api/app/media_catalog.py b/apps/api/app/media_catalog.py index 7b6a603..88a416f 100644 --- a/apps/api/app/media_catalog.py +++ b/apps/api/app/media_catalog.py @@ -91,7 +91,7 @@ def published_file(digest: str) -> tuple[Path, str] | None: return target, str(media_type or "application/octet-stream") -def review_assets(entity_type: str | None = None, status: str | None = None) -> list[dict]: +def review_assets(entity_type: str | None = None, status: str | None = None, media_role: str | None = None) -> list[dict]: manifest = json.loads((MEDIA_ROOT / "manifest.json").read_text(encoding="utf-8")) result = [] for item in manifest.get("assets", []): @@ -100,6 +100,8 @@ def review_assets(entity_type: str | None = None, status: str | None = None) -> continue if entity_type and item.get("entity_type") != entity_type: continue + if media_role and item.get("media_role") != media_role: + continue digest = str(item.get("sha256") or "") if len(digest) != 64 or not item.get("local_path"): continue diff --git a/apps/api/app/routers/admin.py b/apps/api/app/routers/admin.py index 734893c..fe556b5 100644 --- a/apps/api/app/routers/admin.py +++ b/apps/api/app/routers/admin.py @@ -17,7 +17,7 @@ from ..dependencies import Db from ..importer import ImportAlreadyRunning, ImportSourceError, import_records from rf4_research.media_assets import publish_quality_upgrades, rollback_quality_upgrade -from ..media_catalog import MEDIA_ROOT, review_assets, review_file +from ..media_catalog import KNOWN_MEDIA_ROLES, MEDIA_ROOT, review_assets, review_file from ..models import CatchReport, CommunityImportRun, DataSource, ExternalObservation, Fish, ModerationEvent, ModerationStatus, OfficialRecordImport, SourceType, Waterbody from ..public_cache import public_cache from ..schemas import AdminCatchReportOut, AdminMediaDecision, AdminMediaReviewOut, AdminMediaRollback, AdminModerationHistoryOut, AdminSourceStatusOut, CatchReportCreated, ExternalAliasSuggestionOut, ExternalObservationAction, ExternalObservationBulkAction, ExternalObservationBulkDecision, ExternalObservationBulkMapping, ExternalObservationBulkResult, ExternalObservationDecision, ExternalObservationMapping, ExternalObservationOut, ExternalObservationPublished, ImportRunOut, ModerationBulkResult, ModerationBulkUpdate, ModerationUpdate @@ -37,10 +37,13 @@ def admin_media_catalog( _: Annotated[str, Depends(_admin)], entity_type: str | None = Query(None, pattern="^(fish|waterbody|tackle|reference)$"), status: str | None = Query(None, pattern="^(approved|upgrade_queued|upgrade_stored)$"), + media_role: str | None = Query(None, pattern="^(waterbody_cover|waterbody_map|waterbody_depth_map|waterbody_screenshot|tackle_card|tackle_detail|rig_diagram|tackle_screenshot)$"), limit: int = Query(50, ge=1, le=100), offset: int = Query(0, ge=0), ) -> list[AdminMediaReviewOut]: - return review_assets(entity_type, status)[offset:offset + limit] + if media_role and media_role not in KNOWN_MEDIA_ROLES: + raise HTTPException(status_code=422, detail="unknown media role") + return review_assets(entity_type, status, media_role)[offset:offset + limit] @router.get("/api/v1/admin/media/assets/{digest}", response_class=FileResponse)