Удалены <remarks>, <summary> сжаты до короткой фразы, вырезаны ссылки на Task/Ruling/этап/python/прототип; //-комментарии со ссылками на процесс удалены; то же в .proto. Правила обновлены в docs/spec/Код-стайл-Дейл.md. Строк комментариев 27210 -> ~19100.
64 lines
2.5 KiB
C#
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 });
|
|
}
|
|
}
|
|
}
|