using System.Security.Claims; using Microsoft.AspNetCore.Http; using PnvPanel.Application.Common.Interfaces; namespace PnvPanel.Infrastructure.Identity; /// /// В HTTP-запросах читает JWT-claims. В Telegram-боте (нет HttpContext) вызывающая сторона /// заранее задаёт пользователя через ICurrentUserSetter.SetUser(...) в рамках DI-scope апдейта. /// internal sealed class CurrentUser(IHttpContextAccessor httpContextAccessor) : ICurrentUser, ICurrentUserSetter { private (Guid Id, string Name)? _override; private ClaimsPrincipal? Principal => httpContextAccessor.HttpContext?.User; public Guid? UserId => _override?.Id ?? ParseHttpUserId(); public string? UserName => _override?.Name ?? Principal?.FindFirstValue(ClaimTypes.Name); public bool IsAuthenticated => _override is not null || (Principal?.Identity?.IsAuthenticated ?? false); public void SetUser(Guid userId, string userName) => _override = (userId, userName); private Guid? ParseHttpUserId() { var value = Principal?.FindFirstValue(ClaimTypes.NameIdentifier); return Guid.TryParse(value, out var id) ? id : null; } }