audit_service.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334
  1. import db
  2. import json
  3. from fastapi import Request
  4. from typing import Optional, Any
  5. class AuditService:
  6. async def log(
  7. self,
  8. user_id: int,
  9. action: str,
  10. target_type: Optional[str] = None,
  11. target_id: Optional[int] = None,
  12. details: Optional[Any] = None,
  13. request: Optional[Request] = None
  14. ):
  15. ip_address = None
  16. if request:
  17. # Try to get real IP if behind proxy
  18. ip_address = request.headers.get("X-Forwarded-For", request.client.host if request.client else None)
  19. details_str = None
  20. if details:
  21. if isinstance(details, (dict, list)):
  22. details_str = json.dumps(details, ensure_ascii=False)
  23. else:
  24. details_str = str(details)
  25. query = """
  26. INSERT INTO audit_logs (user_id, action, target_type, target_id, details, ip_address)
  27. VALUES (%s, %s, %s, %s, %s, %s)
  28. """
  29. db.execute_commit(query, (user_id, action, target_type, target_id, details_str, ip_address))
  30. audit_service = AuditService()