using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace SfeduSchedule.Plugin.UniVerse.Controllers;
[ApiController]
[Route("api/plugins/universe")]
public sealed class UniverseController(IUniverseUserLookupService lookupService) : ControllerBase
{
///
/// Получить Sub ID пользователя по полному имени.
///
/// Полное имя пользователя для поиска в Modeus.
/// Токен отмены запроса.
/// Sub ID пользователя в формате plain text.
/// Пользователь найден, возвращается его Sub ID.
/// Не передан обязательный query-параметр fullname.
/// Не передан или некорректен API-ключ.
/// API-ключ не имеет доступа к методу.
/// Пользователь не найден.
/// Вышестоящий сервис вернул ошибку или некорректный ответ.
/// Внутренняя ошибка обработки запроса.
[HttpGet("subid", Name = "UniVerseGetSubId")]
[Authorize(AuthenticationSchemes = "ApiKey")]
[Produces("text/plain")]
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status502BadGateway)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]
public async Task GetSubId(
[FromQuery] string? fullname,
CancellationToken cancellationToken)
{
if (string.IsNullOrWhiteSpace(fullname))
return BadRequest("Query parameter 'fullname' is required.");
var result = await lookupService.FindSubIdAsync(fullname, cancellationToken);
return result.Status switch
{
UniverseUserLookupStatus.Found => Content(result.SubId!, "text/plain"),
UniverseUserLookupStatus.NotFound => NotFound(),
UniverseUserLookupStatus.UpstreamError => Problem(
result.ErrorMessage,
statusCode: StatusCodes.Status502BadGateway),
_ => Problem(statusCode: StatusCodes.Status500InternalServerError)
};
}
}