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)