#99 — WebSocket-Live-Sync für Einkaufslisten #98
Labels
No labels
priority/could
priority/must
priority/should
priority/wont
status/blocked
status/claimed
status/done-migrated
type/bug
type/feature
type/infra
type/tech-debt
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
robert/todo#98
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Story: WebSocket-Live-Sync für Einkaufslisten
As a Mitglied einer geteilten Einkaufsliste,
I want to Änderungen anderer Mitglieder (neue Mitglieder, umbenannte Liste, gelöschte Liste) live sehen,
ohne manuell neu zu laden,
so that eine geteilte Einkaufsliste sich genauso "live" anfühlt wie eine geteilte Todo-Liste.
Depends on:
#89(führt das Sharing-Modell für Einkaufslisten ein, das dies erst nötig macht).Hintergrund:
#81hat Einkaufslisten bewusst ohne WebSocket-Broadcast gebaut ("Single-Owner-Modell, keineLive-Collaboration-Story") — der Frontend-Code refetcht seitdem nach jeder Mutation, statt auf einen Broadcast zu
lauschen.
#89macht Einkaufslisten jetzt echt mehrpersonenfähig (Owner/Member, Einladungslinks), aber dieRefetch-Strategie wurde bewusst NICHT mitgezogen, um
#89nicht weiter aufzublähen (siehedocs/features/done/89_unified_list_types_overview_design.md, Abschnitt "Bewusst nicht in dieser Story"). Derreale Effekt: Wenn Mitglied B einer Einkaufsliste beitritt, sieht Mitglied A das erst nach einem manuellen
Neuladen der Seite — kein Broadcast informiert es live.
Acceptance criteria:
ChangePublisher<ShoppingListId, ShoppingListDto>, analog zuChangePublisher<TodoListId, TodoListDto>— jede Mutation, die eine Einkaufsliste selbst verändert (Umbenennen, Löschen, Mitgliedbeitreten/entfernen, Default setzen), publiziert ein Update-Event.
ShoppingListBroadcastDto, analog zuTodoListBroadcastDto— schließt per-viewer-Felder(
CurrentUserRole,IsDefault) aus, genau wie beim Todo-Pendant (Begründung: ein privatesNutzer-Feld darf nicht listenweit gebroadcastet werden).
TodoListMenu.tsx's Shopping-Lists-Fetch wird von "refetch nach jeder Mutation" auf eine echteWS-Subscription umgestellt, analog zu
subscribeToDtoChanges<TodoListId, TodoListBroadcastDto>fürTodo-Listen.
RenameShoppingListCommand) werden entfernt, wo der Broadcast siejetzt überflüssig macht — kein doppeltes Update.
Out of scope for this story:
Mitgliedschaft, Default-Status). Produkt-/Kategorie-Live-Sync ist eine deutlich größere, separate
Betrachtung und nicht Teil dieser Story.
Verified against code (2026-08-07):
ReactUi/src/components/TodoListMenu.tsx'sfetchShoppingLists(Kommentar "No WebSocket change stream for Shopping Lists") ist die Stelle, die ersetzt werden muss.
CqsTodo/Entities/ChangePublisher.cs/TodoListMappings.Map(TodoListDto)sind die Vorlagen, die für Shoppinggespiegelt werden.