Files
photoBooth/backend/api/event_api.py
T
admin 9a006f1457
🚀 Deploy — JH Photomaton / 🔍 Vérification (push) Has been cancelled
🚀 Deploy — JH Photomaton / 🍓 Deploy sur le Pi (push) Has been cancelled
all
2026-07-17 00:44:22 +02:00

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}