Files
LehrerApp/LehrerApp.Core/Models/DashboardWarningSnooze.cs
T
adminandClaude Opus 5.5 7d8deaf79c
CI / build-and-test (push) Canceled after 0s
Zurückstellen von Dashboard-Warnungen synchronisieren
Eine auf einem Gerät zurückgestellte Warnung stand auf den anderen weiter
rot oben, weil DashboardWarningSnooze bewusst lokal gehalten war. Save löst
jetzt db.OnChange aus, EventApplier übernimmt den Typ. Die Id wird aus
(StudentId, WarningTag) abgeleitet, damit zwei Geräte denselben Datensatz
beschreiben statt am Unique-Index ux_student_tag zu kollidieren;
Schema-Migration 7 schlüsselt bestehende lokale Einträge um.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 09:03:44 +02:00

31 lines
1.4 KiB
C#

using System.Security.Cryptography;
using System.Text;
namespace LehrerApp.Core.Models;
/// <summary>
/// "Zurückstellen" einer klassenübergreifenden Dashboard-Warnung (Fehlzeiten/Hausaufgaben/
/// Verspätungen, siehe DashboardViewModel) für eine Person — ein Erinnerungs-Zeitstempel je
/// (StudentId, WarningTag), der über den Sync repliziert wird, damit eine auf Gerät A
/// zurückgestellte Warnung auf Gerät B nicht weiter rot oben steht.
/// </summary>
public class DashboardWarningSnooze
{
/// Aus (StudentId, WarningTag) abgeleitet (siehe <see cref="IdFor"/>; setzt
/// IDashboardWarningSnoozeRepository.Save) statt zufällig: stellen
/// zwei Geräte dieselbe Warnung unabhängig voneinander zurück, beschreiben sie so denselben
/// Datensatz (Last-Write-Wins im Sync), statt zwei Datensätze anzulegen, die beim Anwenden am
/// Unique-Index ux_student_tag scheitern würden.
public Guid Id { get; set; }
public Guid StudentId { get; set; }
/// Dieselben Strings wie VorgangTagDisplay.Suggestions ("Absentismus"/"Hausaufgaben"/"Verspätungen").
public string WarningTag { get; set; } = "";
public DateOnly SnoozedUntil { get; set; }
public static Guid IdFor(Guid studentId, string warningTag)
{
var hash = SHA256.HashData(Encoding.UTF8.GetBytes($"{studentId:N}:{warningTag.ToLowerInvariant()}"));
return new Guid(hash.AsSpan(0, 16));
}
}