Files
tnsu-approval-route/backend/Tnsu.ApprovalRoute.Application/Approvals/AutoApproveJob.cs
T
gorbenko.pavel 2b8fe77fac
Tests / frontend-test (push) Successful in 46s
Tests / backend-test (push) Successful in 3m39s
Auto approve (#21)
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/21
2026-09-14 09:01:56 +00:00

36 lines
2.3 KiB
C#

using Hangfire;
using Microsoft.Extensions.Logging;
namespace Tnsu.ApprovalRoute.Application.Approvals;
/// <summary>
/// Рекуррентная задача автосогласования — тонкая обёртка над
/// <see cref="AutoApproveService"/>: всё, что она добавляет сверху, — расписание,
/// защита от наложения запусков и одна строка в логе с итогом.
///
/// Повторы отключены (Attempts = 0) намеренно, в отличие от
/// CreateNextListPartitionJob: там повтор нужен, потому что пропуск задачи ломает
/// сценарий целиком (список не создан — писать некуда). Здесь же следующий запуск
/// придёт сам, через час, и сделает ровно ту же работу с актуальным состоянием —
/// уже согласованные строки в выборку не попадут. Повторять упавший проход раньше
/// этого смысла нет, а висящие в очереди повторы только прятали бы настоящую
/// причину сбоя.
/// </summary>
[AutomaticRetry(Attempts = 0)]
[DisableConcurrentExecution(timeoutInSeconds: 5 * 60)]
public sealed class AutoApproveJob(AutoApproveService service, ILogger<AutoApproveJob> logger)
{
/// <summary>
/// Идентификатор рекуррентной задачи в Hangfire. Константой — по нему задача и
/// заводится, и снимается при выключении настройки (см. Program.cs): разъехавшись,
/// эти два имени оставили бы в дашборде задачу, которую уже некому снять.
/// </summary>
public const string RecurringJobId = "auto-approve";
public async Task RunAsync(CancellationToken cancellationToken)
{
var approved = await service.RunAsync(cancellationToken);
logger.LogInformation("Автосогласование: строк согласовано автоматически — {Count}", approved);
}
}