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 { /// /// Получить Sub ID пользователя по полному имени. /// /// Полное имя пользователя для поиска в Modeus. /// Токен отмены запроса. /// UniVerse Sub ID пользователя в формате plain text. /// Пользователь найден, возвращается его UniVerse 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) }; } }