Auto-mode commit 7aa33cd accidentally deleted 78 files (14,814 lines) during M005
execution. Subsequent commits rebuilt some frontend files but backend/, alembic/,
tests/, whisper/, docker configs, and prompts were never restored in this repo.
This commit restores the full project tree by syncing from ub01's working directory,
which has all M001-M007 features running in production containers.
Restored: backend/ (config, models, routers, database, redis, search_service, worker),
alembic/ (6 migrations), docker/ (Dockerfiles, nginx, compose), prompts/ (4 stages),
tests/, whisper/, README.md, .env.example, chrysopedia-spec.md
36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
"""Source video endpoints for Chrysopedia API."""
|
|
|
|
import logging
|
|
from typing import Annotated
|
|
|
|
from fastapi import APIRouter, Depends, Query
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from database import get_session
|
|
from models import SourceVideo
|
|
from schemas import SourceVideoRead
|
|
|
|
logger = logging.getLogger("chrysopedia.videos")
|
|
|
|
router = APIRouter(prefix="/videos", tags=["videos"])
|
|
|
|
|
|
@router.get("", response_model=list[SourceVideoRead])
|
|
async def list_videos(
|
|
offset: Annotated[int, Query(ge=0)] = 0,
|
|
limit: Annotated[int, Query(ge=1, le=100)] = 50,
|
|
creator_id: str | None = None,
|
|
db: AsyncSession = Depends(get_session),
|
|
) -> list[SourceVideoRead]:
|
|
"""List source videos with optional filtering by creator."""
|
|
stmt = select(SourceVideo).order_by(SourceVideo.created_at.desc())
|
|
|
|
if creator_id:
|
|
stmt = stmt.where(SourceVideo.creator_id == creator_id)
|
|
|
|
stmt = stmt.offset(offset).limit(limit)
|
|
result = await db.execute(stmt)
|
|
videos = result.scalars().all()
|
|
logger.debug("Listed %d videos (offset=%d, limit=%d)", len(videos), offset, limit)
|
|
return [SourceVideoRead.model_validate(v) for v in videos]
|