Files
LehrerApp/LehrerApp.Api/PlainEventStore.cs
T
adminandClaude Sonnet 5 858499e8ec fix: personenbezogene Daten aus Companion-Klartextkanal ausschließen
- PlainEventStore.Allowed: Grade/ExamResult entfernt (beide tragen
  StudentId + Notenwert/-kommentar, PlainSyncEvent.Payload läuft aber
  als Klartext-JSON über den Server, anders als der AES-256-GCM-
  verschlüsselte Desktop-Kanal). Nur noch WorkTask/Lesson erlaubt.
- Regressionstest PlainEventStoreTests ergänzt.
- TODO.md 10.3.3 abgehakt, inkl. deutlichem Warnhinweis: die geplante
  Mitarbeitsnoten-Erfassung per Companion-App ist damit bewusst
  blockiert, bis 10.3.1 (Schlüsselaustausch) + eine echte Payload-
  Verschlüsselung für PlainSyncEvent existieren.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 23:27:08 +02:00

37 lines
1.5 KiB
C#

using LehrerApp.Sync.Models;
namespace LehrerApp.Api;
public class PlainEventStore(EventStore eventStore)
{
// Grade/ExamResult bewusst NICHT erlaubt: PlainSyncEvent.Payload ist Klartext-JSON (siehe
// SyncModels.cs), beide Typen tragen aber eine StudentId plus Notenwert/-kommentar -
// personenbezogene Daten dürfen laut TODO.md 10.3.3 nicht unverschlüsselt übertragen werden.
private static readonly HashSet<string> Allowed = ["WorkTask", "Lesson"];
public PlainPushResponse Push(string userId, List<PlainSyncEvent> events)
{
var permitted = events.Where(e => Allowed.Contains(e.EntityType)).ToList();
var rejected = events.Where(e => !Allowed.Contains(e.EntityType))
.Select(e => e.EventId).ToList();
if (permitted.Count == 0) return new() { Success = true, RejectedEventIds = rejected };
var syncEvents = permitted.Select(e => new SyncEvent
{
EventId = e.EventId, DeviceId = e.DeviceId,
DeviceType = DeviceType.Companion,
Timestamp = e.Timestamp, SequenceNr = 0,
EntityType = e.EntityType, EntityId = e.EntityId,
Operation = e.Operation, Payload = e.Payload,
}).ToList();
var result = eventStore.Push(userId, syncEvents);
return new()
{
Success = result.Success,
ServerSequenceNr = result.ServerSequenceNr,
RejectedEventIds = [.. result.ConflictingEventIds, .. rejected],
};
}
}