Files
SfeduScheduleUniVerse/SfeduSchedule.Plugin.UniVerse/Controllers/UniverseController.cs
T
serega404 88b7906450
Build UniVerse plugin / Build library (push) Failing after 11m30s
Переделал на MVC и добавил swagger doc
2026-05-24 20:02:43 +03:00

54 lines
2.8 KiB
C#

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace SfeduSchedule.Plugin.UniVerse.Controllers;
[ApiController]
[Route("api/universe")]
public sealed class UniverseController(IUniverseUserLookupService lookupService) : ControllerBase
{
/// <summary>
/// Получить Sub ID пользователя по полному имени.
/// </summary>
/// <param name="fullname">Полное имя пользователя для поиска в Modeus.</param>
/// <param name="cancellationToken">Токен отмены запроса.</param>
/// <returns>Sub ID пользователя в формате plain text.</returns>
/// <response code="200">Пользователь найден, возвращается его 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)
};
}
}