< Summary

Information
Class: OzonOrdersWeb.Filters.PimNavViewDataResultFilter
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Filters/PimNavViewDataResultFilter.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 35
Coverable lines: 35
Total lines: 78
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%
OnResultExecutionAsync()0%7280%
EnrichViewData()0%342180%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Filters/PimNavViewDataResultFilter.cs

#LineLine coverage
 1using System.Security.Claims;
 2using Microsoft.AspNetCore.Mvc;
 3using Microsoft.AspNetCore.Mvc.Filters;
 4using Microsoft.AspNetCore.Mvc.ViewFeatures;
 5using OzonOrdersWeb.Authorization;
 6using Services.Authorization.Services;
 7
 8namespace OzonOrdersWeb.Filters;
 9
 10/// <summary>
 11/// Права <see cref="IPermissionService"/> на пункты PIM-меню для <c>_Layout.cshtml</c> (коды страниц, без путей MVC).
 12/// </summary>
 13public sealed class PimNavViewDataResultFilter : IAsyncResultFilter
 14{
 15    private readonly IPermissionService _permissions;
 16
 017    public PimNavViewDataResultFilter(IPermissionService permissions) => _permissions = permissions;
 18
 19    public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
 20    {
 021        if (context.HttpContext.User.Identity?.IsAuthenticated == true
 022            && context.Result is ViewResult { ViewData: { } viewData })
 23        {
 024            await EnrichViewData(viewData, context.HttpContext, context.HttpContext.RequestAborted);
 25        }
 26
 027        await next();
 028    }
 29
 30    private async Task EnrichViewData(ViewDataDictionary viewData, HttpContext http, CancellationToken ct)
 31    {
 032        var userId = http.User.FindFirstValue(ClaimTypes.NameIdentifier);
 033        if (string.IsNullOrEmpty(userId))
 34        {
 035            viewData["UseAppPagePimNav"] = false;
 036            viewData["PimNavAllowedCodes"] = Array.Empty<string>();
 037            viewData["IsAppSuperAdminPim"] = false;
 038            return;
 39        }
 40
 041        if (http.User.IsInRole("Admin"))
 42        {
 043            viewData["UseAppPagePimNav"] = false;
 044            viewData["PimNavAllowedCodes"] = Array.Empty<string>();
 045            viewData["IsAppSuperAdminPim"] = false;
 046            return;
 47        }
 48
 049        var bundle = await _permissions.GetUserPermissionsAsync(userId, ct);
 050        viewData["IsAppSuperAdminPim"] = bundle.IsSuperAdmin;
 051        if (bundle.IsSuperAdmin)
 52        {
 053            viewData["UseAppPagePimNav"] = false;
 054            viewData["PimNavAllowedCodes"] = Array.Empty<string>();
 055            return;
 56        }
 57
 058        if (bundle.Pages is null || bundle.Pages.Count == 0)
 59        {
 060            viewData["UseAppPagePimNav"] = false;
 061            viewData["PimNavAllowedCodes"] = Array.Empty<string>();
 062            return;
 63        }
 64
 065        var byCode = bundle.Pages.ToDictionary(p => p.PageCode, StringComparer.OrdinalIgnoreCase);
 066        var list = new List<string>();
 067        foreach (var code in Studio2PimNavMenuCatalog.AllPimNavPageCodes)
 68        {
 069            if (byCode.TryGetValue(code, out var p) && (p.CanView || p.CanCreate))
 70            {
 071                list.Add(code);
 72            }
 73        }
 74
 075        viewData["UseAppPagePimNav"] = true;
 076        viewData["PimNavAllowedCodes"] = list;
 077    }
 78}