< Summary

Information
Class: OzonOrdersWeb.WebServices.Orders.Grid.AgGridFilterModelItem
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Orders/Grid/AgGridDataRequest.cs
Line coverage
100%
Covered lines: 9
Uncovered lines: 0
Coverable lines: 9
Total lines: 117
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_FilterType()100%11100%
get_Type()100%11100%
get_Filter()100%11100%
get_FilterTo()100%11100%
get_DateFrom()100%11100%
get_DateTo()100%11100%
get_Values()100%11100%
get_Value()100%11100%
get_Id()100%11100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Orders/Grid/AgGridDataRequest.cs

#LineLine coverage
 1using System.Text.Json;
 2
 3namespace OzonOrdersWeb.WebServices.Orders.Grid;
 4
 5/// <summary>
 6/// Запрос блока строк от AG Grid (Infinite Row Model): диапазон, сортировка, колоночные фильтры и состояние тулбара.
 7/// </summary>
 8public sealed class AgGridDataRequest
 9{
 10    public int StartRow { get; set; }
 11
 12    public int EndRow { get; set; }
 13
 14    public List<AgGridSortModelItem> SortModel { get; set; } = [];
 15
 16    public Dictionary<string, AgGridFilterModelItem> FilterModel { get; set; } = new(StringComparer.OrdinalIgnoreCase);
 17
 18    /// <summary>Глобальный поиск (номер заказа / артикул / наименование).</summary>
 19    public string? Search { get; set; }
 20
 21    public bool IncludeArchived { get; set; }
 22
 23    /// <summary>Устаревший флаг; эквивалент <c>GroupBy = "shipment"</c>.</summary>
 24    public bool GroupByShipment { get; set; }
 25
 26    /// <summary>Группировка: "shipment" или colId справочной колонки (см. <see cref="OrdersGridGrouping"/>); null — без
 27    public string? GroupBy { get; set; }
 28
 29    /// <summary>Дополнительные флаги как в настройках поиска классической страницы.</summary>
 30    public AgGridExtraFlags Extra { get; set; } = new();
 31
 32    /// <summary>Показать только эти заказы (например, выделенные, сгруппированные по колонке); null — без ограничения.<
 33    public List<int>? OnlyIds { get; set; }
 34}
 35
 36/// <summary>Лимиты на запрос грида — защита от произвольно тяжёлых SQL (много фильтров/сортировок/значений).</summary>
 37public static class AgGridRequestLimits
 38{
 39    public const int MaxFilters = 40;
 40    public const int MaxSorts = 5;
 41    public const int MaxSetValues = 200;
 42    public const int MaxTextLength = 500;
 43
 44    /// <summary>Сообщение об ошибке или null, если запрос в пределах лимитов.</summary>
 45    public static string? Validate(Dictionary<string, AgGridFilterModelItem>? filterModel, List<AgGridSortModelItem>? so
 46    {
 47        if (filterModel is { Count: > MaxFilters }) return $"Слишком много фильтров (максимум {MaxFilters}).";
 48        if (sortModel is { Count: > MaxSorts }) return $"Слишком много столбцов сортировки (максимум {MaxSorts}).";
 49        if (filterModel != null)
 50        {
 51            foreach (var (colId, item) in filterModel)
 52            {
 53                if (colId.Length > 64) return "Некорректный идентификатор колонки фильтра.";
 54                if (item is null) continue;
 55                if (item.Values is { Count: > MaxSetValues }) return $"Слишком много значений в фильтре «{colId}» (макси
 56                if (item.Value is { Length: > MaxTextLength } || item.DateFrom is { Length: > 64 } || item.DateTo is { L
 57                if (item.Filter is { ValueKind: System.Text.Json.JsonValueKind.String } f && f.GetString()!.Length > Max
 58            }
 59        }
 60
 61        return null;
 62    }
 63}
 64
 65public sealed class AgGridExtraFlags
 66{
 67    public bool OnlyWithZasyl { get; set; }
 68
 69    public bool OnlyWithReturns { get; set; }
 70
 71    public bool OnlyWithTrackingNumber { get; set; }
 72
 73    public string? ReturnLogisticBarcode { get; set; }
 74
 75    /// <summary>Синхронизировать статусы клиента (Ozon) для загружаемого блока — как на классической странице.</summary
 76    public bool SyncClientStatuses { get; set; }
 77}
 78
 79public sealed class AgGridSortModelItem
 80{
 81    public string ColId { get; set; } = string.Empty;
 82
 83    /// <summary>"asc" | "desc".</summary>
 84    public string Sort { get; set; } = "asc";
 85}
 86
 87/// <summary>
 88/// Модель одного колоночного фильтра AG Grid. Для text/number/date — стандартные поля грида,
 89/// для кастомного select-фильтра — <see cref="Value"/> / <see cref="Id"/>.
 90/// </summary>
 91public sealed class AgGridFilterModelItem
 92{
 93    /// <summary>"text" | "number" | "date" | "set" (множественный выбор справочника).</summary>
 21594    public string FilterType { get; set; } = "text";
 95
 96    /// <summary>contains | equals | greaterThan | lessThan | inRange.</summary>
 15197    public string? Type { get; set; }
 98
 99    /// <summary>Значение text/number фильтра: строка или число — поэтому JsonElement.</summary>
 127100    public JsonElement? Filter { get; set; }
 101
 41102    public JsonElement? FilterTo { get; set; }
 103
 104    /// <summary>Дата в формате "yyyy-MM-dd HH:mm:ss" (как отдаёт agDateColumnFilter).</summary>
 44105    public string? DateFrom { get; set; }
 106
 10107    public string? DateTo { get; set; }
 108
 109    /// <summary>Выбранные значения справочного set-фильтра (имена или id для статусов поставщика).</summary>
 124110    public List<string>? Values { get; set; }
 111
 112    /// <summary>Одно выбранное значение (устаревший single-select; оставлено для совместимости).</summary>
 82113    public string? Value { get; set; }
 114
 115    /// <summary>Выбранный идентификатор справочного фильтра (для статусов поставщика).</summary>
 3116    public int? Id { get; set; }
 117}