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.
53 lines
1.8 KiB
Python
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
|