feat: add GET /api/v1/stats endpoint with technique and creator counts

This commit is contained in:
jlightner 2026-04-03 04:24:58 +00:00
parent b35082602f
commit 9f0b0922b0
2 changed files with 31 additions and 1 deletions

View file

@ -12,7 +12,7 @@ from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from config import get_settings from config import get_settings
from routers import creators, health, ingest, pipeline, reports, search, techniques, topics, videos from routers import creators, health, ingest, pipeline, reports, search, stats, techniques, topics, videos
def _setup_logging() -> None: def _setup_logging() -> None:
@ -83,6 +83,7 @@ app.include_router(ingest.router, prefix="/api/v1")
app.include_router(pipeline.router, prefix="/api/v1") app.include_router(pipeline.router, prefix="/api/v1")
app.include_router(reports.router, prefix="/api/v1") app.include_router(reports.router, prefix="/api/v1")
app.include_router(search.router, prefix="/api/v1") app.include_router(search.router, prefix="/api/v1")
app.include_router(stats.router, prefix="/api/v1")
app.include_router(techniques.router, prefix="/api/v1") app.include_router(techniques.router, prefix="/api/v1")
app.include_router(topics.router, prefix="/api/v1") app.include_router(topics.router, prefix="/api/v1")
app.include_router(videos.router, prefix="/api/v1") app.include_router(videos.router, prefix="/api/v1")

29
backend/routers/stats.py Normal file
View file

@ -0,0 +1,29 @@
"""Public stats endpoints for Chrysopedia."""
import logging
from fastapi import APIRouter, Depends
from sqlalchemy import func, select
from sqlalchemy.ext.asyncio import AsyncSession
from database import get_session
from models import Creator, TechniquePage
logger = logging.getLogger("chrysopedia.stats")
router = APIRouter(tags=["stats"])
@router.get("/stats")
async def get_stats(db: AsyncSession = Depends(get_session)) -> dict:
"""Return aggregate counts for the knowledge base."""
technique_count = await db.scalar(
select(func.count()).select_from(TechniquePage)
)
creator_count = await db.scalar(
select(func.count()).select_from(Creator)
)
return {
"technique_count": technique_count or 0,
"creator_count": creator_count or 0,
}