from __future__ import annotations from typing import Any from app.core.logging import get_logger, sanitize_log_value from app.core.request_context import get_request_id from app.db.session import async_session_factory from app.models.system_log import AuditLog, SystemLog logger = get_logger(__name__) async def record_system_log( *, source: str, level: str, message: str, service: str | None = None, module: str | None = None, event: str | None = None, request_id: str | None = None, trace_id: str | None = None, user_id: int | None = None, category: str | None = None, context: dict[str, Any] | None = None, ) -> None: try: async with async_session_factory() as session: session.add( SystemLog( source=source, service=service, module=module, event=event, level=level.lower(), message=str(sanitize_log_value(message)), request_id=request_id or get_request_id(), trace_id=trace_id, user_id=user_id, category=category, context=sanitize_log_value(context or {}), ) ) await session.commit() except Exception: logger.exception_event( "Failed to persist system log", event="system_log.persist.failed", context={"event_name": event, "source": source}, ) async def record_audit_log( *, action: str, actor_id: int | None = None, actor_name: str | None = None, target_type: str | None = None, target_id: str | None = None, result: str | None = None, request_id: str | None = None, ip: str | None = None, details: dict[str, Any] | None = None, ) -> None: try: async with async_session_factory() as session: session.add( AuditLog( actor_id=actor_id, actor_name=actor_name, action=action, target_type=target_type, target_id=target_id, result=result, request_id=request_id or get_request_id(), ip=ip, details=sanitize_log_value(details or {}), ) ) await session.commit() except Exception: logger.exception_event( "Failed to persist audit log", event="audit_log.persist.failed", context={"action": action}, )