Merkliste serverseitig statt localStorage (post-v2) #140

Closed
opened 2026-04-20 02:21:59 +02:00 by tobias · 1 comment
Owner

Kontext

Aus Redesign-Brief §11.1. Die aktuelle Merkliste lebt in localStorage und ist damit nur pro Gerät verfügbar. Mit dem v2-Redesign (#139) soll sie serverseitig pro Nutzer:in persistieren.

Abhängigkeit: Erst nach Stabilisierungs-Phase von v2 umsetzen — ist kein reiner Frontend-Refactor und verlässt den v2-Scope bewusst.

Backend

  • Neuer Endpunkt GET / POST / DELETE /api/me/merkliste, authentifiziert (bestehende Keycloak-JWT-Validierung)
  • Neue Tabelle
    CREATE TABLE merkliste (
        user_id TEXT NOT NULL,
        antrag_id TEXT NOT NULL,
        created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        notiz TEXT,
        PRIMARY KEY (user_id, antrag_id)
    );
    CREATE INDEX idx_merkliste_user ON merkliste(user_id);
    
  • POST-Body: {antrag_id, notiz?} (Upsert)
  • DELETE /api/me/merkliste/{antrag_id}
  • GET liefert sortiert nach created_at DESC

Frontend (v2)

  • Stern-Button ruft API, nicht localStorage
  • Merkliste-Sidebar-Eintrag zeigt Server-Stand
  • Optional: Notiz-Feld beim Hinzufügen

Migration aus localStorage

Beim ersten Login nach Deploy: Modal „Wir haben {n} lokal gespeicherte Merkeinträge auf diesem Gerät. In dein Konto übernehmen?" → Ja: batch-POST, Nein: Dialog schließen.

Login-Konsequenz

Nicht-angemeldete Nutzer:innen: Stern-Button verlinkt zu Anmelden. Alternative: weiterhin lokale Fallback-Liste mit Merge-Dialog nach Login.

Default-Empfehlung: Fallback-Liste weiter zulassen, Merge nach Login.

Datenschutz

Datenschutzerklärung erweitern: „Wir speichern die von Ihnen gemerkten Antrags-IDs, um sie geräteübergreifend verfügbar zu machen." Account-Löschung entfernt Merkliste via Cascade.

Tests

  • API-Tests: CRUD mit gestubbtem JWT
  • Migrations-Modal: E2E mit Playwright

Akzeptanzkriterien

  • Merkliste geräteübergreifend synchron
  • Keine Daten verloren bei Migration (alle localStorage-Einträge übernommen)
  • Funktioniert nicht mehr offline (akzeptiert)
  • Account-Löschung räumt Einträge
  • Datenschutzerklärung aktualisiert

Labels

backend, enhancement, post-v2

## Kontext Aus Redesign-Brief §11.1. Die aktuelle Merkliste lebt in `localStorage` und ist damit nur pro Gerät verfügbar. Mit dem v2-Redesign (#139) soll sie serverseitig pro Nutzer:in persistieren. **Abhängigkeit:** Erst nach Stabilisierungs-Phase von v2 umsetzen — ist kein reiner Frontend-Refactor und verlässt den v2-Scope bewusst. ## Backend - Neuer Endpunkt `GET / POST / DELETE /api/me/merkliste`, authentifiziert (bestehende Keycloak-JWT-Validierung) - Neue Tabelle ```sql CREATE TABLE merkliste ( user_id TEXT NOT NULL, antrag_id TEXT NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, notiz TEXT, PRIMARY KEY (user_id, antrag_id) ); CREATE INDEX idx_merkliste_user ON merkliste(user_id); ``` - `POST`-Body: `{antrag_id, notiz?}` (Upsert) - `DELETE /api/me/merkliste/{antrag_id}` - `GET` liefert sortiert nach `created_at DESC` ## Frontend (v2) - Stern-Button ruft API, nicht `localStorage` - Merkliste-Sidebar-Eintrag zeigt Server-Stand - Optional: Notiz-Feld beim Hinzufügen ## Migration aus localStorage Beim ersten Login nach Deploy: Modal „Wir haben {n} lokal gespeicherte Merkeinträge auf diesem Gerät. In dein Konto übernehmen?" → Ja: batch-POST, Nein: Dialog schließen. ## Login-Konsequenz Nicht-angemeldete Nutzer:innen: Stern-Button verlinkt zu Anmelden. Alternative: weiterhin lokale Fallback-Liste mit Merge-Dialog nach Login. **Default-Empfehlung:** Fallback-Liste weiter zulassen, Merge nach Login. ## Datenschutz Datenschutzerklärung erweitern: „Wir speichern die von Ihnen gemerkten Antrags-IDs, um sie geräteübergreifend verfügbar zu machen." Account-Löschung entfernt Merkliste via Cascade. ## Tests - API-Tests: CRUD mit gestubbtem JWT - Migrations-Modal: E2E mit Playwright ## Akzeptanzkriterien - [ ] Merkliste geräteübergreifend synchron - [ ] Keine Daten verloren bei Migration (alle localStorage-Einträge übernommen) - [ ] Funktioniert nicht mehr offline (akzeptiert) - [ ] Account-Löschung räumt Einträge - [ ] Datenschutzerklärung aktualisiert ## Labels `backend`, `enhancement`, `post-v2`
tobias added this to the post-1.0 milestone 2026-04-25 20:59:57 +02:00
Author
Owner

Bereits implementiert in app/main.py: GET/POST/DELETE /api/me/merkliste + bulk-import-Endpunkt, plus /v2/merkliste-View. Schließen als done.

Bereits implementiert in app/main.py: GET/POST/DELETE /api/me/merkliste + bulk-import-Endpunkt, plus /v2/merkliste-View. Schließen als done.
Sign in to join this conversation.
No description provided.