feat(sse): sync temps réel multi-appareils via Server-Sent Events v0.5.8

- Broadcaster asyncio.Queue avec keepalive 25s (prévient timeout proxy)
- Endpoint GET /api/events/stream (StreamingResponse text/event-stream)
- Broadcast notes_changed / todos_changed / shopping_changed sur toutes mutations
- Hook useServerEvents: EventSource avec reconnexion automatique (3s)
- Pages Notes, Todos, Shopping abonnées aux événements SSE
- nginx: location SSE dédiée (proxy_buffering off, timeout 24h)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-25 20:12:02 +02:00
parent 2129da4f55
commit ec87bc091d
12 changed files with 123 additions and 2 deletions
+5
View File
@@ -5,6 +5,7 @@ from fastapi.responses import Response
from sqlalchemy import select, and_
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.broadcaster import broadcaster
from app.core.database import get_session
from app.models.todos import TodoItem
from app.schemas.todos import TodoCreate, TodoUpdate, PostponeRequest, TodoResponse
@@ -55,6 +56,7 @@ async def create_todo(
session.add(item)
await session.commit()
await session.refresh(item)
broadcaster.broadcast("todos_changed")
return item
@@ -74,6 +76,7 @@ async def update_todo(
await session.commit()
await session.refresh(item)
broadcaster.broadcast("todos_changed")
return item
@@ -87,6 +90,7 @@ async def delete_todo(
raise HTTPException(status_code=404, detail="Tâche introuvable")
await session.delete(item)
await session.commit()
broadcaster.broadcast("todos_changed")
return Response(status_code=204)
@@ -108,4 +112,5 @@ async def postpone_todo(
await session.commit()
await session.refresh(item)
broadcaster.broadcast("todos_changed")
return item