using Microsoft.AspNetCore.Http;
namespace Tnsu.ApprovalRoute.Infrastructure.TnsuPortal;
///
/// Authorization, с которым идти в api.tnsu.kz в пределах текущей области DI.
///
/// Два источника, и второй нужен именно фоновым задачам:
/// • обрабатывается HTTP-запрос — заголовок берётся прямо из него;
/// • выполняется задача Hangfire — своего HttpContext'а у неё нет, поэтому
/// токен инициировавшего пользователя ей передают аргументом и кладут сюда
/// через (см. CreateNextListPartitionJob).
///
/// Scoped: Hangfire создаёт отдельную область DI на каждое выполнение задачи,
/// поэтому положенный здесь токен не протекает между задачами.
///
public sealed class TnsuPortalCallerToken(IHttpContextAccessor httpContextAccessor)
{
private string? _explicit;
///
/// Заголовок целиком, вида «Bearer …». null — вызывающего токена нет
/// (тогда авторизация уходит на client_credentials, см. TnsuPortalAuthorizer).
///
public string? Current
{
get
{
var incoming = httpContextAccessor.HttpContext?.Request.Headers.Authorization.ToString();
return string.IsNullOrWhiteSpace(incoming) ? _explicit : incoming;
}
}
/// Положить токен явно — для кода без HttpContext (фоновые задачи).
public void Set(string? authorization) =>
_explicit = string.IsNullOrWhiteSpace(authorization) ? null : authorization;
}