54 lines
2.9 KiB
C#
54 lines
2.9 KiB
C#
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
namespace SfeduSchedule.Plugin.UniVerse.Controllers;
|
|
|
|
[ApiController]
|
|
[Route("plugins/universe")]
|
|
public sealed class UniverseController(IUniverseUserLookupService lookupService) : ControllerBase
|
|
{
|
|
/// <summary>
|
|
/// Получить Sub ID пользователя по полному имени.
|
|
/// </summary>
|
|
/// <param name="fullname">Полное имя пользователя для поиска в Modeus.</param>
|
|
/// <param name="cancellationToken">Токен отмены запроса.</param>
|
|
/// <returns>UniVerse Sub ID пользователя в формате plain text.</returns>
|
|
/// <response code="200">Пользователь найден, возвращается его UniVerse Sub ID.</response>
|
|
/// <response code="400">Не передан обязательный query-параметр fullname.</response>
|
|
/// <response code="401">Не передан или некорректен API-ключ.</response>
|
|
/// <response code="403">API-ключ не имеет доступа к методу.</response>
|
|
/// <response code="404">Пользователь не найден.</response>
|
|
/// <response code="502">Вышестоящий сервис вернул ошибку или некорректный ответ.</response>
|
|
/// <response code="500">Внутренняя ошибка обработки запроса.</response>
|
|
[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<IActionResult> 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)
|
|
};
|
|
}
|
|
}
|