#nullable enable using System.Security.Claims; using Baya.Application.Contracts.Common; using Baya.SharedKernel.Extensions; using Microsoft.AspNetCore.Http; namespace Baya.Infrastructure.Identity.Identity.CurrentUser; /// /// Resolves the current user from the active HTTP request's claims. When there is no request or no /// authenticated principal (background work, startup), all members report "no user". /// public sealed class HttpContextCurrentUser(IHttpContextAccessor httpContextAccessor) : ICurrentUser { private ClaimsPrincipal? Principal => httpContextAccessor.HttpContext?.User; public int? UserId { get { var rawId = Principal?.Identity?.GetUserId(); return rawId.HasValue() && int.TryParse(rawId, out var id) ? id : null; } } public bool IsAuthenticated => Principal?.Identity?.IsAuthenticated ?? false; public IReadOnlyList Roles => Principal?.FindAll(ClaimTypes.Role).Select(c => c.Value).ToArray() ?? []; public string? IpAddress => httpContextAccessor.HttpContext?.Connection.RemoteIpAddress?.ToString(); }