Files

49 lines
1.4 KiB
Python

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