IIIF-Studio / backend /app /api /v1 /manuscripts.py
Claude
feat(schemas): IIIF-native Sprint 1 — schema evolution for streaming architecture
1865b8a unverified
Raw
History Blame Contribute Delete
1.49 kB
"""
Endpoints pour les manuscrits (R10 — préfixe /api/v1/).
GET /api/v1/manuscripts/{manuscript_id}/pages
"""
# 2. third-party
from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel, ConfigDict
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
# 3. local
from app.models.corpus import ManuscriptModel, PageModel
from app.models.database import get_db
router = APIRouter(prefix="/manuscripts", tags=["manuscripts"])
class PageResponse(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: str
manuscript_id: str
folio_label: str
sequence: int
image_master_path: str | None
iiif_service_url: str | None = None
canvas_width: int | None = None
canvas_height: int | None = None
manifest_url: str | None = None
processing_status: str
confidence_summary: float | None
@router.get("/{manuscript_id}/pages", response_model=list[PageResponse])
async def list_pages(
manuscript_id: str, db: AsyncSession = Depends(get_db)
) -> list[PageModel]:
"""Retourne toutes les pages d'un manuscrit, triées par séquence."""
ms = await db.get(ManuscriptModel, manuscript_id)
if ms is None:
raise HTTPException(status_code=404, detail="Manuscrit introuvable")
result = await db.execute(
select(PageModel)
.where(PageModel.manuscript_id == manuscript_id)
.order_by(PageModel.sequence)
)
return list(result.scalars().all())