Files
Document_editor/backend/app/services/audit.py

42 lines
1.0 KiB
Python

import json
from typing import Any
from fastapi import Request
from sqlalchemy.orm import Session
from app.models.audit_log import AuditLog
from app.models.user import User
def get_client_ip(request: Request | None) -> str | None:
if request is None:
return None
forwarded = request.headers.get("x-forwarded-for")
if forwarded:
return forwarded.split(",")[0].strip()
if request.client:
return request.client.host
return None
def log_action(
db: Session,
action: str,
*,
user: User | None = None,
resource_type: str | None = None,
resource_id: int | None = None,
details: dict[str, Any] | None = None,
ip_address: str | None = None,
) -> None:
entry = AuditLog(
user_id=user.id if user else None,
username=user.username if user else None,
action=action,
resource_type=resource_type,
resource_id=resource_id,
details=json.dumps(details, ensure_ascii=False) if details else None,
ip_address=ip_address,
)
db.add(entry)