32 lines
1.1 KiB
Python
32 lines
1.1 KiB
Python
"""Audit log endpoint."""
|
|
|
|
from fastapi import APIRouter, Depends, Query
|
|
from sqlmodel import Session, select, col
|
|
|
|
from ten31portal.auth import require_audit_reader
|
|
from ten31portal.database import get_session
|
|
from ten31portal.models import AuditLog, User
|
|
from ten31portal.schemas import AuditLogResponse
|
|
|
|
router = APIRouter(prefix="/api/audit", tags=["audit"])
|
|
|
|
|
|
@router.get("")
|
|
def list_audit(
|
|
object_type: str | None = None,
|
|
object_id: int | None = None,
|
|
page: int = Query(default=1, ge=1),
|
|
per_page: int = Query(default=50, ge=1, le=200),
|
|
user: User = Depends(require_audit_reader),
|
|
session: Session = Depends(get_session),
|
|
) -> list[AuditLogResponse]:
|
|
stmt = select(AuditLog)
|
|
if object_type is not None:
|
|
stmt = stmt.where(AuditLog.object_type == object_type)
|
|
if object_id is not None:
|
|
stmt = stmt.where(AuditLog.object_id == object_id)
|
|
stmt = stmt.order_by(col(AuditLog.id).desc())
|
|
stmt = stmt.offset((page - 1) * per_page).limit(per_page)
|
|
rows = session.exec(stmt).all()
|
|
return [AuditLogResponse.model_validate(r, from_attributes=True) for r in rows]
|