using LehrerApp.Data; using LehrerApp.Sync.Crypto; namespace LehrerApp.Sync; /// /// Lädt ausstehende Datei-Anhänge (siehe ) /// als eigenen, verschlüsselten Binärtransfer hoch — getrennt vom JSON-Ereigniskanal, damit /// Fotos/Scans ihn nicht aufblähen. Gegenstück zum Download in . /// public class AttachmentSyncer(LiteDbContext db, HttpClient http, byte[] syncKey) { public async Task UploadPendingAsync(EventQueue queue) { foreach (var storageId in queue.GetPendingAttachmentUploads()) { if (!db.Attachments.Exists(storageId)) { // Lokal inzwischen wieder gelöscht (z.B. HardDelete vor dem eigentlichen Upload) - // nichts hochzuladen, Warteliste trotzdem bereinigen. queue.MarkAttachmentUploaded(storageId); continue; } using var raw = db.Attachments.OpenRead(storageId); using var buffer = new MemoryStream(); await raw.CopyToAsync(buffer); var encrypted = SyncCrypto.Encrypt(buffer.ToArray(), syncKey); using var content = new ByteArrayContent(encrypted); var resp = await http.PostAsync($"/api/sync/attachments/{storageId}", content); resp.EnsureSuccessStatusCode(); queue.MarkAttachmentUploaded(storageId); } } }