import json from datetime import datetime, timezone from typing import Optional, Dict, Any from sqlalchemy.ext.asyncio import AsyncSession from app.models.models import EventLog from app.ws.manager import ws_manager async def log_event( db: AsyncSession, event_type: str, message: str, severity: str = "INFO", client_id: Optional[int] = None, job_id: Optional[int] = None, user_email: Optional[str] = None, ip_address: Optional[str] = None, details: Optional[Dict[str, Any]] = None ) -> EventLog: """Records an audit event in the database and broadcasts it over WebSockets.""" details_str = json.dumps(details, default=str) if details else None event = EventLog( timestamp=datetime.now(timezone.utc), event_type=event_type, severity=severity, client_id=client_id, job_id=job_id, user_email=user_email, ip_address=ip_address, message=message, details_json=details_str ) db.add(event) await db.commit() await db.refresh(event) # Broadcast real-time event to all Web UI connections await ws_manager.broadcast("EVENT_LOG", { "id": event.id, "timestamp": event.timestamp.isoformat(), "event_type": event.event_type, "severity": event.severity, "client_id": event.client_id, "job_id": event.job_id, "message": event.message }) return event