Files
Deal/src/core/Deal.Api/Events/StorageToastPublisher.cs
T
Rustam Khalimov b053d58335 Почистить комментарии от упоминаний процесса
Удалены <remarks>, <summary> сжаты до короткой фразы, вырезаны
ссылки на Task/Ruling/этап/python/прототип; //-комментарии со ссылками
на процесс удалены; то же в .proto. Правила обновлены в
docs/spec/Код-стайл-Дейл.md. Строк комментариев 27210 -> ~19100.
2026-09-11 13:39:39 +03:00

64 lines
2.5 KiB
C#

using Deal.Modules.Kanban.Application.Models;
namespace Deal.Api.Events;
/// <summary>
/// Публикация SSE-тостов статистики тика правил хранения в канал тенанта.
/// </summary>
public sealed class StorageToastPublisher
{
private const string ToastEventType = "toast";
private const string AutoArchiveToastText = "Автоархив: {0} карточек";
private const string ArchiveClearedToastText = "Архив очищен: {0} (90 дн.)";
private const string TrashClearedToastText = "Корзина очищена: {0} (7 дн.)";
private const string RejectedPurgedToastText = "Отсев очищен: {0} записей (3 дн.)";
private const string ClockIcon = "clock";
private const string TrashIcon = "trash";
private readonly SseBroker _broker;
/// <summary>
/// Создаёт публикатора тостов тика.
/// </summary>
/// <param name="broker">SSE-брокер каналов тенантов (singleton).</param>
public StorageToastPublisher(SseBroker broker)
{
ArgumentNullException.ThrowIfNull(broker);
_broker = broker;
}
/// <summary>
/// Публикует тосты статистики тика по ненулевым счётчикам.
/// </summary>
/// <param name="tenantId">Тенант-получатель тостов (сессия запроса / канал тенанта цикла).</param>
/// <param name="stats">Статистика только что выполненного тика.</param>
public void PublishTickToasts(Guid tenantId, StorageTickStatsDto stats)
{
if (stats.Archived > 0)
{
_broker.Publish(tenantId, ToastEventType, new { text = string.Format(AutoArchiveToastText, stats.Archived), icon = ClockIcon });
}
if (stats.PurgedArchive > 0)
{
_broker.Publish(tenantId, ToastEventType, new { text = string.Format(ArchiveClearedToastText, stats.PurgedArchive), icon = TrashIcon });
}
if (stats.PurgedTrash > 0)
{
_broker.Publish(tenantId, ToastEventType, new { text = string.Format(TrashClearedToastText, stats.PurgedTrash), icon = TrashIcon });
}
if (stats.PurgedRejected > 0)
{
_broker.Publish(tenantId, ToastEventType, new { text = string.Format(RejectedPurgedToastText, stats.PurgedRejected), icon = TrashIcon });
}
}
}