< Summary

Information
Class: OzonOrdersWeb.TransactionServices.SupplierQueueTargets
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Services/Transactions/SupplierQueueTargets.cs
Line coverage
91%
Covered lines: 61
Uncovered lines: 6
Coverable lines: 67
Total lines: 149
Line coverage: 91%
Branch coverage
80%
Covered branches: 40
Total branches: 50
Branch coverage: 80%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Extract(...)100%1414100%
RemoveBlocked(...)71.42%141491.3%
EnumerateItems(...)50%4484.61%
ReadOrderId(...)66.66%131280%
ReadString(...)100%66100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Services/Transactions/SupplierQueueTargets.cs

#LineLine coverage
 1using System.Globalization;
 2using System.Text.Json;
 3using OzonOrdersWeb.WebServices.Transactions;
 4
 5namespace OzonOrdersWeb.TransactionServices;
 6
 7/// <summary>
 8/// Разбор клиентских очередей поставщиков (<c>*CheckoutQueueJson</c> — прямой заказ, <c>*BasketQueueJson</c> — корзина)
 9/// в список «заказ Studio2 → поставщик → намерение» для <see cref="ISupplierOrderGuard"/>.
 10/// Провайдер берётся из поля <c>providerKey</c> строки очереди (Armtek/ArmtekBy, Форум-Авто, Фаворит), иначе — из имени
 11/// </summary>
 12public static class SupplierQueueTargets
 13{
 14    private const string CheckoutSuffix = "CheckoutQueueJson";
 15    private const string BasketSuffix = "BasketQueueJson";
 16
 17    public static List<SupplierOrderTarget> Extract(IEnumerable<KeyValuePair<string, string>> queues)
 18    {
 3019        var targets = new List<SupplierOrderTarget>();
 13020        foreach (var (key, json) in queues)
 21        {
 3522            if (string.IsNullOrWhiteSpace(json)) continue;
 23
 24            SupplierOrderAction intent;
 25            string prefix;
 3526            if (key.EndsWith(CheckoutSuffix, StringComparison.OrdinalIgnoreCase))
 27            {
 2228                intent = SupplierOrderAction.Order;
 2229                prefix = key[..^CheckoutSuffix.Length];
 30            }
 1331            else if (key.EndsWith(BasketSuffix, StringComparison.OrdinalIgnoreCase))
 32            {
 1133                intent = SupplierOrderAction.Cart;
 1134                prefix = key[..^BasketSuffix.Length];
 35            }
 36            else
 37            {
 38                continue;
 39            }
 40
 3341            var defaultProvider = SupplierQueueOrderIds.ProviderKeyFromQueuePrefix(prefix);
 13242            foreach (var item in EnumerateItems(json))
 43            {
 3344                var orderId = ReadOrderId(item);
 3345                if (orderId <= 0) continue;
 3346                var provider = ReadString(item, "providerKey");
 3347                targets.Add(new SupplierOrderTarget(orderId, string.IsNullOrWhiteSpace(provider) ? defaultProvider : pro
 48            }
 49        }
 50
 3051        return targets.Distinct().ToList();
 52    }
 53
 54    /// <summary>Очередь без позиций, чей заказ у данного поставщика заблокирован защитой от повторных заказов.</summary
 55    public static string RemoveBlocked(string key, string json, IReadOnlySet<(int OrderId, string ProviderKey)> blocked)
 56    {
 357        var defaultProvider = SupplierQueueOrderIds.ProviderKeyFromQueuePrefix(
 358            key.EndsWith(CheckoutSuffix, StringComparison.OrdinalIgnoreCase) ? key[..^CheckoutSuffix.Length]
 359            : key.EndsWith(BasketSuffix, StringComparison.OrdinalIgnoreCase) ? key[..^BasketSuffix.Length]
 360            : key);
 61        JsonDocument document;
 62        try
 63        {
 364            document = JsonDocument.Parse(json);
 365        }
 066        catch (JsonException)
 67        {
 068            return json;
 69        }
 70
 371        using (document)
 72        {
 373            if (document.RootElement.ValueKind != JsonValueKind.Array) return json;
 74
 375            using var stream = new MemoryStream();
 376            using (var writer = new Utf8JsonWriter(stream))
 77            {
 378                writer.WriteStartArray();
 1679                foreach (var item in document.RootElement.EnumerateArray())
 80                {
 581                    if (item.ValueKind == JsonValueKind.Object)
 82                    {
 583                        var provider = ReadString(item, "providerKey");
 584                        var itemKey = (ReadOrderId(item), string.IsNullOrWhiteSpace(provider) ? defaultProvider : provid
 585                        if (blocked.Contains(itemKey)) continue;
 86                    }
 87
 388                    item.WriteTo(writer);
 89                }
 90
 391                writer.WriteEndArray();
 392            }
 93
 394            return System.Text.Encoding.UTF8.GetString(stream.ToArray());
 95        }
 396    }
 97
 98    private static List<JsonElement> EnumerateItems(string json)
 99    {
 100        JsonDocument document;
 101        try
 102        {
 33103            document = JsonDocument.Parse(json);
 32104        }
 1105        catch (JsonException)
 106        {
 107            // Битую очередь отклоняет разбор в процессоре корзин; для защиты от дублей она пуста.
 1108            return [];
 109        }
 110
 32111        using (document)
 112        {
 32113            var root = document.RootElement;
 32114            return root.ValueKind switch
 32115            {
 98116                JsonValueKind.Array => root.EnumerateArray().Where(x => x.ValueKind == JsonValueKind.Object).Select(x =>
 0117                JsonValueKind.Object => [root.Clone()],
 0118                _ => []
 32119            };
 120        }
 33121    }
 122
 123    private static int ReadOrderId(JsonElement item)
 124    {
 114125        foreach (var property in item.EnumerateObject())
 126        {
 38127            if (!string.Equals(property.Name, "orderId", StringComparison.OrdinalIgnoreCase)) continue;
 38128            return property.Value.ValueKind switch
 38129            {
 74130                JsonValueKind.Number when property.Value.TryGetInt32(out var number) => number,
 2131                JsonValueKind.String when int.TryParse(property.Value.GetString(), NumberStyles.None, CultureInfo.Invari
 0132                _ => 0
 38133            };
 134        }
 135
 0136        return 0;
 38137    }
 138
 139    private static string? ReadString(JsonElement item, string name)
 140    {
 214141        foreach (var property in item.EnumerateObject())
 142        {
 79143            if (string.Equals(property.Name, name, StringComparison.OrdinalIgnoreCase) && property.Value.ValueKind == Js
 20144                return property.Value.GetString();
 145        }
 146
 18147        return null;
 20148    }
 149}