45 lines
1.8 KiB
C#
45 lines
1.8 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 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);
|