using System.Security.Claims;
using SurveyBackend.Core.Contexts;
using SurveyBackend.Services.Exceptions;
namespace SurveyBackend.Contexts;
///
/// Упрощает получение UserId из JWT-токена
///
public class UserContext : IUserContext
{
private readonly IHttpContextAccessor _httpContextAccessor;
///
/// Добавьте HttpContextAccessor в DI и будет счастье
///
///
public UserContext(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
///
/// Возвращает UserId из токена, при отсуствии кидает Unauthorized
///
///
//public int UserId =>
// int.Parse(
// _httpContextAccessor.HttpContext?.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value ?? throw new UnauthorizedException("Where's your token mister"));
private string? ClaimValue
=> _httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
public int UserId
=> int.TryParse(ClaimValue, out var id)
? id
: throw new UnauthorizedException("User ID claim missing or malformed");
public int? NullableUserId
=> int.TryParse(ClaimValue, out var id)
? id
: null;
}