< Summary

Information
Class: OzonOrdersWeb.Areas.Studio2.Controllers.Base.SubmittedOrderFields
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/Base/SubmittedOrderFields.cs
Line coverage
100%
Covered lines: 22
Uncovered lines: 0
Coverable lines: 22
Total lines: 62
Line coverage: 100%
Branch coverage
100%
Covered branches: 16
Total branches: 16
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
.ctor(...)100%11100%
get_Empty()100%11100%
FromForm(...)100%1414100%
For(...)100%22100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/Base/SubmittedOrderFields.cs

#LineLine coverage
 1using System.Text.RegularExpressions;
 2
 3namespace OzonOrdersWeb.Areas.Studio2.Controllers.Base;
 4
 5/// <summary>
 6/// Какие поля заказа реально пришли с формы транзакции.
 7/// Колонка, закрытая правами доступа, не рендерится, поэтому её поле приходит как null —
 8/// а null для статуса, поставщика и номера заказа поставщику трактуется как «очистить значение».
 9/// Список присланных полей позволяет отличить очистку от отсутствия поля в форме.
 10/// </summary>
 11public sealed class SubmittedOrderFields
 12{
 113    private static readonly Regex FieldKey = new(
 114        @"^Orders\[(?<index>\d+)\]\.(?<property>[^.\[]+)",
 115        RegexOptions.IgnoreCase | RegexOptions.Compiled);
 16
 17    private readonly Dictionary<int, HashSet<string>> _byOrderId;
 18
 1219    private SubmittedOrderFields(Dictionary<int, HashSet<string>> byOrderId) => _byOrderId = byOrderId;
 20
 21    /// <summary>Пустой список: все заказы обрабатываются по прежним правилам.</summary>
 222    public static SubmittedOrderFields Empty { get; } = new(new Dictionary<int, HashSet<string>>());
 23
 24    public static SubmittedOrderFields FromForm(IFormCollection? form)
 25    {
 626        if (form == null || form.Count == 0)
 127            return Empty;
 28
 529        var byIndex = new Dictionary<int, HashSet<string>>();
 3230        foreach (var key in form.Keys)
 31        {
 1132            var match = FieldKey.Match(key);
 1133            if (!match.Success)
 34                continue;
 35
 1036            var index = int.Parse(match.Groups["index"].Value);
 1037            if (!byIndex.TryGetValue(index, out var properties))
 38            {
 639                properties = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
 640                byIndex[index] = properties;
 41            }
 42
 1043            properties.Add(match.Groups["property"].Value);
 44        }
 45
 546        var byOrderId = new Dictionary<int, HashSet<string>>();
 2247        foreach (var (index, properties) in byIndex)
 48        {
 49            // Заказ опознаём по его же скрытому полю Id: индексы строк не совпадают с идентификаторами.
 650            if (int.TryParse(form[$"Orders[{index}].Id"].FirstOrDefault(), out var orderId))
 551                byOrderId[orderId] = properties;
 52        }
 53
 554        return new SubmittedOrderFields(byOrderId);
 55    }
 56
 57    /// <summary>
 58    /// Поля, присланные для заказа, либо null — если строки в форме не было и судить не о чем.
 59    /// </summary>
 60    public IReadOnlySet<string>? For(int orderId) =>
 861        _byOrderId.TryGetValue(orderId, out var properties) ? properties : null;
 62}