Stabile Task-IDs + Toggle-Rückschreibpfad #153
Labels
No Label
area:auth
area:docs
area:export
area:ops
area:storage
area:supply-chain
auth
backend
blocked
collab
deployment
docs
effort:L
effort:M
effort:S
frontend
plugins
qa
vs-nfd
vs-nfd:blocker
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: stwaidele/dorfteich#153
Loading…
Reference in New Issue
Block a user
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?
Ziel
Jede Aufgabenlisten-Zeile (
task_item) ist stabil adressierbar, und der Server kann ihrenchecked-Zustand kollisionsfrei ändern — auch wenn die Seite gerade im Collab-Editor offen ist. Grundlage für die Aufgabenübersicht.Umsetzungsskizze
id(nanoid,default: null→ kompatibel mit Bestandsdokumenten) auftask_item(packages/shared/src/editor-schema/schema.ts:168-177);data-task-idin toDOM/parseDOM.appendTransaction(fehlende ODER duplizierte IDs — Copy/Paste! — bekommen frische); eingebunden nebenapps/web/src/editor/nodes/task-item.tsx.- [ ]) bleibt ID-los; bei Import regenerieren IDs (akzeptiert — Markdown ist Austauschformat, nicht Quelle der Wahrheit).VersionsService.restore→pg_notify→apps/collab/src/restore-listener.tsmitopenDirectConnection+transact; funktioniert auch bei nicht geöffneten Seiten, offene Editoren konvergieren per CRDT — NIE docFromState/docToState direkt in der API):TASK_TOGGLE_CHANNEL+ Payload{pageId, taskId, checked, userId}inpackages/shared/src/collab-token.ts.apps/collab/src/task-toggle-listener.ts(Struktur = restore-listener): DirectConnection öffnen, YXmlElementtaskItemmit passender id finden,setAttribute('checked', …)intransact; Registrierung inapps/collab/src/index.ts.POST /pages/:pageId/tasks/:taskId {checked}mit Write-Permission-Guard +pg_notify+ pending-contributor-Eintrag (Versions-Attribution). Antwort asynchron → Aufrufer togglen optimistisch und refetchen.Akzeptanzkriterien
checkedauch bei geschlossener Seite; offene Clients sehen den Toggle live und konfliktfrei.Bewusst nicht enthalten
UI, die den Endpoint nutzt (Folge-Issue Aufgabenübersicht); Backfill-Migration alter Dokumente (ID-lose Zeilen bleiben bis zum nächsten Editor-Öffnen ohne ID).
Umgesetzt in PR #158 (
3f7190e): task_item bekommt optionales id-Attr (default null, Bestandsdocs bleiben gueltig); der Editor vergibt/entdoppelt IDs lazy per appendTransaction (auch Copy/Paste). Neuer Kanal TASK_TOGGLE_CHANNEL; POST /pages/:id/tasks/:taskId prueft Schreibrecht, registriert den Toggler als pending contributor (Versions-Attribution) und feuert pg_notify; neuer collab task-toggle-listener (restore-listener-Muster, openDirectConnection) flippt das checked-Attribut als normalen Edit — offene Editoren konvergieren, unbekannte taskId = geloggter No-op. DB-Test (NOTIFY-Payload, 403/404/400); Loop im tasks-CI-Pack end-to-end.