"""GET /api/v1/events — единый журнал ивентов (генерация в app/events.py
и точках генерации: ingest, services_probe, offline-loop). Журнал читают
UI и будущие потребители; в Synapse ивенты уходят автоматически.
"""
from fastapi import APIRouter, Depends, Query
from app.db import get_db
from app.security import require_admin
router = APIRouter(prefix="/api/v1", dependencies=[Depends(require_admin)])
@router.get("/events")
async def list_events(limit: int = Query(default=100, ge=1, le=1000)) -> list[dict]:
"Свежие ивенты по убыванию (все серверы)."
db = get_db()
cursor = await db.execute(
"""SELECT e.id, e.server_id, e.type, e.severity, e.message, e.data_json, e.ts,
s.name AS server_name
FROM events e LEFT JOIN servers s ON s.id = e.server_id
ORDER BY e.id DESC LIMIT ?""",
(limit,),
)
rows = await cursor.fetchall()
import json as _json
return [
{
"id": row["id"],
"server_id": row["server_id"],
"server_name": row["server_name"],
"type": row["type"],
"severity": row["severity"],
"message": row["message"],
"data": _json.loads(row["data_json"]),
"ts": row["ts"],
}
for row in rows
]