< Summary

Information
Class: OzonOrdersWeb.TagHelpers.FieldAccessTagHelper
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/TagHelpers/FieldAccessTagHelper.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 20
Coverable lines: 20
Total lines: 57
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 14
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%
get_Entity()100%210%
get_Field()100%210%
get_Access()100%210%
get_KeepTag()100%210%
ProcessAsync()0%210140%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/TagHelpers/FieldAccessTagHelper.cs

#LineLine coverage
 1using System.Security.Claims;
 2using Microsoft.AspNetCore.Http;
 3using Microsoft.AspNetCore.Mvc.Rendering;
 4using Microsoft.AspNetCore.Mvc.ViewFeatures;
 5using Microsoft.AspNetCore.Razor.TagHelpers;
 6using OzonDomains.Models.Authorization.Enums;
 7using Services.Authorization.Services;
 8
 9namespace OzonOrdersWeb.TagHelpers;
 10
 11/// <summary>
 12/// <field-access entity="Order" field="Price" access="read|write">...</field-access>
 13/// Скрывает содержимое если у текущего пользователя нет указанного доступа к полю.
 14/// </summary>
 15[HtmlTargetElement("field-access", Attributes = "entity,field,access")]
 16public sealed class FieldAccessTagHelper : TagHelper
 17{
 18    private readonly IPermissionService _permissions;
 19    private readonly IHttpContextAccessor _http;
 20
 021    public FieldAccessTagHelper(IPermissionService permissions, IHttpContextAccessor http)
 22    {
 023        _permissions = permissions;
 024        _http = http;
 025    }
 26
 027    [HtmlAttributeName("entity")] public string Entity { get; set; } = string.Empty;
 028    [HtmlAttributeName("field")] public string Field { get; set; } = string.Empty;
 29
 30    /// <summary>"read" (default) или "write".</summary>
 031    [HtmlAttributeName("access")] public string Access { get; set; } = "read";
 32
 33    /// <summary>Если true — при отсутствии прав рендерится обёртка без контента (false — убирается целиком).</summary>
 034    [HtmlAttributeName("keep-tag")] public bool KeepTag { get; set; }
 35
 36    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
 37    {
 038        output.TagName = KeepTag ? "span" : null;
 39
 040        var userId = _http.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;
 041        if (string.IsNullOrWhiteSpace(userId))
 42        {
 043            output.SuppressOutput();
 044            return;
 45        }
 46
 047        var accessType = string.Equals(Access, "write", StringComparison.OrdinalIgnoreCase)
 048            ? AccessType.Write
 049            : AccessType.Read;
 50
 051        var allowed = await _permissions.HasFieldAccessAsync(userId, Entity, Field, accessType);
 052        if (!allowed)
 53        {
 054            output.SuppressOutput();
 55        }
 056    }
 57}