[Bug] tracking-todo-writer: Todos landen in beliebiger Todo-Liste statt in dedizierter 'Pakete'-Liste #330

Closed
opened 2026-05-18 14:57:50 +02:00 by admin-mrrm · 1 comment
Owner

Beobachtetes Verhalten

TrackingTodoWriterService.ensureTodoList() sucht die Ziel-Liste für auto-generierte Tracking-Todos nur über den Listen-Typ, nicht über den Titel:

// apps/api/src/modules/tracking/tracking-todo-writer.service.ts:39-47
private async ensureTodoList(ownerSub: string): Promise<string> {
  const owned = await this.lists.listForOwner(ownerSub);
  const existing = owned.find((l) => l.type === 'todo');  // <-- nur Type-Filter
  if (existing) return existing.id;
  const created = await this.lists.create(ownerSub, {
    type: 'todo',
    title: DEFAULT_TODO_LIST_TITLE,  // 'Pakete'
  });
  return created.id;
}

Folge: Wenn der User bereits irgendeine Todo-Liste hat (z.B. „Hausaufgaben", „Privat"), landen alle Tracking-Todos dort hinein — vermischt mit anderen Items, ohne erkennbaren Bezug zum Paket.

Erwartetes Verhalten

Tracking-Todos sollen in einer dedizierten Liste 'Pakete' landen (Type todo, Title Pakete). Existiert sie nicht → neu anlegen. Existiert eine andere Todo-Liste mit anderem Title → nicht verwenden.

Reproduktion

  1. Als User eine Todo-Liste mit beliebigem Title anlegen (z.B. „Privat", Type=todo)
  2. Ein Paket-Tracking erfassen, das auf einen Status mit Rule kommt (z.B. Delivered)
  3. TrackingSyncCron (oder manueller Sync) auslösen
  4. Erwartet: neue Liste „Pakete" wird angelegt, Todo landet dort
  5. Tatsächlich: Todo landet in der vorhandenen „Privat"-Liste

Fix-Vorschlag

const TODO_LIST_TITLE = 'Pakete';
// ...
const existing = owned.find((l) => l.type === 'todo' && l.title === TODO_LIST_TITLE);

Optional sauberer: stabile Markierung der auto-Liste via Metadata-Feld / Flag (z.B. system: 'tracking-todos'), damit Umbenennen durch den User nichts kaputt macht. Aber Umfang dann größer (Schema-Migration).

Akzeptanzkriterien

  • Test in tracking-todo-writer.service.spec.ts: bestehende Todo-Liste mit anderem Titel → neue 'Pakete'-Liste wird angelegt
  • Test: bestehende 'Pakete'-Liste → wiederverwendet
  • Fix-Implementierung in ensureTodoList()
  • Migration / Backfill-Strategie überlegen für User, deren Tracking-Todos bereits in der falschen Liste gelandet sind (ggf. eigenes Folge-Issue)

Verwandt

  • #143/#144/#145 (Implementation, closed) — der Bug ist genau in #144's Scope
  • #329 (UX: Tracking-Todos unsichtbar) — überschneidet sich: separate 'Pakete'-Liste ist Voraussetzung für „Liste mit Auto-Badge markieren"
  • #328 (Smoke-Test) — sollte diesen Edge-Case mit prüfen
## Beobachtetes Verhalten `TrackingTodoWriterService.ensureTodoList()` sucht die Ziel-Liste für auto-generierte Tracking-Todos **nur über den Listen-Typ**, nicht über den Titel: ```typescript // apps/api/src/modules/tracking/tracking-todo-writer.service.ts:39-47 private async ensureTodoList(ownerSub: string): Promise<string> { const owned = await this.lists.listForOwner(ownerSub); const existing = owned.find((l) => l.type === 'todo'); // <-- nur Type-Filter if (existing) return existing.id; const created = await this.lists.create(ownerSub, { type: 'todo', title: DEFAULT_TODO_LIST_TITLE, // 'Pakete' }); return created.id; } ``` Folge: Wenn der User bereits **irgendeine** Todo-Liste hat (z.B. „Hausaufgaben", „Privat"), landen alle Tracking-Todos dort hinein — vermischt mit anderen Items, ohne erkennbaren Bezug zum Paket. ## Erwartetes Verhalten Tracking-Todos sollen in einer **dedizierten Liste 'Pakete'** landen (Type `todo`, Title `Pakete`). Existiert sie nicht → neu anlegen. Existiert eine andere Todo-Liste mit anderem Title → **nicht** verwenden. ## Reproduktion 1. Als User eine Todo-Liste mit beliebigem Title anlegen (z.B. „Privat", Type=`todo`) 2. Ein Paket-Tracking erfassen, das auf einen Status mit Rule kommt (z.B. `Delivered`) 3. `TrackingSyncCron` (oder manueller Sync) auslösen 4. Erwartet: neue Liste „Pakete" wird angelegt, Todo landet dort 5. Tatsächlich: Todo landet in der vorhandenen „Privat"-Liste ## Fix-Vorschlag ```typescript const TODO_LIST_TITLE = 'Pakete'; // ... const existing = owned.find((l) => l.type === 'todo' && l.title === TODO_LIST_TITLE); ``` Optional sauberer: stabile Markierung der auto-Liste via Metadata-Feld / Flag (z.B. `system: 'tracking-todos'`), damit Umbenennen durch den User nichts kaputt macht. Aber Umfang dann größer (Schema-Migration). ## Akzeptanzkriterien - [ ] Test in `tracking-todo-writer.service.spec.ts`: bestehende Todo-Liste mit anderem Titel → neue 'Pakete'-Liste wird angelegt - [ ] Test: bestehende 'Pakete'-Liste → wiederverwendet - [ ] Fix-Implementierung in `ensureTodoList()` - [ ] Migration / Backfill-Strategie überlegen für User, deren Tracking-Todos bereits in der falschen Liste gelandet sind (ggf. eigenes Folge-Issue) ## Verwandt - #143/#144/#145 (Implementation, closed) — der Bug ist genau in #144's Scope - #329 (UX: Tracking-Todos unsichtbar) — überschneidet sich: separate 'Pakete'-Liste ist Voraussetzung für „Liste mit Auto-Badge markieren" - #328 (Smoke-Test) — sollte diesen Edge-Case mit prüfen
Author
Owner

Verwandt aus v0.4 Drawer/Listen-Arbeit: #331 (Drag-and-Drop Reorder), #332 (dedizierter Todo-Bereich)

Verwandt aus v0.4 Drawer/Listen-Arbeit: #331 (Drag-and-Drop Reorder), #332 (dedizierter Todo-Bereich)
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
admin-mrrm/mrrmlabapp#330
No description provided.