Synchronisation (Deep Dive)

Synchronisation (Deep Dive)

Die Synchronisation ist das Herzstück von MistelMonitor, da sie die “Offline-First” Architektur mit der zentralen Datenerfassung verbindet.

Push-First Strategie

Der Sync-Prozess folgt strikt dem “Push-First” Prinzip. Das bedeutet: Bevor wir neue Daten vom Server holen, stellen wir sicher, dass alle lokalen Änderungen gesichert sind.

  1. Push Images & Audio:

    • Bilder und Audio-Dateien werden via MultipartRequest einzeln hochgeladen.
    • Dies geschieht vor den Metadaten, damit der Server die Dateien bereits hat, wenn der Bericht dazu kommt.
  2. Push Data (JSON):

    • Alle geänderten Datensätze (Reports, Events, etc.) werden in einem großen JSON-Paket gesendet.
    • Der Server verarbeitet dies transaktional: Entweder alles wird gespeichert oder nichts.
  3. Pull Data:

    • Erst wenn der Upload erfolgreich war, fragen wir den Server: “Was gibt es Neues?”.
    • Wir laden neue Sektoren, Events oder Berichte anderer Teams herunter.

DataTransferService

Die Klasse lib/services/data_transfer_service.dart steuert diesen Ablauf.

Konfliktlösung

  • Last-Write-Wins: Da wir keine komplexen Merges auf Feld-Ebene machen, gewinnt bei Konflikten (gleiche ID) der Datensatz mit dem neueren updated_at Zeitstempel.
  • Soft-Delete: Löschungen werden über das Feld deleted_at synchronisiert. Ein gelöschter Bericht wird nicht physisch entfernt, sondern nur ausgeblendet.

Backend API

Das Backend (syncbox/backend/routers/sync.py) bietet einen zentralen Endpunkt /sync.

  • Methode: POST
  • Payload: Enthält Listen von reports, events, groups, etc.
  • Logik: upsert_item (Update or Insert) für jeden Datensatz.