from fastapi import APIRouter, Depends, Query from sqlalchemy.ext.asyncio import AsyncSession from pydantic import BaseModel from typing import Optional from app.database import get_db from app.models.user import User from app.routers.auth import get_current_user from app.services.log_service import LogService router = APIRouter(prefix="/api/logs", tags=["Log"]) class LogOut(BaseModel): id: str level: str type: str user_id: Optional[str] message: str source: Optional[str] details: Optional[str] duration_ms: Optional[str] created_at: str updated_at: str model_config = {"from_attributes": True} class LogStatsOut(BaseModel): total: int by_type: dict by_level: dict class LogQueryOut(BaseModel): logs: list[LogOut] total: int page: int page_size: int @router.get("", response_model=LogQueryOut) async def list_logs( log_type: Optional[str] = Query(None, description="日志类型: agent/system/chat"), level: Optional[str] = Query(None, description="日志级别: debug/info/warning/error"), source: Optional[str] = Query(None, description="来源模块"), page: int = Query(1, ge=1), page_size: int = Query(50, ge=1, le=200), current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): """查询日志列表""" svc = LogService(db) offset = (page - 1) * page_size logs, total = await svc.list_logs( log_type=log_type, level=level, user_id=current_user.id, source=source, limit=page_size, offset=offset, ) return LogQueryOut( logs=[LogOut.model_validate(log) for log in logs], total=total, page=page, page_size=page_size, ) @router.get("/stats", response_model=LogStatsOut) async def get_log_stats( hours: int = Query(24, ge=1, le=168), current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): """获取日志统计""" svc = LogService(db) stats = await svc.get_log_stats(hours=hours) return LogStatsOut(**stats) @router.get("/recent", response_model=list[LogOut]) async def get_recent_logs( log_type: Optional[str] = Query(None), hours: int = Query(24, ge=1, le=168), limit: int = Query(50, ge=1, le=200), current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): """获取最近的日志""" svc = LogService(db) logs = await svc.get_recent_logs(log_type=log_type, hours=hours, limit=limit) return [LogOut.model_validate(log) for log in logs]