< Summary

Information
Class: OzonOrdersWeb.WebServices.Transactions.TransactionProgressReporter
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Transactions/TransactionProgressReporter.cs
Line coverage
38%
Covered lines: 10
Uncovered lines: 16
Coverable lines: 26
Total lines: 64
Line coverage: 38.4%
Branch coverage
50%
Covered branches: 2
Total branches: 4
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
StageAsync()50%4221.42%
CompleteAsync()50%3237.5%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Transactions/TransactionProgressReporter.cs

#LineLine coverage
 1using Microsoft.AspNetCore.SignalR;
 2using Services.SignalRServices;
 3
 4namespace OzonOrdersWeb.WebServices.Transactions;
 5
 6/// <summary>
 7/// Настоящий ход проведения документа для оверлея на форме транзакции.
 8/// Раньше этапы на странице оценивались по секундомеру и к действительности отношения не имели:
 9/// «Отправляем документы в 1С» показывалось всем, даже когда 1С в проведении не участвует.
 10/// Сообщения идут через JobProgressHub в группу с ключом, который страница передала в форме.
 11/// </summary>
 12public sealed class TransactionProgressReporter
 13{
 14    private readonly IHubContext<JobProgressHub> _hub;
 15    private readonly ILogger<TransactionProgressReporter> _logger;
 16
 2017    public TransactionProgressReporter(IHubContext<JobProgressHub> hub, ILogger<TransactionProgressReporter> logger)
 18    {
 2019        _hub = hub;
 2020        _logger = logger;
 2021    }
 22
 23    /// <param name="key">Ключ прогресса из формы; без него сообщать некому.</param>
 24    /// <param name="code">Устойчивый код этапа: страница по нему находит и обновляет строку.</param>
 25    /// <param name="title">Что показать пользователю.</param>
 26    /// <param name="detail">Уточнение под заголовком: сколько заказов, номер документа 1С и т.п.</param>
 27    public async Task StageAsync(string? key, string code, string title, string? detail = null)
 28    {
 2329        if (string.IsNullOrWhiteSpace(key))
 2330            return;
 31
 32        try
 33        {
 034            await _hub.Clients.Group(key.Trim()).SendAsync("TransactionStage", new
 035            {
 036                code,
 037                title,
 038                detail,
 039                atUtc = DateTime.UtcNow
 040            });
 041        }
 042        catch (Exception ex)
 43        {
 44            // Прогресс — вспомогательная информация: его сбой не должен ломать проведение.
 045            _logger.LogDebug(ex, "Не удалось отправить этап {Code} прогресса транзакции", code);
 046        }
 2347    }
 48
 49    /// <summary>Проведение закончилось: страница гасит спиннер и перестаёт ждать этапы.</summary>
 50    public async Task CompleteAsync(string? key, bool success, string? message = null)
 51    {
 2252        if (string.IsNullOrWhiteSpace(key))
 2253            return;
 54
 55        try
 56        {
 057            await _hub.Clients.Group(key.Trim()).SendAsync("TransactionFinished", new { success, message });
 058        }
 059        catch (Exception ex)
 60        {
 061            _logger.LogDebug(ex, "Не удалось отправить завершение прогресса транзакции");
 062        }
 2263    }
 64}