< Summary

Information
Class: Services.ApiServices.StudioApi.InterpartsDataManager
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/StudioApi/InterpartsDataManager.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 169
Coverable lines: 169
Total lines: 323
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 96
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
GetPrices()0%156120%
GetPricesWithSupplier()0%156120%
GetProducers()0%156120%
GetProducerById()0%2040%
GetProducersByPrefix()0%156120%
SearchProducersByName()0%156120%
GetProducerByNameOrPrefix()0%4260%
GetProducerByNameOrPrefixWithFallback()0%110100%
GetSingleProducer()0%2040%
GetFirstProducer()0%2040%
GetProducerByIdWithRealId()0%7280%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/StudioApi/InterpartsDataManager.cs

#LineLine coverage
 1using System.Text.RegularExpressions;
 2using Microsoft.Extensions.Caching.Memory;
 3using Newtonsoft.Json.Linq;
 4using Services.ApiServices.StudioApi.Models.Response;
 5
 6namespace Services.ApiServices.StudioApi;
 7
 8public class InterpartsDataManager
 9{
 10    private readonly InterpartsApiClient _client;
 11    private readonly InterpartsApiConfig _config;
 12    private readonly IMemoryCache _cache;
 13    private readonly MemoryCacheEntryOptions _cacheOptions;
 14
 015    public InterpartsDataManager(InterpartsApiConfig config, IMemoryCache cache)
 16    {
 017        _config = config;
 018        _client = new InterpartsApiClient(config.Token);
 019        _cache = cache;
 020        _cacheOptions = new MemoryCacheEntryOptions()
 021            .SetAbsoluteExpiration(TimeSpan.FromHours(1));
 022    }
 23
 24    public async Task<List<ExternalPriceItem>> GetPrices(int producerId, string partCode)
 25    {
 026        await Task.CompletedTask;
 027        string cacheKey = $"Interparts_Prices_{producerId}_{partCode}";
 028        if (_cache.TryGetValue(cacheKey, out List<ExternalPriceItem>? cached) && cached != null)
 029            return cached;
 30
 031        var url = InterpartsApiUrl.ExternalPricesUrl(_config.BaseUrl, producerId, partCode);
 32
 033        var result = new List<ExternalPriceItem>();
 034        string? nextUrl = url;
 35
 036        while (nextUrl != null)
 37        {
 038            JObject json = _client.MakeRequestGet(nextUrl);
 39
 040            var page = json["value"]?.ToObject<List<ExternalPriceItem>>();
 041            if (page != null)
 042                result.AddRange(page);
 43
 044            nextUrl = json["@odata.nextLink"]?.ToString();
 45        }
 46
 047        _cache.Set(cacheKey, result, _cacheOptions);
 048        return result;
 049    }
 50
 51    public async Task<List<PriceItem>> GetPricesWithSupplier(int producerId, string partCode)
 52    {
 053        await Task.CompletedTask;
 054        partCode = Regex.Replace(partCode, @"[^a-zA-Zа-яА-Я0-9]", "");
 055        string cacheKey = $"Prices_{producerId}_{partCode}";
 056        if (_cache.TryGetValue(cacheKey, out List<PriceItem>? cached) && cached != null)
 057            return cached;
 58
 059        var url = InterpartsApiUrl.PricesUrl(_config.BaseUrl, producerId, partCode);
 60
 061        var result = new List<PriceItem>();
 062        string? nextUrl = url;
 63
 064        while (nextUrl != null)
 65        {
 066            JObject json = _client.MakeRequestGet(nextUrl);
 067            var page = json["value"]?.ToObject<List<PriceItem>>();
 068            if (page != null)
 069                result.AddRange(page);
 70
 071            nextUrl = json["@odata.nextLink"]?.ToString();
 72        }
 73
 074        _cache.Set(cacheKey, result, _cacheOptions);
 075        return result;
 076    }
 77
 78    public async Task<List<Producer>> GetProducers()
 79    {
 080        await Task.CompletedTask;
 081        string cacheKey = "Interparts_Producers_All";
 082        if (_cache.TryGetValue(cacheKey, out List<Producer>? cached) && cached != null)
 083            return cached;
 84
 085        var url = InterpartsApiUrl.ProducersUrl(_config.BaseUrl);
 86
 087        var result = new List<Producer>();
 088        string? nextUrl = url;
 89
 090        while (nextUrl != null)
 91        {
 092            JObject json = _client.MakeRequestGet(nextUrl);
 93
 094            var page = json["value"]?.ToObject<List<Producer>>();
 095            if (page != null)
 096                result.AddRange(page);
 97
 098            nextUrl = json["@odata.nextLink"]?.ToString();
 99        }
 100
 0101        _cache.Set(cacheKey, result, _cacheOptions);
 0102        return result;
 0103    }
 104
 105    public async Task<Producer?> GetProducerById(int producerId)
 106    {
 0107        await Task.CompletedTask;
 0108        string cacheKey = $"Interparts_Producer_{producerId}";
 0109        if (_cache.TryGetValue(cacheKey, out Producer? cached))
 0110            return cached;
 111
 0112        var url = InterpartsApiUrl.ProducerByIdUrl(_config.BaseUrl, producerId);
 113
 114        try
 115        {
 0116            JObject json = _client.MakeRequestGet(url);
 0117            var producer = json.ToObject<Producer>();
 118
 0119            if (producer != null)
 0120                _cache.Set(cacheKey, producer, _cacheOptions);
 121
 0122            return producer;
 123        }
 0124        catch (Exception)
 125        {
 0126            return null;
 127        }
 0128    }
 129
 130    public async Task<List<Producer>> GetProducersByPrefix(string prefix)
 131    {
 0132        await Task.CompletedTask;
 0133        string cacheKey = $"Interparts_Producers_Prefix_{prefix}";
 0134        if (_cache.TryGetValue(cacheKey, out List<Producer>? cached) && cached != null)
 0135            return cached;
 136
 0137        var url = InterpartsApiUrl.ProducersByPrefixUrl(_config.BaseUrl, prefix);
 138
 0139        var result = new List<Producer>();
 0140        string? nextUrl = url;
 141
 0142        while (nextUrl != null)
 143        {
 0144            JObject json = _client.MakeRequestGet(nextUrl);
 145
 0146            var page = json["value"]?.ToObject<List<Producer>>();
 0147            if (page != null)
 0148                result.AddRange(page);
 149
 0150            nextUrl = json["@odata.nextLink"]?.ToString();
 151        }
 152
 0153        _cache.Set(cacheKey, result, _cacheOptions);
 0154        return result;
 0155    }
 156
 157    public async Task<List<Producer>> SearchProducersByName(string name)
 158    {
 0159        await Task.CompletedTask;
 0160        string cacheKey = $"Interparts_Producers_Search_{name}";
 0161        if (_cache.TryGetValue(cacheKey, out List<Producer>? cached) && cached != null)
 0162            return cached;
 163
 0164        var url = InterpartsApiUrl.ProducersByNameUrl(_config.BaseUrl, name);
 165
 0166        var result = new List<Producer>();
 0167        string? nextUrl = url;
 168
 0169        while (nextUrl != null)
 170        {
 0171            JObject json = _client.MakeRequestGet(nextUrl);
 172
 0173            var page = json["value"]?.ToObject<List<Producer>>();
 0174            if (page != null)
 0175                result.AddRange(page);
 176
 0177            nextUrl = json["@odata.nextLink"]?.ToString();
 178        }
 179
 0180        _cache.Set(cacheKey, result, _cacheOptions);
 0181        return result;
 0182    }
 183
 184    public async Task<Producer?> GetProducerByNameOrPrefix(string nameOrPrefix)
 185    {
 0186        string cacheKey = $"Interparts_Producer_NameOrPrefix_{nameOrPrefix}";
 0187        if (_cache.TryGetValue(cacheKey, out Producer? cached))
 0188            return cached;
 189
 190        // Сначала ищем по точному совпадению имени
 0191        var nameUrl = InterpartsApiUrl.ProducerByNameExactUrl(_config.BaseUrl, nameOrPrefix);
 0192        var nameResult = await GetSingleProducer(nameUrl);
 193
 0194        if (nameResult != null)
 195        {
 0196            _cache.Set(cacheKey, nameResult, _cacheOptions);
 0197            return nameResult;
 198        }
 199
 200        // Если не найдено по имени, ищем по точному совпадению префикса
 0201        var prefixUrl = InterpartsApiUrl.ProducerByPrefixExactUrl(_config.BaseUrl, nameOrPrefix);
 0202        var prefixResult = await GetSingleProducer(prefixUrl);
 203
 0204        if (prefixResult != null)
 205        {
 0206            _cache.Set(cacheKey, prefixResult, _cacheOptions);
 0207            return prefixResult;
 208        }
 209
 210        // Если не найдено, возвращаем null
 0211        return null;
 0212    }
 213
 214    public async Task<Producer?> GetProducerByNameOrPrefixWithFallback(string nameOrPrefix)
 215    {
 0216        string cacheKey = $"Interparts_Producer_NameOrPrefix_Fallback_{nameOrPrefix}";
 0217        if (_cache.TryGetValue(cacheKey, out Producer? cached))
 0218            return cached;
 219
 220        // Сначала ищем по точному совпадению имени
 0221        var nameUrl = InterpartsApiUrl.ProducerByNameExactUrl(_config.BaseUrl, nameOrPrefix);
 0222        var nameResult = await GetSingleProducer(nameUrl);
 223
 0224        if (nameResult != null)
 225        {
 0226            _cache.Set(cacheKey, nameResult, _cacheOptions);
 0227            return nameResult;
 228        }
 229
 230        // Затем по точному совпадению префикса
 0231        var prefixUrl = InterpartsApiUrl.ProducerByPrefixExactUrl(_config.BaseUrl, nameOrPrefix);
 0232        var prefixResult = await GetSingleProducer(prefixUrl);
 233
 0234        if (prefixResult != null)
 235        {
 0236            _cache.Set(cacheKey, prefixResult, _cacheOptions);
 0237            return prefixResult;
 238        }
 239
 240        // Если не найдено точное совпадение, ищем по частичному совпадению имени
 0241        var nameContainsUrl = InterpartsApiUrl.ProducersByNameUrl(_config.BaseUrl, nameOrPrefix);
 0242        var nameContainsResult = await GetFirstProducer(nameContainsUrl);
 243
 0244        if (nameContainsResult != null)
 245        {
 0246            _cache.Set(cacheKey, nameContainsResult, _cacheOptions);
 0247            return nameContainsResult;
 248        }
 249
 250        // И по частичному совпадению префикса
 0251        var prefixContainsUrl = InterpartsApiUrl.ProducersByPrefixUrl(_config.BaseUrl, nameOrPrefix);
 0252        var prefixContainsResult = await GetFirstProducer(prefixContainsUrl);
 253
 0254        if (prefixContainsResult != null)
 255        {
 0256            _cache.Set(cacheKey, prefixContainsResult, _cacheOptions);
 0257            return prefixContainsResult;
 258        }
 259
 0260        return null;
 0261    }
 262
 263    private async Task<Producer?> GetSingleProducer(string url)
 264    {
 0265        await Task.CompletedTask;
 266        try
 267        {
 0268            JObject json = _client.MakeRequestGet(url);
 0269            var producers = json["value"]?.ToObject<List<Producer>>();
 270
 0271            return producers?.FirstOrDefault();
 272        }
 0273        catch (Exception)
 274        {
 275            // Логируем ошибку, но не прерываем выполнение
 0276            return null;
 277        }
 0278    }
 279
 280    private async Task<Producer?> GetFirstProducer(string url)
 281    {
 0282        await Task.CompletedTask;
 283        try
 284        {
 0285            JObject json = _client.MakeRequestGet(url);
 0286            var producers = json["value"]?.ToObject<List<Producer>>();
 287
 0288            return producers?.FirstOrDefault();
 289        }
 290        catch (Exception)
 291        {
 0292            await Task.CompletedTask;
 293            // Логируем ошибку
 0294            return null;
 295        }
 0296    }
 297
 298    public async Task<Producer?> GetProducerByIdWithRealId(int producerId)
 299    {
 0300        await Task.CompletedTask;
 0301        string cacheKey = $"Interparts_Producer_WithRealId_{producerId}";
 0302        if (_cache.TryGetValue(cacheKey, out Producer? cached))
 0303            return cached;
 304
 0305        var url = InterpartsApiUrl.ProducerByIdWithRealIdUrl(_config.BaseUrl, producerId);
 306
 307        try
 308        {
 0309            JObject json = _client.MakeRequestGet(url);
 0310            var producers = json["value"]?.ToObject<List<Producer>>();
 0311            var producer = producers?.FirstOrDefault();
 312
 0313            if (producer != null)
 0314                _cache.Set(cacheKey, producer, _cacheOptions);
 315
 0316            return producer;
 317        }
 0318        catch (Exception)
 319        {
 0320            return null;
 321        }
 0322    }
 323}