< Summary

Information
Class: Services.SupplierStatusServices.Providers.LocalCartStatusReader
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/SupplierStatusServices/Providers/LocalCartStatusReader.cs
Line coverage
86%
Covered lines: 85
Uncovered lines: 13
Coverable lines: 98
Total lines: 134
Line coverage: 86.7%
Branch coverage
50%
Covered branches: 42
Total branches: 83
Branch coverage: 50.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
ReadAsync()100%88100%
LoadStatusesAsync()36.5%816383.6%
CartStatusName(...)91.66%121290%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/SupplierStatusServices/Providers/LocalCartStatusReader.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using OzonDomains.Models;
 3using OzonDomains.Models.SupplierStatuses;
 4using OzonRepositories.Context;
 5
 6namespace Services.SupplierStatusServices.Providers;
 7
 8/// <summary>
 9/// Чтение стадии корзины для поставщиков с локальной корзиной (Armtek RU/BY, ML-Auto BY/RU, Berg).
 10/// API здесь не нужен: статус лежит в наших же таблицах *CartItems. Прогон дешёвый и заодно
 11/// ловит расхождения, когда строку меняют мимо точек записи — например пакетным
 12/// ExecuteUpdateAsync при захвате Processing в ArmtekCartService.
 13/// </summary>
 14public sealed class LocalCartStatusReader
 15{
 16    private readonly ApplicationDbContext _db;
 17
 28818    public LocalCartStatusReader(ApplicationDbContext db) => _db = db;
 19
 20    public async Task<IReadOnlyList<SupplierStatusSnapshot>> ReadAsync(
 21        string providerKey, IReadOnlyList<OrderSupplierStateRef> states, CancellationToken ct)
 22    {
 3023        if (states.Count == 0) return [];
 24
 4525        var orderIds = states.Select(x => x.OrderId).Distinct().ToList();
 2226        var statusByOrderId = await LoadStatusesAsync(providerKey, orderIds, ct);
 27
 2228        var result = new List<SupplierStatusSnapshot>(states.Count);
 9029        foreach (var state in states)
 30        {
 31            // Строки нет — её удалили из корзины (жёстко или мимо Studio2). Закрываем состояние.
 2332            var code = statusByOrderId.TryGetValue(state.OrderId, out var status) && !string.IsNullOrWhiteSpace(status)
 2333                ? status
 2334                : SupplierCartStatusCode.Removed;
 35
 2336            result.Add(new SupplierStatusSnapshot
 2337            {
 2338                OrderId = state.OrderId,
 2339                Kind = SupplierStatusKind.Cart,
 2340                ExternalCode = code,
 2341                StatusName = CartStatusName(code)
 2342            });
 43        }
 44
 2245        return result;
 2646    }
 47
 48    private async Task<Dictionary<int, string>> LoadStatusesAsync(
 2249        string providerKey, List<int> orderIds, CancellationToken ct) => providerKey switch
 2250    {
 2251        ApiSupplierSettings.ArmtekProviderKey or ApiSupplierSettings.ArmtekByProviderKey =>
 452            await _db.ArmtekCartItems
 453                .Where(x => x.ProviderKey == providerKey && x.ActiveStudioOrderId != null
 454                            && orderIds.Contains(x.ActiveStudioOrderId.Value))
 455                .GroupBy(x => x.ActiveStudioOrderId!.Value)
 456                .Select(g => new { OrderId = g.Key, Status = g.OrderByDescending(x => x.UpdatedAtUtc).Select(x => x.Stat
 857                .ToDictionaryAsync(x => x.OrderId, x => x.Status, ct),
 2258
 2259        ApiSupplierSettings.MlAutoProviderKey =>
 460            await _db.MlAutoCartItems
 461                .Where(x => x.ActiveStudioOrderId != null && orderIds.Contains(x.ActiveStudioOrderId.Value))
 462                .GroupBy(x => x.ActiveStudioOrderId!.Value)
 463                .Select(g => new { OrderId = g.Key, Status = g.OrderByDescending(x => x.UpdatedAtUtc).Select(x => x.Stat
 1064                .ToDictionaryAsync(x => x.OrderId, x => x.Status, ct),
 2265
 2266        ApiSupplierSettings.MlAutoRuProviderKey =>
 167            await _db.MlAutoRuCartItems
 168                .Where(x => x.ActiveStudioOrderId != null && orderIds.Contains(x.ActiveStudioOrderId.Value))
 169                .GroupBy(x => x.ActiveStudioOrderId!.Value)
 170                .Select(g => new { OrderId = g.Key, Status = g.OrderByDescending(x => x.UpdatedAtUtc).Select(x => x.Stat
 371                .ToDictionaryAsync(x => x.OrderId, x => x.Status, ct),
 2272
 2273        ApiSupplierSettings.ForumAutoProviderKey or ApiSupplierSettings.ForumAutoInterpartsProviderKey or ApiSupplierSet
 074            await _db.ForumAutoCartItems
 075                .Where(x => x.ProviderKey == providerKey && x.ActiveStudioOrderId != null
 076                            && orderIds.Contains(x.ActiveStudioOrderId.Value))
 077                .GroupBy(x => x.ActiveStudioOrderId!.Value)
 078                .Select(g => new { OrderId = g.Key, Status = g.OrderByDescending(x => x.UpdatedAtUtc).Select(x => x.Stat
 079                .ToDictionaryAsync(x => x.OrderId, x => x.Status, ct),
 2280
 2281        ApiSupplierSettings.FavoritPartsProviderKey =>
 082            await _db.FavoritPartsCartItems
 083                .Where(x => x.ActiveStudioOrderId != null && orderIds.Contains(x.ActiveStudioOrderId.Value))
 084                .GroupBy(x => x.ActiveStudioOrderId!.Value)
 085                .Select(g => new { OrderId = g.Key, Status = g.OrderByDescending(x => x.UpdatedAtUtc).Select(x => x.Stat
 086                .ToDictionaryAsync(x => x.OrderId, x => x.Status, ct),
 2287
 2288        ApiSupplierSettings.BergProviderKey =>
 689            await _db.BergCartItems
 690                .Where(x => x.ActiveStudioOrderId != null && orderIds.Contains(x.ActiveStudioOrderId.Value))
 691                .GroupBy(x => x.ActiveStudioOrderId!.Value)
 692                .Select(g => new { OrderId = g.Key, Status = g.OrderByDescending(x => x.UpdatedAtUtc).Select(x => x.Stat
 1693                .ToDictionaryAsync(x => x.OrderId, x => x.Status, ct),
 2294
 2295        ApiSupplierSettings.ProfitLigaProviderKey =>
 296            await _db.ProfitLigaCartItems
 297                .Where(x => x.ActiveStudioOrderId != null && orderIds.Contains(x.ActiveStudioOrderId.Value))
 298                .GroupBy(x => x.ActiveStudioOrderId!.Value)
 299                .Select(g => new { OrderId = g.Key, Status = g.OrderByDescending(x => x.UpdatedAtUtc).Select(x => x.Stat
 4100                .ToDictionaryAsync(x => x.OrderId, x => x.Status, ct),
 22101
 22102        ApiSupplierSettings.MotexProviderKey =>
 2103            await _db.MotexCartItems
 2104                .Where(x => x.ActiveStudioOrderId != null && orderIds.Contains(x.ActiveStudioOrderId.Value))
 2105                .GroupBy(x => x.ActiveStudioOrderId!.Value)
 2106                .Select(g => new { OrderId = g.Key, Status = g.OrderByDescending(x => x.UpdatedAtUtc).Select(x => x.Stat
 6107                .ToDictionaryAsync(x => x.OrderId, x => x.Status, ct),
 22108
 22109        ApiSupplierSettings.ZZapMoscowProviderKey =>
 3110            await _db.ZZapCartItems
 3111                .Where(x => x.ProviderKey == providerKey && x.ActiveStudioOrderId != null
 3112                            && orderIds.Contains(x.ActiveStudioOrderId.Value))
 3113                .GroupBy(x => x.ActiveStudioOrderId!.Value)
 3114                .Select(g => new { OrderId = g.Key, Status = g.OrderByDescending(x => x.UpdatedAtUtc).Select(x => x.Stat
 7115                .ToDictionaryAsync(x => x.OrderId, x => x.Status, ct),
 22116
 0117        _ => new Dictionary<int, string>()
 22118    };
 119
 120    /// <summary>
 121    /// Имя используется только при автосоздании статуса, если сид справочника не применялся:
 122    /// резолвер сначала ищет запись по коду.
 123    /// </summary>
 23124    private static string CartStatusName(string code) => code switch
 23125    {
 6126        SupplierCartStatusCode.Pending => "В корзине, нужна проверка",
 5127        SupplierCartStatusCode.Ready => "Проверен, готов к заказу",
 2128        SupplierCartStatusCode.Processing => "Оформляется",
 2129        SupplierCartStatusCode.Ordered => "Заказан у поставщика",
 1130        SupplierCartStatusCode.Failed => "Ошибка проверки",
 7131        SupplierCartStatusCode.Removed => "Удалён из корзины",
 0132        _ => code
 23133    };
 134}