42 lines
1.0 KiB
Python
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)
|