feat(robustheit): optimistische Nebenläufigkeit (featuresVersion + Konflikt-Erkennung)
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 28m41s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 28m41s
Verhindert stilles Überschreiben neuerer Änderungen durch veralteten Stand (z.B. nach Offline-Reconnect oder Lock-Ablauf bei Multi-Device). - Project.featuresVersion (Schema + Auto-Migration), pro Features-Speichern +1 - Features-PUT: optimistischer Lock in interaktiver Transaktion (updateMany WHERE featuresVersion=baseVersion -> atomar; count=0 => 409 Konflikt) - Bei Konflikt liefert der Server den aktuellen Stand zurück (409 + features + version) - Client sendet baseVersion (Auto-Save, manuell, Beacon, Offline-Queue), übernimmt bei 409 den Server-Stand und warnt den Nutzer (statt still zu überschreiben) - Offline-Queue verwirft konfligierende 4xx (kein Clobber beim Reconnect) - Transaktions-Timeout 15s für grosse Zeichnungen auf langsamer DB Version 1.4.11 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -73,6 +73,7 @@ async function migrate() {
|
||||
`ALTER TABLE projects ADD COLUMN IF NOT EXISTS "journalfuehrer" TEXT`,
|
||||
`ALTER TABLE projects ADD COLUMN IF NOT EXISTS "mode" TEXT NOT NULL DEFAULT 'EINSATZ'`,
|
||||
`ALTER TABLE projects ADD COLUMN IF NOT EXISTS "exerciseEvaluation" TEXT`,
|
||||
`ALTER TABLE projects ADD COLUMN IF NOT EXISTS "featuresVersion" INTEGER NOT NULL DEFAULT 0`,
|
||||
`ALTER TABLE projects ADD COLUMN IF NOT EXISTS "editingById" TEXT`,
|
||||
`ALTER TABLE projects ADD COLUMN IF NOT EXISTS "editingUserName" TEXT`,
|
||||
`ALTER TABLE projects ADD COLUMN IF NOT EXISTS "editingSessionId" TEXT`,
|
||||
|
||||
@@ -166,6 +166,10 @@ model Project {
|
||||
mapCenter Json @default("{\"lng\": 8.5417, \"lat\": 47.3769}")
|
||||
mapZoom Float @default(15)
|
||||
isLocked Boolean @default(false)
|
||||
// Optimistische Nebenläufigkeit: wird bei jedem Features-Speichern hochgezählt.
|
||||
// Verhindert, dass ein veralteter (z.B. offline zwischengespeicherter) Stand
|
||||
// neuere Änderungen stillschweigend überschreibt.
|
||||
featuresVersion Int @default(0)
|
||||
|
||||
// Live editing lock (session-based for same-account multi-device)
|
||||
editingById String?
|
||||
|
||||
Reference in New Issue
Block a user