all
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
"""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}
|
||||
Reference in New Issue
Block a user