< Summary

Information
Class: Services.ApiServices.FidApi.FidApiDataManager
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/FidApi/FidApiDataManager.cs
Line coverage
100%
Covered lines: 21
Uncovered lines: 0
Coverable lines: 21
Total lines: 69
Line coverage: 100%
Branch coverage
87%
Covered branches: 7
Total branches: 8
Branch coverage: 87.5%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetSuppliersAsync(...)50%22100%
GetPriceStockAsync(...)100%11100%
GetPriceExplanationAsync(...)100%66100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/FidApi/FidApiDataManager.cs

#LineLine coverage
 1using Services.ApiServices.FidApi.Models;
 2using System.Globalization;
 3
 4namespace Services.ApiServices.FidApi;
 5
 6/// <summary>Read-операции фид-сервиса.</summary>
 7public sealed class FidApiDataManager
 8{
 9    private const string SuppliersPath = "/api/suppliers";
 10    private const string PriceStockPath = "/api/feed/price-stock";
 11    private const string PriceExplanationPath = "/api/feed/articles/price-explanation";
 12
 13    private readonly FidApiHttpClient _client;
 14
 8015    public FidApiDataManager(FidApiHttpClient client) => _client = client;
 16
 17    /// <summary>
 18    /// Поставщики фида со складами, объёмом строк и датой последней выгрузки.
 19    /// Считается по сводке файлов, а не по строкам прайсов, поэтому запрос дешёвый.
 20    /// </summary>
 21    /// <param name="includeDisabled">
 22    /// Включить поставщиков, все выгрузки которых выключены: по умолчанию их в ответе нет.
 23    /// </param>
 24    public Task<FidSuppliers?> GetSuppliersAsync(bool includeDisabled = false, CancellationToken ct = default)
 25    {
 1626        var query = new Dictionary<string, string?>
 1627        {
 1628            ["all"] = includeDisabled ? "true" : null
 1629        };
 30
 1631        return _client.GetWithoutEnvelopeAsync<FidSuppliers>(SuppliersPath, query, ct);
 32    }
 33
 34    /// <summary>Цена, остатки и последние прогоны по точным ключам фида в одном снимке.</summary>
 35    public Task<FidPriceStock?> GetPriceStockAsync(
 36        IReadOnlyCollection<string> articleKeys,
 37        int historyRuns,
 38        CancellationToken ct = default)
 39    {
 140        ArgumentOutOfRangeException.ThrowIfNegativeOrZero(historyRuns);
 41
 142        var query = new Dictionary<string, string?>
 143        {
 144            ["keys"] = string.Join(',', articleKeys),
 145            ["historyRuns"] = historyRuns.ToString(CultureInfo.InvariantCulture)
 146        };
 47
 148        return _client.GetWithoutEnvelopeAsync<FidPriceStock>(PriceStockPath, query, ct);
 49    }
 50
 51    /// <summary>
 52    /// Расшифровка цены позиции из плана цен сборки: склад и поставщик закупки, комиссии, формула, решение, данные Озон
 53    /// Без <paramref name="runId"/> — последняя сборка каждого кабинета, где есть план.
 54    /// </summary>
 55    /// <param name="key">Один ключ <c>АРТИКУЛ=ПРЕФИКС</c>, без учёта регистра.</param>
 56    public Task<FidPriceExplanationResponse?> GetPriceExplanationAsync(string key, long? runId = null, CancellationToken
 57    {
 558        ArgumentException.ThrowIfNullOrWhiteSpace(key);
 659        if (runId is <= 0) throw new ArgumentOutOfRangeException(nameof(runId), "runId: положительное целое число.");
 60
 461        var query = new Dictionary<string, string?>
 462        {
 463            ["key"] = key.Trim(),
 464            ["runId"] = runId?.ToString(CultureInfo.InvariantCulture)
 465        };
 66
 467        return _client.GetWithoutEnvelopeAsync<FidPriceExplanationResponse>(PriceExplanationPath, query, ct);
 68    }
 69}