33 lines
1.2 KiB
Python
33 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, Depends, Query
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.api.v1.schemas import AuditLogItemResponse, AuditLogListResponse
|
|
from app.auth.dependencies import ApiPrincipal, require_scope
|
|
from app.db.models import AuditLog
|
|
from app.db.session import get_session
|
|
|
|
router = APIRouter(prefix="/audit", tags=["audit"])
|
|
|
|
|
|
@router.get("", response_model=AuditLogListResponse)
|
|
def list_audit_log(
|
|
limit: int = Query(default=100, ge=1, le=500),
|
|
offset: int = Query(default=0, ge=0),
|
|
action: str | None = None,
|
|
object_type: str | None = None,
|
|
object_id: str | None = None,
|
|
session: Session = Depends(get_session),
|
|
principal: ApiPrincipal = Depends(require_scope("audit:read")),
|
|
):
|
|
query = session.query(AuditLog).filter(AuditLog.tenant_id == principal.tenant_id)
|
|
if action:
|
|
query = query.filter(AuditLog.action == action)
|
|
if object_type:
|
|
query = query.filter(AuditLog.object_type == object_type)
|
|
if object_id:
|
|
query = query.filter(AuditLog.object_id == object_id)
|
|
items = query.order_by(AuditLog.created_at.desc()).offset(offset).limit(limit).all()
|
|
return AuditLogListResponse(items=[AuditLogItemResponse.model_validate(item) for item in items])
|