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.
72 lines
2.1 KiB
Python
72 lines
2.1 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
from fastapi import APIRouter, Depends
|
|
from sqlalchemy.orm import Session
|
|
|
|
from iti.auth import require_service
|
|
from iti.db import get_db
|
|
from iti.responses import ok
|
|
|
|
from iti_system.enums import LogType
|
|
from iti_system.models import SysLog
|
|
from iti_system.schemas import AuditEventsIn
|
|
|
|
|
|
router = APIRouter(
|
|
prefix="/internal/audit",
|
|
tags=["system.audit"],
|
|
dependencies=[Depends(require_service())],
|
|
)
|
|
|
|
|
|
@router.post("/events")
|
|
def create_audit_events(payload: AuditEventsIn, db: Session = Depends(get_db)):
|
|
for event in payload.events:
|
|
db.add(_to_log(event))
|
|
db.commit()
|
|
return ok({"count": len(payload.events)})
|
|
|
|
|
|
@router.post("/login")
|
|
def create_login_event(payload: AuditEventsIn, db: Session = Depends(get_db)):
|
|
for event in payload.events:
|
|
db.add(_to_log(event, log_type=LogType.AUTH.value))
|
|
db.commit()
|
|
return ok({"count": len(payload.events)})
|
|
|
|
|
|
@router.post("/operation")
|
|
def create_operation_event(payload: AuditEventsIn, db: Session = Depends(get_db)):
|
|
for event in payload.events:
|
|
db.add(_to_log(event, log_type=LogType.OPERATION.value))
|
|
db.commit()
|
|
return ok({"count": len(payload.events)})
|
|
|
|
|
|
def _to_log(event, *, log_type: str | None = None) -> SysLog:
|
|
desc_parts = []
|
|
if event.desc:
|
|
desc_parts.append(event.desc)
|
|
if event.target_type or event.target_id:
|
|
desc_parts.append(f"target={event.target_type or '-'}:{event.target_id or '-'}")
|
|
if event.diff:
|
|
desc_parts.append(f"diff={json.dumps(event.diff, ensure_ascii=False, default=str)}")
|
|
return SysLog(
|
|
name=event.title,
|
|
method=event.method,
|
|
user_id=event.actor_id,
|
|
path=event.path,
|
|
ip=event.ip,
|
|
user_agent=event.user_agent,
|
|
body_params=json.dumps(event.diff, ensure_ascii=False, default=str)
|
|
if event.diff
|
|
else None,
|
|
response=None,
|
|
exception=event.error,
|
|
success=event.success,
|
|
desc="\n".join(desc_parts) if desc_parts else None,
|
|
type=log_type or event.type,
|
|
)
|