using LehrerApp.Core.Models; using LehrerApp.Core.Services; using LehrerApp.Data; using LehrerApp.Sync.Crypto; using LehrerApp.Sync.Models; namespace LehrerApp.Sync; /// /// Wandelt -Aufrufe in ausgehende Sync-Ereignisse um. Wird in /// AppBootstrapper an gehängt, wenn Sync konfiguriert ist — /// dort entsteht aus den ~27 Repository-Aufrufen genau ein verschlüsseltes Ereignis pro Aufruf. /// public class SyncEventPublisher(EventQueue queue, string deviceId, byte[] syncKey, AppLogger? logger = null) { public void Publish(string entityType, string entityId, string operation, object? payload) { var encrypted = payload is null ? "" : SyncCrypto.EncryptObject(payload, syncKey); var evt = queue.Enqueue(deviceId, DeviceType.Desktop, entityType, entityId, operation, encrypted); // Erfolgs-Protokollierung (nicht nur Fehler, siehe SyncEngine/EventApplier) — sonst lässt // sich ohne zwei parallele Testgeräte nie nachvollziehen, ob eine lokale Änderung // überhaupt in die Outbox gelangt ist, bevor Push/Pull überhaupt ins Spiel kommen. logger?.Info($"Sync: Ereignis eingereiht (SequenceNr={evt.SequenceNr}) - {entityType} {operation} " + $"EntityId={entityId}"); // Anhänge reisen nicht im JSON-Ereignis mit (würde den Kanal für Fotos/Scans aufblähen), // sondern als eigener Binärtransfer über AttachmentSyncer — hier nur zur Warteliste hinzufügen. if (payload is Documentation doc) foreach (var attachment in doc.Attachments) queue.QueueAttachmentUpload(attachment.StorageId); } }