CI / build-and-test (push) Canceled after 0s
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>
31 lines
1.4 KiB
C#
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));
|
|
}
|
|
}
|