init 1.0.0
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
namespace LehrerApp.Sync.Models;
|
||||
|
||||
// ── Events ────────────────────────────────────────────────────────────────────
|
||||
|
||||
/// <summary>Desktop-Event: Payload ist AES-256-GCM verschlüsselt.</summary>
|
||||
public class SyncEvent
|
||||
{
|
||||
public Guid EventId { get; init; } = Guid.NewGuid();
|
||||
public string DeviceId { get; init; } = "";
|
||||
public DeviceType DeviceType { get; init; }
|
||||
public DateTime Timestamp { get; init; } = DateTime.UtcNow;
|
||||
public long SequenceNr { get; init; }
|
||||
public string EntityType { get; init; } = "";
|
||||
public string EntityId { get; init; } = "";
|
||||
public string Operation { get; init; } = "";
|
||||
/// <summary>Verschlüsselt (Desktop) oder Klartext (Companion/WebApp).</summary>
|
||||
public string Payload { get; init; } = "";
|
||||
}
|
||||
|
||||
/// <summary>WebApp/Companion-Event: Payload ist Klartext-JSON.</summary>
|
||||
public class PlainSyncEvent
|
||||
{
|
||||
public Guid EventId { get; init; } = Guid.NewGuid();
|
||||
public string DeviceId { get; init; } = "";
|
||||
public DeviceType DeviceType { get; init; } = DeviceType.Companion;
|
||||
public DateTime Timestamp { get; init; } = DateTime.UtcNow;
|
||||
public string EntityType { get; init; } = "";
|
||||
public string EntityId { get; init; } = "";
|
||||
public string Operation { get; init; } = "";
|
||||
public string Payload { get; init; } = "";
|
||||
}
|
||||
|
||||
// ── Sync API Responses ────────────────────────────────────────────────────────
|
||||
|
||||
public class PushResponse
|
||||
{
|
||||
public bool Success { get; init; }
|
||||
public long ServerSequenceNr { get; init; }
|
||||
public List<Guid> ConflictingEventIds { get; init; } = [];
|
||||
}
|
||||
public class PullResponse
|
||||
{
|
||||
public List<SyncEvent> Events { get; init; } = [];
|
||||
public long ServerSequenceNr { get; init; }
|
||||
}
|
||||
public class PlainPushResponse
|
||||
{
|
||||
public bool Success { get; init; }
|
||||
public long ServerSequenceNr { get; init; }
|
||||
public List<Guid> RejectedEventIds { get; init; } = [];
|
||||
}
|
||||
|
||||
// ── Snapshot Modelle ──────────────────────────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// Upload-Request für Device-Pairing.
|
||||
/// EncryptedPayload: LiteDB verschlüsselt mit Sync-Key.
|
||||
/// EncryptedSyncKey: Sync-Key verschlüsselt mit PBKDF2(Code).
|
||||
/// → Empfänger braucht nur den Code um beides zu entschlüsseln.
|
||||
/// </summary>
|
||||
public class SnapshotUploadRequest
|
||||
{
|
||||
public string EncryptedPayload { get; init; } = "";
|
||||
public string EncryptedSyncKey { get; init; } = "";
|
||||
public DeviceType DeviceType { get; init; }
|
||||
}
|
||||
public class SnapshotUploadResponse
|
||||
{
|
||||
/// <summary>Format: WORT-ZZ-WORT, z.B. "TIGER-42-BLAU". 24h gültig, einmalig.</summary>
|
||||
public string Code { get; init; } = "";
|
||||
public DateTime ExpiresAt { get; init; }
|
||||
}
|
||||
public class SnapshotDownloadResponse
|
||||
{
|
||||
public string EncryptedPayload { get; init; } = "";
|
||||
public string EncryptedSyncKey { get; init; } = "";
|
||||
public DateTime CreatedAt { get; init; }
|
||||
public DeviceType SourceDeviceType { get; init; }
|
||||
}
|
||||
|
||||
// ── Status ────────────────────────────────────────────────────────────────────
|
||||
|
||||
public class SyncStatus
|
||||
{
|
||||
public SyncState State { get; set; } = SyncState.Idle;
|
||||
public DateTime? LastSyncAt { get; set; }
|
||||
public int PendingEvents { get; set; }
|
||||
public int ConflictCount { get; set; }
|
||||
public string? ErrorMessage { get; set; }
|
||||
}
|
||||
|
||||
// ── Enums ─────────────────────────────────────────────────────────────────────
|
||||
|
||||
public enum DeviceType { Desktop, Companion }
|
||||
public enum SyncState { Idle, Syncing, Error, Offline }
|
||||
Reference in New Issue
Block a user