49 lines
1.4 KiB
Python
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
|