using System.Text.Json.Serialization; namespace Tnsu.ApprovalRoute.Application.Reminders; /// Вид напоминания — один на конкретный (sealed) наследник, см. их конструкторы. /// Ссылка на заявку. /// Id типа заявки (RequestType). /// Название типа заявки — для читаемости в письме/таблице, без похода в БД. /// Id заявки (TicketId строки списка согласования / Id строки списка данных). /// Статус заявки/шага — из того списка, который читает конкретный вид напоминания. /// /// Уникальный код заявки (колонка RequestUniqueCode списка данных) — null, если у /// заявки его нет или строка данных не найдена. /// /// /// Общая часть двух видов напоминаний — и /// . У них разные поля-триггеры и разные /// адресаты, общее — только то, что описано здесь (к какой заявке относится строка /// и как её открыть). /// /// [JsonPolymorphic]/[JsonDerivedType] — вместо того чтобы полагаться на /// compile-time тип элемента (ReminderService всегда работает со списком именно /// этого базового типа, см. IReadOnlyList<ReminderDto>), System.Text.Json без /// этих атрибутов сериализовал бы только поля базового класса, теряя специфичные /// для наследника (Email/HoursOverdue или ManagerEmail/CandidateEmail и т.д.). /// Дискриминатор — отдельное системное поле "$type", а не Category: значение /// Category читаемое (совпадает с именем enum-константы через уже подключенный /// глобально JsonStringEnumConverter, см. Program.cs) и не привязано к деталям /// сериализации. /// [JsonPolymorphic] [JsonDerivedType(typeof(ApprovalOverdueReminderDto), nameof(ReminderCategory.ApprovalOverdue))] [JsonDerivedType(typeof(ProbationEndingReminderDto), nameof(ReminderCategory.ProbationEnding))] public abstract record ReminderDto( ReminderCategory Category, string Url, int RequestTypeId, string RequestTypeName, int RequestId, string Status, string? RequestUniqueCode);