using LehrerApp.Sync.Models; namespace LehrerApp.Sync; /// /// Desktop gewinnt gegen Companion. /// Bei Gleichstand: späterer Timestamp gewinnt. /// public class ConflictResolver(EventQueue queue) { public ConflictEntry? TryResolve(SyncEvent remote, string localDeviceId) { var local = queue.GetPending() .FirstOrDefault(e => e.EntityType == remote.EntityType && e.EntityId == remote.EntityId && e.DeviceId != remote.DeviceId); if (local is null) return null; var winner = (local.DeviceType, remote.DeviceType) switch { (DeviceType.Desktop, DeviceType.Companion) => local, (DeviceType.Companion, DeviceType.Desktop) => remote, // ToUniversalTime(): LiteDB liefert DateTime beim Auslesen aus der Queue als Kind=Local // zurück (Ticks werden dabei um die lokale Zeitzone verschoben). DateTime-Vergleiche // berücksichtigen Kind nicht, sondern vergleichen nur rohe Ticks — ein direkter Vergleich // von local.Timestamp (Local, aus der Queue) mit remote.Timestamp (Utc, vom Server) wäre // daher außerhalb von UTC+0 falsch. _ => local.Timestamp.ToUniversalTime() >= remote.Timestamp.ToUniversalTime() ? local : remote, }; if (winner == remote) queue.Acknowledge([local.EventId]); return new ConflictEntry { LocalEvent = local, RemoteEvent = remote, Resolution = winner == local ? "LocalWon" : "RemoteWon", }; } }