| | | 1 | | using System.Security.Claims; |
| | | 2 | | using Microsoft.AspNetCore.Mvc.Rendering; |
| | | 3 | | using OzonDomains.Models.AccessControl; |
| | | 4 | | using OzonRepositories.Authorization; |
| | | 5 | | using Services.CacheServices.Cache.UserCacheService; |
| | | 6 | | using Services.DataServices; |
| | | 7 | | |
| | | 8 | | namespace OzonOrdersWeb.WebServices.Orders.Grid; |
| | | 9 | | |
| | | 10 | | public sealed class OrdersGridFilterOptionsDto |
| | | 11 | | { |
| | 0 | 12 | | public List<OrdersGridOption> AppStatuses { get; set; } = []; |
| | | 13 | | |
| | 0 | 14 | | public List<OrdersGridOption> ClientStatuses { get; set; } = []; |
| | | 15 | | |
| | 0 | 16 | | public List<OrdersGridOption> Suppliers { get; set; } = []; |
| | | 17 | | |
| | 0 | 18 | | public List<OrdersGridOption> Clients { get; set; } = []; |
| | | 19 | | |
| | 0 | 20 | | public List<OrdersGridOption> Warehouses { get; set; } = []; |
| | | 21 | | |
| | 0 | 22 | | public List<OrdersGridOption> Providers { get; set; } = []; |
| | | 23 | | |
| | 0 | 24 | | public List<OrdersGridOption> DeliveryNames { get; set; } = []; |
| | | 25 | | |
| | 0 | 26 | | public List<OrdersGridOption> SupplierStatuses { get; set; } = []; |
| | | 27 | | |
| | 0 | 28 | | public Dictionary<string, string> StatusColors { get; set; } = new(); |
| | | 29 | | |
| | 0 | 30 | | public Dictionary<string, string> ClientStatusColors { get; set; } = new(); |
| | | 31 | | } |
| | | 32 | | |
| | | 33 | | public 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 | | |
| | | 48 | | public interface IOrdersGridFilterOptionsService |
| | | 49 | | { |
| | | 50 | | Task<OrdersGridFilterOptionsDto> BuildAsync(ClaimsPrincipal principal, CancellationToken cancellationToken); |
| | | 51 | | } |
| | | 52 | | |
| | | 53 | | /// <summary> |
| | | 54 | | /// Справочники колоночных фильтров грида: обёртка над <see cref="IOrderFilterListsService"/> |
| | | 55 | | /// (те же ограничения по AccessProfile и RLS, что и на старой странице). |
| | | 56 | | /// </summary> |
| | | 57 | | public 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 | | } |