using System.Net; namespace LehrerApp.Sync; /// /// Version des Wire-Protokolls zwischen Desktop-App und Sync-Server. /// /// Bei jeder inkompatiblen Änderung an Sync-Events, Snapshots oder deren Verarbeitung erhöhen. /// Der Server lehnt Clients mit einer anderen (oder keiner) Version ab, bevor Daten gelesen oder /// geschrieben werden. Dadurch können alte App-Versionen nach einem Server-Deployment keine /// nicht mehr kompatiblen Daten in den Server-Store schreiben. /// public static class SyncProtocol { public const string CurrentVersion = "1"; public const string VersionHeaderName = "X-LehrerApp-Sync-Version"; public const int PushBatchSize = 200; public const int PullBatchSize = 500; public static HttpRequestMessage CreateRequest(HttpMethod method, string requestUri) { var request = new HttpRequestMessage(method, requestUri); request.Headers.Add(VersionHeaderName, CurrentVersion); return request; } public static Task EnsureCompatibleSuccessAsync(HttpResponseMessage response) { if (response.StatusCode == HttpStatusCode.UpgradeRequired) { var serverVersion = response.Headers.TryGetValues(VersionHeaderName, out var values) ? values.FirstOrDefault() : null; var detail = serverVersion is null ? $"Diese App verwendet Sync-Version {CurrentVersion}, der Server eine andere Version." : $"Diese App verwendet Sync-Version {CurrentVersion}, der Server Version {serverVersion}."; throw new SyncProtocolMismatchException( $"{detail} Bitte App und Server auf denselben Stand aktualisieren."); } response.EnsureSuccessStatusCode(); return Task.CompletedTask; } } public sealed class SyncProtocolMismatchException(string message) : Exception(message);