87 lines
3.0 KiB
Python
87 lines
3.0 KiB
Python
from fastapi import APIRouter, Depends, Query
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.database import get_db
|
|
from app.models.db_models import FilterLog
|
|
|
|
router = APIRouter(prefix="/api/logs", tags=["logs"])
|
|
|
|
|
|
@router.get("/")
|
|
def get_logs(
|
|
account_id: int | None = None,
|
|
level: str | None = None,
|
|
search: str | None = None,
|
|
search_subject: str | None = None,
|
|
search_from: str | None = None,
|
|
search_rule: str | None = None,
|
|
search_message: str | None = None,
|
|
search_details: str | None = None,
|
|
search_folder: str | None = None,
|
|
limit: int = Query(default=100, le=500),
|
|
offset: int = 0,
|
|
db: Session = Depends(get_db),
|
|
):
|
|
query = db.query(FilterLog).order_by(FilterLog.created_at.desc())
|
|
if account_id:
|
|
query = query.filter(FilterLog.account_id == account_id)
|
|
if level:
|
|
query = query.filter(FilterLog.level == level)
|
|
# Einfache Suche (ODER über alle Felder)
|
|
if search:
|
|
term = f"%{search}%"
|
|
query = query.filter(
|
|
FilterLog.message.ilike(term)
|
|
| FilterLog.mail_subject.ilike(term)
|
|
| FilterLog.mail_from.ilike(term)
|
|
| FilterLog.rule_name.ilike(term)
|
|
| FilterLog.details.ilike(term)
|
|
| FilterLog.folder.ilike(term)
|
|
)
|
|
# Erweiterte Suche (UND pro Feld)
|
|
if search_subject:
|
|
query = query.filter(FilterLog.mail_subject.ilike(f"%{search_subject}%"))
|
|
if search_from:
|
|
query = query.filter(FilterLog.mail_from.ilike(f"%{search_from}%"))
|
|
if search_rule:
|
|
query = query.filter(FilterLog.rule_name.ilike(f"%{search_rule}%"))
|
|
if search_message:
|
|
query = query.filter(FilterLog.message.ilike(f"%{search_message}%"))
|
|
if search_details:
|
|
query = query.filter(FilterLog.details.ilike(f"%{search_details}%"))
|
|
if search_folder:
|
|
query = query.filter(FilterLog.folder.ilike(f"%{search_folder}%"))
|
|
total = query.count()
|
|
logs = query.offset(offset).limit(limit).all()
|
|
return {
|
|
"total": total,
|
|
"logs": [
|
|
{
|
|
"id": log.id,
|
|
"account_id": log.account_id,
|
|
"account_name": log.account_name,
|
|
"level": log.level.value if log.level else "info",
|
|
"message": log.message,
|
|
"rule_name": log.rule_name,
|
|
"action_type": log.action_type,
|
|
"mail_uid": log.mail_uid,
|
|
"mail_subject": log.mail_subject,
|
|
"mail_from": log.mail_from,
|
|
"folder": log.folder,
|
|
"details": log.details,
|
|
"created_at": log.created_at.isoformat() if log.created_at else None,
|
|
}
|
|
for log in logs
|
|
],
|
|
}
|
|
|
|
|
|
@router.delete("/")
|
|
def clear_logs(account_id: int | None = None, db: Session = Depends(get_db)):
|
|
query = db.query(FilterLog)
|
|
if account_id:
|
|
query = query.filter(FilterLog.account_id == account_id)
|
|
count = query.delete()
|
|
db.commit()
|
|
return {"deleted": count}
|