Files
onever_drive/backend/app/services/event_service.py
T

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