from __future__ import annotations import logging from typing import Any 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 = logging.getLogger(__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=message, request_id=request_id or get_request_id(), trace_id=trace_id, user_id=user_id, category=category, context=context or {}, ) ) await session.commit() except Exception: logger.exception("Failed to persist system log event=%s source=%s", event, 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=details or {}, ) ) await session.commit() except Exception: logger.exception("Failed to persist audit log action=%s", action)