You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iTi-System/iti_system/routes/log.py

53 lines
1.8 KiB
Python

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