diff --git a/README.md b/README.md index 77a7fc5..e178a82 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ - +# Прокси для расписания в Modeus ## TODO - [x] Добавить RateLimiter -- [ ] Добавить обработку ошибок при запросах к modeus \ No newline at end of file +- [x] Добавить обработку ошибок при запросах к modeus \ No newline at end of file diff --git a/SfeduSchedule/Controllers/ScheduleController.cs b/SfeduSchedule/Controllers/ScheduleController.cs index 01a4714..94ac000 100644 --- a/SfeduSchedule/Controllers/ScheduleController.cs +++ b/SfeduSchedule/Controllers/ScheduleController.cs @@ -1,3 +1,4 @@ +using System.Net; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.RateLimiting; @@ -8,8 +9,9 @@ namespace SfeduSchedule.Controllers [ApiController] [Route("api/[controller]")] [EnableRateLimiting("throttle")] - public class ScheduleController(ModeusService modeusService) : ControllerBase + public class ScheduleController(ModeusService modeusService, ILogger logger) : ControllerBase { + /// /// Получить расписание для указанных пользователей. /// @@ -39,10 +41,43 @@ namespace SfeduSchedule.Controllers [HttpPost] public async Task Post([FromBody] ModeusScheduleRequest request) { - var schedule = await modeusService.GetScheduleAsync(request); + string? schedule; + try + { + schedule = await modeusService.GetScheduleAsync(request); + } + catch (HttpRequestException e) + { + logger.LogError(e, "Ошибка при получении расписания"); + return StatusCode((int)(e.StatusCode ?? HttpStatusCode.InternalServerError), e.Message); + } return Ok(schedule); } + /// + /// Поиск аудиторий по пользовательскому запросу. + /// + /// Объект запроса, содержащий параметры фильтрации аудиторий. + /// Список аудиторий. + /// Возвращает список аудиторий + /// Слишком много запросов + [HttpPost] + [Route("rooms/search")] + public async Task SearchRooms([FromBody] RoomSearchRequest request) + { + string? rooms; + try + { + rooms = await modeusService.SearchRoomsAsync(request); + } + catch (HttpRequestException e) + { + logger.LogError(e, "Ошибка при поиске аудиторий"); + return StatusCode((int)(e.StatusCode ?? HttpStatusCode.InternalServerError), e.Message); + } + return Ok(rooms); + } + /// /// Получить GUID пользователя по полному имени. (требуется авторизация) /// @@ -53,7 +88,7 @@ namespace SfeduSchedule.Controllers /// Неавторизованный [HttpGet] [Authorize(AuthenticationSchemes = "ApiKey")] - [Route("GetGuid")] + [Route("getguid")] public async Task GetGuid(string fullname) { var guid = await modeusService.GetGuidAsync(fullname); diff --git a/SfeduSchedule/DTO/ModeusScheduleRequestDTO.cs b/SfeduSchedule/DTO/ModeusScheduleRequestDTO.cs index b4f91a8..53be687 100644 --- a/SfeduSchedule/DTO/ModeusScheduleRequestDTO.cs +++ b/SfeduSchedule/DTO/ModeusScheduleRequestDTO.cs @@ -1,3 +1,5 @@ +using System.ComponentModel; + namespace SfeduSchedule { public class ModeusScheduleRequest(int size, DateTime timeMin, DateTime timeMax, List attendeePersonId) @@ -7,4 +9,19 @@ namespace SfeduSchedule public DateTime TimeMax { get; set; } = timeMax; public List AttendeePersonId { get; set; } = attendeePersonId; } + + public class RoomSearchRequest + { + [DefaultValue("")] + public string Name { get; set; } = ""; + [DefaultValue("+building.name,+name")] + public string Sort { get; set; } = "+building.name,+name"; + [DefaultValue(10)] + public int Size { get; set; } = 10; + [DefaultValue(0)] + public int Page { get; set; } = 0; + [DefaultValue(false)] + public bool Deleted { get; set; } = false; + public RoomSearchRequest() {} + } } diff --git a/SfeduSchedule/Services/ModeusService.cs b/SfeduSchedule/Services/ModeusService.cs index adaeafb..1152fb2 100644 --- a/SfeduSchedule/Services/ModeusService.cs +++ b/SfeduSchedule/Services/ModeusService.cs @@ -31,6 +31,16 @@ namespace SfeduSchedule.Services return await response.Content.ReadAsStringAsync(); } + public async Task SearchRoomsAsync(RoomSearchRequest requestDto) + { + var request = new HttpRequestMessage(HttpMethod.Post, $"schedule-calendar-v2/api/campus/rooms/search"); + request.Content = new StringContent(JsonSerializer.Serialize(requestDto, _options), System.Text.Encoding.UTF8, "application/json"); + var response = await _httpClient.SendAsync(request); + _logger.LogInformation("SearchRoomsAsync: Ответ получен: {StatusCode}", response.StatusCode); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadAsStringAsync(); + } + public async Task GetGuidAsync(string fullName) { var request = new HttpRequestMessage(HttpMethod.Post, $"schedule-calendar-v2/api/people/persons/search");