< Summary

Information
Class: OzonOrdersWeb.WebServices.Orders.Grid.OrdersGridOption
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Orders/Grid/OrdersGridFilterOptionsService.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 6
Coverable lines: 6
Total lines: 140
Line coverage: 0%
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_Value()100%210%
get_Text()100%210%
get_Color()100%210%
get_IsFinal()100%210%
get_Id()100%210%
get_Group()100%210%

File(s)

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

#LineLine coverage
 1using System.Security.Claims;
 2using Microsoft.AspNetCore.Mvc.Rendering;
 3using OzonDomains.Models.AccessControl;
 4using OzonRepositories.Authorization;
 5using Services.CacheServices.Cache.UserCacheService;
 6using Services.DataServices;
 7
 8namespace OzonOrdersWeb.WebServices.Orders.Grid;
 9
 10public sealed class OrdersGridFilterOptionsDto
 11{
 12    public List<OrdersGridOption> AppStatuses { get; set; } = [];
 13
 14    public List<OrdersGridOption> ClientStatuses { get; set; } = [];
 15
 16    public List<OrdersGridOption> Suppliers { get; set; } = [];
 17
 18    public List<OrdersGridOption> Clients { get; set; } = [];
 19
 20    public List<OrdersGridOption> Warehouses { get; set; } = [];
 21
 22    public List<OrdersGridOption> Providers { get; set; } = [];
 23
 24    public List<OrdersGridOption> DeliveryNames { get; set; } = [];
 25
 26    public List<OrdersGridOption> SupplierStatuses { get; set; } = [];
 27
 28    public Dictionary<string, string> StatusColors { get; set; } = new();
 29
 30    public Dictionary<string, string> ClientStatusColors { get; set; } = new();
 31}
 32
 33public sealed class OrdersGridOption
 34{
 035    public string Value { get; set; } = string.Empty;
 36
 037    public string Text { get; set; } = string.Empty;
 38
 039    public string? Color { get; set; }
 40
 041    public bool IsFinal { get; set; }
 42
 043    public int? Id { get; set; }
 44
 045    public string? Group { get; set; }
 46}
 47
 48public interface IOrdersGridFilterOptionsService
 49{
 50    Task<OrdersGridFilterOptionsDto> BuildAsync(ClaimsPrincipal principal, CancellationToken cancellationToken);
 51}
 52
 53/// <summary>
 54/// Справочники колоночных фильтров грида: обёртка над <see cref="IOrderFilterListsService"/>
 55/// (те же ограничения по AccessProfile и RLS, что и на старой странице).
 56/// </summary>
 57public sealed class OrdersGridFilterOptionsService : IOrdersGridFilterOptionsService
 58{
 59    private readonly IOrderFilterListsService _filterListsService;
 60    private readonly IUserCacheService _userCacheService;
 61    private readonly AccessProfileDataServices _accessProfileDataServices;
 62    private readonly IUserScopeProvider _userScopeProvider;
 63
 64    public OrdersGridFilterOptionsService(
 65        IOrderFilterListsService filterListsService,
 66        IUserCacheService userCacheService,
 67        AccessProfileDataServices accessProfileDataServices,
 68        IUserScopeProvider userScopeProvider)
 69    {
 70        _filterListsService = filterListsService;
 71        _userCacheService = userCacheService;
 72        _accessProfileDataServices = accessProfileDataServices;
 73        _userScopeProvider = userScopeProvider;
 74    }
 75
 76    public async Task<OrdersGridFilterOptionsDto> BuildAsync(ClaimsPrincipal principal, CancellationToken cancellationTo
 77    {
 78        var user = await _userCacheService.GetCachedUserAsync(principal);
 79        AccessProfile? accessProfile = null;
 80        if (user?.AccessProfileId is > 0)
 81        {
 82            accessProfile = await _accessProfileDataServices.GetAccessProfileAsync(user.AccessProfileId.Value);
 83        }
 84
 85        var data = await _filterListsService.BuildAsync(new OrderFilterListsBuildRequest
 86        {
 87            AccessProfile = accessProfile,
 88            UseFilteredData = false,
 89            UserId = user?.Id,
 90            OrderScopeExpression = _userScopeProvider.GetFilterExpression("Order")
 91        }, cancellationToken);
 92
 93        return new OrdersGridFilterOptionsDto
 94        {
 95            AppStatuses = FromSelectList(data.AppStatuses, data.StatusColors, data.AppStatusIsFinal),
 96            ClientStatuses = FromSelectList(data.Statuses, data.ClientStatusColors, data.StatusesIsFinal),
 97            Suppliers = FromSelectList(data.Suppliers),
 98            Clients = FromSelectList(data.Clients),
 99            Warehouses = FromSelectList(data.Warehouses),
 100            Providers = FromSelectList(data.Providers),
 101            DeliveryNames = FromSelectList(data.DeliveryNames),
 102            SupplierStatuses = data.SupplierStatuses
 103                .Select(s => new OrdersGridOption
 104                {
 105                    Id = s.Id,
 106                    Value = s.Id.ToString(),
 107                    Text = s.Name,
 108                    Color = s.GetStatusColor(),
 109                    Group = s.ProviderKey
 110                })
 111                .ToList(),
 112            StatusColors = data.StatusColors,
 113            ClientStatusColors = data.ClientStatusColors
 114        };
 115    }
 116
 117    private static List<OrdersGridOption> FromSelectList(
 118        SelectList list,
 119        IReadOnlyDictionary<string, string>? colors = null,
 120        IReadOnlyDictionary<string, string>? isFinal = null)
 121    {
 122        var result = new List<OrdersGridOption>();
 123        foreach (SelectListItem item in list)
 124        {
 125            var text = item.Text ?? item.Value ?? string.Empty;
 126            if (string.IsNullOrWhiteSpace(text)) continue;
 127
 128            result.Add(new OrdersGridOption
 129            {
 130                Value = item.Value ?? text,
 131                Text = text,
 132                Color = colors != null && colors.TryGetValue(text, out var color) ? color : null,
 133                IsFinal = isFinal != null && isFinal.TryGetValue(text, out var f)
 134                          && string.Equals(f, "true", StringComparison.OrdinalIgnoreCase)
 135            });
 136        }
 137
 138        return result;
 139    }
 140}