100 lines
3.0 KiB
Python
100 lines
3.0 KiB
Python
"""API de gestion des événements et statistiques."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
from datetime import datetime
|
|
|
|
from fastapi import APIRouter, Request
|
|
from pydantic import BaseModel
|
|
|
|
from backend.services.event_service import slugify
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter()
|
|
|
|
|
|
class EventUpdate(BaseModel):
|
|
name: str
|
|
new_event: bool = False # True = archive l'ancien et crée un nouveau
|
|
|
|
|
|
@router.get("/event")
|
|
async def get_current_event(request: Request):
|
|
"""Retourne l'événement en cours avec ses statistiques."""
|
|
cfg = request.app.state.config
|
|
event_svc = request.app.state.event_service
|
|
|
|
ev = cfg.event
|
|
stats = await event_svc.get_stats(ev.slug)
|
|
|
|
return {
|
|
"name": ev.name,
|
|
"slug": ev.slug,
|
|
"started_at": ev.started_at,
|
|
"started_at_iso": (
|
|
datetime.fromtimestamp(ev.started_at).isoformat()
|
|
if ev.started_at
|
|
else None
|
|
),
|
|
"stats": stats,
|
|
}
|
|
|
|
|
|
@router.put("/event")
|
|
async def update_event(request: Request, payload: EventUpdate):
|
|
"""Met à jour l'événement en cours.
|
|
|
|
Si new_event=True : archive le précédent et démarre un nouvel événement
|
|
(les stats repartent de zéro).
|
|
Si new_event=False : renomme l'événement en cours (même slug ou nouveau slug,
|
|
les stats existantes restent sous l'ancien slug).
|
|
"""
|
|
cfg = request.app.state.config
|
|
config_svc = request.app.state.config_service
|
|
event_svc = request.app.state.event_service
|
|
|
|
new_slug = slugify(payload.name)
|
|
now = datetime.now().timestamp()
|
|
|
|
old_slug = cfg.event.slug
|
|
|
|
if payload.new_event and old_slug and old_slug != new_slug:
|
|
# Archive l'ancien événement
|
|
await event_svc.archive_event(old_slug)
|
|
|
|
# Crée ou met à jour la ligne dans la DB
|
|
await event_svc.ensure_event(new_slug, payload.name, now if payload.new_event else cfg.event.started_at or now)
|
|
|
|
# Persiste dans settings.yaml
|
|
started = now if payload.new_event or not cfg.event.started_at else cfg.event.started_at
|
|
config_svc.save_event_config(payload.name, new_slug, started)
|
|
|
|
stats = await event_svc.get_stats(new_slug)
|
|
return {
|
|
"ok": True,
|
|
"name": payload.name,
|
|
"slug": new_slug,
|
|
"started_at": started,
|
|
"new_event": payload.new_event,
|
|
"stats": stats,
|
|
}
|
|
|
|
|
|
@router.get("/event/history")
|
|
async def get_event_history(request: Request):
|
|
"""Retourne tous les événements passés avec leurs statistiques."""
|
|
event_svc = request.app.state.event_service
|
|
history = await event_svc.get_history()
|
|
|
|
# Ajoute les dates ISO pour l'affichage
|
|
for ev in history:
|
|
if ev.get("started_at"):
|
|
ev["started_at_iso"] = datetime.fromtimestamp(ev["started_at"]).strftime("%d/%m/%Y %H:%M")
|
|
if ev.get("ended_at"):
|
|
ev["ended_at_iso"] = datetime.fromtimestamp(ev["ended_at"]).strftime("%d/%m/%Y %H:%M")
|
|
else:
|
|
ev["ended_at_iso"] = None
|
|
|
|
return {"events": history}
|