Files
yu-zhi-ran/platform/backend/app/api/audit.py
T

62 lines
2.3 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, Request, Query
from sqlalchemy.orm import Session
from typing import List, Optional
from datetime import datetime, timedelta
from ..database import get_db
from ..models import AuditLog, User
from ..schemas import AuditLogResponse
from .auth import get_current_admin
router = APIRouter(prefix="/api/audit", tags=["audit"])
@router.get("/logs", response_model=List[AuditLogResponse])
def list_audit_logs(
request: Request,
db: Session = Depends(get_db),
admin_user: User = Depends(get_current_admin),
username: Optional[str] = Query(None, description="按用户名筛选"),
action: Optional[str] = Query(None, description="按操作类型筛选"),
resource_type: Optional[str] = Query(None, description="按资源类型筛选"),
start_date: Optional[datetime] = Query(None, description="开始时间"),
end_date: Optional[datetime] = Query(None, description="结束时间"),
limit: int = Query(100, ge=1, le=1000, description="返回数量限制")
):
"""查询审计日志(管理员)"""
query = db.query(AuditLog)
if username:
query = query.filter(AuditLog.username == username)
if action:
query = query.filter(AuditLog.action == action)
if resource_type:
query = query.filter(AuditLog.resource_type == resource_type)
if start_date:
query = query.filter(AuditLog.created_at >= start_date)
if end_date:
query = query.filter(AuditLog.created_at <= end_date)
logs = query.order_by(AuditLog.created_at.desc()).limit(limit).all()
return logs
@router.get("/logs/actions")
def list_audit_actions(
request: Request,
db: Session = Depends(get_db),
admin_user: bool = Depends(get_current_admin)
):
"""获取所有已记录的操作类型列表(用于筛选)"""
actions = db.query(AuditLog.action).distinct().all()
return [a[0] for a in actions if a[0]]
@router.get("/logs/users")
def list_audit_users(
request: Request,
db: Session = Depends(get_db),
admin_user: User = Depends(get_current_admin),
limit: int = Query(50, ge=1, le=200)
):
"""获取最近产生审计记录的用户列表"""
users = db.query(AuditLog.username).distinct().order_by(AuditLog.created_at.desc()).limit(limit).all()
return [u[0] for u in users if u[0]]