"""Audit log routes (read-only, paginated).""" from fastapi import APIRouter, Depends, Query from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession from app.api.deps import require_admin from app.core.database import get_db from app.models.audit_log import AuditLog from app.models.user import User from app.schemas.audit import AuditLogPage router = APIRouter() @router.get("", response_model=AuditLogPage) async def list_audit_logs( page: int = Query(default=1, ge=1), page_size: int = Query(default=50, ge=1, le=200), action: str | None = None, username: str | None = None, db: AsyncSession = Depends(get_db), _admin: User = Depends(require_admin), ) -> AuditLogPage: stmt = select(AuditLog).order_by(AuditLog.id.desc()) count_stmt = select(func.count(AuditLog.id)) if action: stmt = stmt.where(AuditLog.action == action) count_stmt = count_stmt.where(AuditLog.action == action) if username: stmt = stmt.where(AuditLog.username == username) count_stmt = count_stmt.where(AuditLog.username == username) total = await db.scalar(count_stmt) or 0 stmt = stmt.offset((page - 1) * page_size).limit(page_size) result = await db.execute(stmt) return AuditLogPage( items=list(result.scalars().all()), total=total, page=page, page_size=page_size, )