Merge pull request 'refactor: enhance JSON serialization in AuditLog service' (#156) from fix/company into development
Reviewed-on: ADUANASOFT/anexo76#156
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
"""
|
||||
Audit Log Service
|
||||
"""
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime, timedelta, date, time
|
||||
from decimal import Decimal
|
||||
import uuid
|
||||
import pytz
|
||||
from typing import Optional, List, Dict, Any
|
||||
from sqlalchemy.orm import Session
|
||||
@@ -11,6 +13,29 @@ from core.security import verify_token # keep if needed or simpler just remove i
|
||||
# We don't need security import here anymore as context is passed explicitly or handled by events
|
||||
|
||||
|
||||
def _make_json_safe(obj: Any) -> Any:
|
||||
"""Recursively convert non-JSON-serializable types to serializable equivalents."""
|
||||
if obj is None:
|
||||
return None
|
||||
if isinstance(obj, dict):
|
||||
return {k: _make_json_safe(v) for k, v in obj.items()}
|
||||
if isinstance(obj, (list, tuple)):
|
||||
return [_make_json_safe(v) for v in obj]
|
||||
if isinstance(obj, datetime):
|
||||
return obj.isoformat()
|
||||
if isinstance(obj, date):
|
||||
return obj.isoformat()
|
||||
if isinstance(obj, time):
|
||||
return obj.isoformat()
|
||||
if isinstance(obj, Decimal):
|
||||
return float(obj)
|
||||
if isinstance(obj, uuid.UUID):
|
||||
return str(obj)
|
||||
if isinstance(obj, bytes):
|
||||
return obj.decode("utf-8", errors="replace")
|
||||
return obj
|
||||
|
||||
|
||||
class AuditService:
|
||||
|
||||
@staticmethod
|
||||
@@ -56,8 +81,8 @@ class AuditService:
|
||||
table_name=table_name,
|
||||
record_id=record_id,
|
||||
operation_type=operation_type,
|
||||
old_values=old_values,
|
||||
new_values=new_values,
|
||||
old_values=_make_json_safe(old_values),
|
||||
new_values=_make_json_safe(new_values),
|
||||
changed_fields=changed_fields,
|
||||
ip_address=ip_address,
|
||||
user_agent=user_agent,
|
||||
|
||||
Reference in New Issue
Block a user