Newer
Older
hard-panel / panel / backend / app / api / events.py
"""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
    ]