< Summary

Information
Class: AsiBackbone.AspNetCore.Actors.HttpContextAsiBackboneActorContextResolver
Assembly: AsiBackbone.AspNetCore
File(s): /home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.AspNetCore/Actors/HttpContextAsiBackboneActorContextResolver.cs
Line coverage
100%
Covered lines: 40
Uncovered lines: 0
Coverable lines: 40
Total lines: 89
Line coverage: 100%
Branch coverage
96%
Covered branches: 31
Total branches: 32
Branch coverage: 96.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%66100%
ResolveActorContext()93.75%1616100%
get_ResolveUnauthenticatedActor()100%22100%
ResolveActorType(...)100%22100%
FindFirstNonEmptyClaimValue(...)100%66100%

File(s)

/home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.AspNetCore/Actors/HttpContextAsiBackboneActorContextResolver.cs

#LineLine coverage
 1using System.Security.Claims;
 2using AsiBackbone.Core.Actors;
 3using Microsoft.AspNetCore.Http;
 4using Microsoft.Extensions.Options;
 5
 6namespace AsiBackbone.AspNetCore.Actors;
 7
 8/// <summary>
 9/// Maps the current ASP.NET Core HTTP context into a framework-neutral AsiBackbone actor context.
 10/// </summary>
 11public sealed class HttpContextAsiBackboneActorContextResolver : IAsiBackboneHttpActorContextResolver
 12{
 13    private readonly IHttpContextAccessor httpContextAccessor;
 14    private readonly AsiBackboneHttpActorContextOptions options;
 15
 16    /// <summary>
 17    /// Initializes a new instance of the <see cref="HttpContextAsiBackboneActorContextResolver" /> class.
 18    /// </summary>
 19    /// <param name="httpContextAccessor">The ASP.NET Core HTTP context accessor.</param>
 20    /// <param name="options">The actor mapping options.</param>
 3921    public HttpContextAsiBackboneActorContextResolver(
 3922        IHttpContextAccessor httpContextAccessor,
 3923        IOptions<AsiBackboneHttpActorContextOptions> options)
 24    {
 3925        this.httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
 3726        this.options = options?.Value ?? throw new ArgumentNullException(nameof(options));
 3527        this.options.Validate();
 3528    }
 29
 30    /// <inheritdoc />
 31    public IAsiBackboneActorContext ResolveActorContext()
 32    {
 2933        ClaimsPrincipal? user = httpContextAccessor.HttpContext?.User;
 34
 2935        if (user?.Identity?.IsAuthenticated != true)
 36        {
 1137            return ResolveUnauthenticatedActor;
 38        }
 39
 1840        string? actorId = FindFirstNonEmptyClaimValue(user, options.ActorIdClaimTypes);
 1841        if (string.IsNullOrWhiteSpace(actorId))
 42        {
 243            return ResolveUnauthenticatedActor;
 44        }
 45
 1646        string? displayName = FindFirstNonEmptyClaimValue(user, options.DisplayNameClaimTypes);
 1647        AsiBackboneActorType actorType = ResolveActorType(user);
 48
 1649        return actorType switch
 1650        {
 251            AsiBackboneActorType.Service => AsiBackboneActorContext.Service(actorId, displayName),
 252            AsiBackboneActorType.System => AsiBackboneActorContext.System,
 453            AsiBackboneActorType.Agent => AsiBackboneActorContext.Agent(actorId, displayName),
 454            AsiBackboneActorType.Human => AsiBackboneActorContext.Human(actorId, displayName),
 255            AsiBackboneActorType.Unknown => AsiBackboneActorContext.Unknown,
 256            _ => AsiBackboneActorContext.Human(actorId, displayName),
 1657        };
 58    }
 59
 1360    private IAsiBackboneActorContext ResolveUnauthenticatedActor => string.IsNullOrWhiteSpace(options.UnauthenticatedDis
 1361            ? AsiBackboneActorContext.Unknown
 1362            : AsiBackboneActorContext.Human(
 1363                AsiBackboneActorContext.UnknownActorId,
 1364                options.UnauthenticatedDisplayName,
 1365                isAuthenticated: false);
 66
 67    private AsiBackboneActorType ResolveActorType(ClaimsPrincipal user)
 68    {
 1669        string? actorTypeValue = FindFirstNonEmptyClaimValue(user, new[] { options.ActorTypeClaimType });
 70
 1671        return Enum.TryParse(actorTypeValue, ignoreCase: true, out AsiBackboneActorType actorType)
 1672            ? actorType
 1673            : options.DefaultAuthenticatedActorType;
 74    }
 75
 76    private static string? FindFirstNonEmptyClaimValue(ClaimsPrincipal user, IEnumerable<string> claimTypes)
 77    {
 35678        foreach (string claimType in claimTypes.Where(static claimType => !string.IsNullOrWhiteSpace(claimType)))
 79        {
 9680            Claim? claim = user.FindFirst(claimType);
 9681            if (!string.IsNullOrWhiteSpace(claim?.Value))
 82            {
 3683                return claim.Value.Trim();
 84            }
 85        }
 86
 1487        return null;
 3688    }
 89}