from __future__ import annotations from fastapi import APIRouter, Depends from sqlalchemy import select from sqlalchemy.orm import Session from iti.auth import require_permission from iti.db import get_db from iti.responses import ok, page from iti_system.models import SysLog from iti_system.schemas import LogQuery from iti_system.services import apply_keyword, dump_log, get_or_404, paginate_query router = APIRouter(prefix="/sys/log", tags=["system.log"]) @router.get("/page", dependencies=[Depends(require_permission("system:log:list"))]) def page_log(query: LogQuery = Depends(), db: Session = Depends(get_db)): result = paginate_query(db, _query_logs(query), page=query.page, size=query.size) return page([dump_log(item) for item in result["items"]], result["page"]) @router.delete("/batch", dependencies=[Depends(require_permission("system:log:delete"))]) def delete_log_batch(ids: str, db: Session = Depends(get_db)): for item_id in [item.strip() for item in ids.split(",") if item.strip()]: item = db.get(SysLog, item_id) if item: db.delete(item) db.commit() return ok() @router.delete("/{id}", dependencies=[Depends(require_permission("system:log:delete"))]) def delete_log(id: str, db: Session = Depends(get_db)): item = get_or_404(db, SysLog, id, "日志不存在") db.delete(item) db.commit() return ok() def _query_logs(query: LogQuery): stmt = select(SysLog).order_by(SysLog.created_at.desc()) stmt = apply_keyword(stmt, query.keyword, SysLog.name, SysLog.path, SysLog.desc) if query.user_id: stmt = stmt.where(SysLog.user_id == query.user_id) if query.type: stmt = stmt.where(SysLog.type == query.type) if query.success is not None: stmt = stmt.where(SysLog.success == query.success) return stmt