""" 审计日志 API 接口 仅管理员可访问 """ from typing import List, Optional from uuid import UUID from datetime import datetime from fastapi import APIRouter, Depends, Query from app.domain.schemas.audit import AuditLogResponse from app.infra.repositories.audit_repository import AuditRepository from app.auth.metadata_dependencies import ( get_current_metadata_admin, get_current_metadata_user, ) from app.infra.db.metadata.database import get_metadata_session from sqlalchemy.ext.asyncio import AsyncSession router = APIRouter() async def get_audit_repository( session: AsyncSession = Depends(get_metadata_session), ) -> AuditRepository: """获取审计日志仓储""" return AuditRepository(session) @router.get("/logs", response_model=List[AuditLogResponse]) async def get_audit_logs( user_id: Optional[UUID] = Query(None, description="按用户ID过滤"), project_id: Optional[UUID] = Query(None, description="按项目ID过滤"), action: Optional[str] = Query(None, description="按操作类型过滤"), resource_type: Optional[str] = Query(None, description="按资源类型过滤"), start_time: Optional[datetime] = Query(None, description="开始时间"), end_time: Optional[datetime] = Query(None, description="结束时间"), skip: int = Query(0, ge=0, description="跳过记录数"), limit: int = Query(100, ge=1, le=1000, description="限制记录数"), current_user=Depends(get_current_metadata_admin), audit_repo: AuditRepository = Depends(get_audit_repository), ) -> List[AuditLogResponse]: """ 查询审计日志(仅管理员) 支持按用户、时间、操作类型等条件过滤 """ logs = await audit_repo.get_logs( user_id=user_id, project_id=project_id, action=action, resource_type=resource_type, start_time=start_time, end_time=end_time, skip=skip, limit=limit ) return logs @router.get("/logs/count") async def get_audit_logs_count( user_id: Optional[UUID] = Query(None, description="按用户ID过滤"), project_id: Optional[UUID] = Query(None, description="按项目ID过滤"), action: Optional[str] = Query(None, description="按操作类型过滤"), resource_type: Optional[str] = Query(None, description="按资源类型过滤"), start_time: Optional[datetime] = Query(None, description="开始时间"), end_time: Optional[datetime] = Query(None, description="结束时间"), current_user=Depends(get_current_metadata_admin), audit_repo: AuditRepository = Depends(get_audit_repository), ) -> dict: """ 获取审计日志总数(仅管理员) """ count = await audit_repo.get_log_count( user_id=user_id, project_id=project_id, action=action, resource_type=resource_type, start_time=start_time, end_time=end_time ) return {"count": count} @router.get("/logs/my", response_model=List[AuditLogResponse]) async def get_my_audit_logs( action: Optional[str] = Query(None, description="按操作类型过滤"), start_time: Optional[datetime] = Query(None, description="开始时间"), end_time: Optional[datetime] = Query(None, description="结束时间"), skip: int = Query(0, ge=0), limit: int = Query(100, ge=1, le=1000), current_user=Depends(get_current_metadata_user), audit_repo: AuditRepository = Depends(get_audit_repository), ) -> List[AuditLogResponse]: """ 查询当前用户的审计日志 普通用户只能查看自己的操作记录 """ logs = await audit_repo.get_logs( user_id=current_user.id, action=action, start_time=start_time, end_time=end_time, skip=skip, limit=limit ) return logs