Files
LehrerApp/LehrerApp.Sync/SyncProtocol.cs
T
2026-08-25 21:30:00 +02:00

47 lines
1.9 KiB
C#

using System.Net;
namespace LehrerApp.Sync;
/// <summary>
/// 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.
/// </summary>
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);