User-Konzept (Teil 2): Offline-Queue, Sofort-Sync & Last-Write-Wins #61

Closed
opened 2026-05-16 18:21:03 +00:00 by jreinemann-euris · 1 comment
jreinemann-euris commented 2026-05-16 18:21:03 +00:00 (Migrated from github.com)

Kontext

Folge-Ticket zu #57 (Server + App-Phase). Die Kern-Auth (JWT, Login, WebSocket-Client) ist fertig. Dieser Restaufwand vervollständigt das User-Konzept um robuste Offline-Fähigkeit und konfliktfreie Synchronisierung.

Akzeptanzkriterien

1. Offline-Queue (pending_sync_ops)

  • Room-Entity \PendingSyncOpEntity: \id, \itemId, \operation\ (PATCH/DELETE), \payload\ (JSON), \createdAt\
  • DAO + Migration (DB-Version bump)
  • ItemRepository: Bei Änderung → sofortiger PATCH-Versuch; bei Fehler (offline/server nicht erreichbar) → Op in Queue einreihen
  • Nach WebSocket-Reconnect (Connected-Event) → Queue automatisch abarbeiten

2. Sofort-Sync bei lokalen Änderungen

  • \SyncService.patchItem(itemId, item)\ → \PATCH /api/inventory/items/{id}\
  • ItemRepository löst bei \insert/\update/\delete\ automatisch Sync-Versuch aus (wenn Server-URL + Token vorhanden)
  • Fehler-Handling: Netzwerkfehler → Queue, Auth-Fehler → Silent (Token-Refresh wird separat gehandelt)

3. Last-Write-Wins beim Pull-Sync

  • \pullSync()\ vergleicht \lastUpdated-Timestamps pro Item
  • Nur Items übernehmen, bei denen der Server-Timestamp neuer ist als der lokale
  • Lokale Änderungen werden nicht überschrieben, wenn sie neuer sind

Technische Hinweise

  • PATCH-Endpoint ist serverseitig bereits implementiert (\PATCH /api/inventory/items/{id})
  • WebSocket-Events (\inventoryUpdated, \ ullSyncRequired) sind serverseitig vorhanden
  • \WebSocketEvent.Connected\ im \WebSocketClient\ kann als Trigger für Queue-Verarbeitung genutzt werden
  • Room \ allbackToDestructiveMigration()\ ist aktiv (keine Produktivdaten)
## Kontext Folge-Ticket zu #57 (Server + App-Phase). Die Kern-Auth (JWT, Login, WebSocket-Client) ist fertig. Dieser Restaufwand vervollständigt das User-Konzept um robuste Offline-Fähigkeit und konfliktfreie Synchronisierung. ## Akzeptanzkriterien ### 1. Offline-Queue (pending_sync_ops) - [ ] Room-Entity \PendingSyncOpEntity\: \id\, \itemId\, \operation\ (PATCH/DELETE), \payload\ (JSON), \createdAt\ - [ ] DAO + Migration (DB-Version bump) - [ ] ItemRepository: Bei Änderung → sofortiger PATCH-Versuch; bei Fehler (offline/server nicht erreichbar) → Op in Queue einreihen - [ ] Nach WebSocket-Reconnect (Connected-Event) → Queue automatisch abarbeiten ### 2. Sofort-Sync bei lokalen Änderungen - [ ] \SyncService.patchItem(itemId, item)\ → \PATCH /api/inventory/items/{id}\ - [ ] ItemRepository löst bei \insert\/\update\/\delete\ automatisch Sync-Versuch aus (wenn Server-URL + Token vorhanden) - [ ] Fehler-Handling: Netzwerkfehler → Queue, Auth-Fehler → Silent (Token-Refresh wird separat gehandelt) ### 3. Last-Write-Wins beim Pull-Sync - [ ] \pullSync()\ vergleicht \lastUpdated\-Timestamps pro Item - [ ] Nur Items übernehmen, bei denen der Server-Timestamp neuer ist als der lokale - [ ] Lokale Änderungen werden nicht überschrieben, wenn sie neuer sind ## Technische Hinweise - PATCH-Endpoint ist serverseitig bereits implementiert (\PATCH /api/inventory/items/{id}\) - WebSocket-Events (\inventoryUpdated\, \ ullSyncRequired\) sind serverseitig vorhanden - \WebSocketEvent.Connected\ im \WebSocketClient\ kann als Trigger für Queue-Verarbeitung genutzt werden - Room \ allbackToDestructiveMigration()\ ist aktiv (keine Produktivdaten)
jreinemann-euris commented 2026-05-16 19:40:27 +00:00 (Migrated from github.com)

Abgeschlossen (2026-05-16)

Zyklen: 2 (1 Implementierung + 1 Review-Korrektur)
Tests: 223 Tests, 0 Fehler

Implementierte Artefakte

  • PendingSyncOpEntity + PendingSyncOpDao: Room-Queue für PATCH/DELETE-Ops
  • MIGRATION_2_3: Tabelle \pending_sync_ops\ (DB-Version 2→3)
  • SyncService.patchItem() + deleteItem(): PATCH/DELETE gegen Server-API
  • ItemRepositoryImpl: Sofort-Sync fire-and-forget nach insert/update/delete; bei Netzwerkfehler → Queue, AuthError/NotConfigured → silent
  • drainQueue() bei WebSocketEvent.Connected: Queue abarbeiten, korrupte Ops löschen
  • ImportExportRepositoryImpl.applyInventoryDto(): Last-Write-Wins per lastUpdated-Timestamp
  • KrisenvorratDatabaseMigrationTest: V2→V3-Test ergänzt

Abweichungen

  • Keine
## Abgeschlossen (2026-05-16) **Zyklen:** 2 (1 Implementierung + 1 Review-Korrektur) **Tests:** ✅ 223 Tests, 0 Fehler ### Implementierte Artefakte - ✅ PendingSyncOpEntity + PendingSyncOpDao: Room-Queue für PATCH/DELETE-Ops - ✅ MIGRATION_2_3: Tabelle \pending_sync_ops\ (DB-Version 2→3) - ✅ SyncService.patchItem() + deleteItem(): PATCH/DELETE gegen Server-API - ✅ ItemRepositoryImpl: Sofort-Sync fire-and-forget nach insert/update/delete; bei Netzwerkfehler → Queue, AuthError/NotConfigured → silent - ✅ drainQueue() bei WebSocketEvent.Connected: Queue abarbeiten, korrupte Ops löschen - ✅ ImportExportRepositoryImpl.applyInventoryDto(): Last-Write-Wins per lastUpdated-Timestamp - ✅ KrisenvorratDatabaseMigrationTest: V2→V3-Test ergänzt ### Abweichungen - Keine
Sign in to join this conversation.
No description provided.