"""Audit log viewer endpoint.""" from typing import Optional from fastapi import APIRouter, Depends, Query from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select, func, desc from app.auth.dependencies import require_super_admin from app.database import get_db from app.models.user import HubUser from app.models.audit import AuditLog router = APIRouter(prefix="/api/audit-logs", tags=["audit"]) @router.get("") async def list_audit_logs( school_id: Optional[str] = Query(None), action: Optional[str] = Query(None), page: int = Query(1, ge=1), per_page: int = Query(50), _admin: HubUser = Depends(require_super_admin), db: AsyncSession = Depends(get_db), ): stmt = select(AuditLog).order_by(desc(AuditLog.created_at)) if school_id: stmt = stmt.where(AuditLog.school_id == school_id) if action: stmt = stmt.where(AuditLog.action.ilike(f"%{action}%")) total = (await db.execute(select(func.count()).select_from(stmt.subquery()))).scalar_one() logs = (await db.execute(stmt.offset((page - 1) * per_page).limit(per_page))).scalars().all() return { "items": [ { "id": log.id, "school_id": log.school_id, "actor_email": log.actor_email, "action": log.action, "entity_type": log.entity_type, "entity_id": log.entity_id, "detail": log.detail, "ip_address": log.ip_address, "created_at": log.created_at.isoformat(), } for log in logs ], "total": total, "page": page, "per_page": per_page, }