< Summary

Information
Class: OzonOrdersWeb.WebServices.Orders.Grid.OrdersGridFilterOptionsService
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Orders/Grid/OrdersGridFilterOptionsService.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 57
Coverable lines: 57
Total lines: 140
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 26
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
BuildAsync()0%7280%
FromSelectList(...)0%342180%

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{
 35    public string Value { get; set; } = string.Empty;
 36
 37    public string Text { get; set; } = string.Empty;
 38
 39    public string? Color { get; set; }
 40
 41    public bool IsFinal { get; set; }
 42
 43    public int? Id { get; set; }
 44
 45    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
 064    public OrdersGridFilterOptionsService(
 065        IOrderFilterListsService filterListsService,
 066        IUserCacheService userCacheService,
 067        AccessProfileDataServices accessProfileDataServices,
 068        IUserScopeProvider userScopeProvider)
 69    {
 070        _filterListsService = filterListsService;
 071        _userCacheService = userCacheService;
 072        _accessProfileDataServices = accessProfileDataServices;
 073        _userScopeProvider = userScopeProvider;
 074    }
 75
 76    public async Task<OrdersGridFilterOptionsDto> BuildAsync(ClaimsPrincipal principal, CancellationToken cancellationTo
 77    {
 078        var user = await _userCacheService.GetCachedUserAsync(principal);
 079        AccessProfile? accessProfile = null;
 080        if (user?.AccessProfileId is > 0)
 81        {
 082            accessProfile = await _accessProfileDataServices.GetAccessProfileAsync(user.AccessProfileId.Value);
 83        }
 84
 085        var data = await _filterListsService.BuildAsync(new OrderFilterListsBuildRequest
 086        {
 087            AccessProfile = accessProfile,
 088            UseFilteredData = false,
 089            UserId = user?.Id,
 090            OrderScopeExpression = _userScopeProvider.GetFilterExpression("Order")
 091        }, cancellationToken);
 92
 093        return new OrdersGridFilterOptionsDto
 094        {
 095            AppStatuses = FromSelectList(data.AppStatuses, data.StatusColors, data.AppStatusIsFinal),
 096            ClientStatuses = FromSelectList(data.Statuses, data.ClientStatusColors, data.StatusesIsFinal),
 097            Suppliers = FromSelectList(data.Suppliers),
 098            Clients = FromSelectList(data.Clients),
 099            Warehouses = FromSelectList(data.Warehouses),
 0100            Providers = FromSelectList(data.Providers),
 0101            DeliveryNames = FromSelectList(data.DeliveryNames),
 0102            SupplierStatuses = data.SupplierStatuses
 0103                .Select(s => new OrdersGridOption
 0104                {
 0105                    Id = s.Id,
 0106                    Value = s.Id.ToString(),
 0107                    Text = s.Name,
 0108                    Color = s.GetStatusColor(),
 0109                    Group = s.ProviderKey
 0110                })
 0111                .ToList(),
 0112            StatusColors = data.StatusColors,
 0113            ClientStatusColors = data.ClientStatusColors
 0114        };
 0115    }
 116
 117    private static List<OrdersGridOption> FromSelectList(
 118        SelectList list,
 119        IReadOnlyDictionary<string, string>? colors = null,
 120        IReadOnlyDictionary<string, string>? isFinal = null)
 121    {
 0122        var result = new List<OrdersGridOption>();
 0123        foreach (SelectListItem item in list)
 124        {
 0125            var text = item.Text ?? item.Value ?? string.Empty;
 0126            if (string.IsNullOrWhiteSpace(text)) continue;
 127
 0128            result.Add(new OrdersGridOption
 0129            {
 0130                Value = item.Value ?? text,
 0131                Text = text,
 0132                Color = colors != null && colors.TryGetValue(text, out var color) ? color : null,
 0133                IsFinal = isFinal != null && isFinal.TryGetValue(text, out var f)
 0134                          && string.Equals(f, "true", StringComparison.OrdinalIgnoreCase)
 0135            });
 136        }
 137
 0138        return result;
 139    }
 140}