feat: sync guard - Blockieren alter Clients beim sync
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
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);
|
||||
Reference in New Issue
Block a user