From 428ee1d3884095e70448442b3f56406e74688345 Mon Sep 17 00:00:00 2001 From: Sergey Karmanov Date: Tue, 9 Sep 2025 17:00:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D0=B0=D1=83=D0=B4=D0=B8=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=B9=20=D0=B8=20=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D1=83=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE?= =?UTF-8?q?=D0=BA=20=D0=BE=D1=82=20=D0=B2=D1=8B=D1=88=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D1=8F=D1=89=D0=B5=D0=B3=D0=BE=20=D1=81=D0=B5=D1=80=D0=B2?= =?UTF-8?q?=D0=B8=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- .../Controllers/ScheduleController.cs | 41 +++++++++++++++++-- SfeduSchedule/DTO/ModeusScheduleRequestDTO.cs | 17 ++++++++ SfeduSchedule/Services/ModeusService.cs | 10 +++++ 4 files changed, 67 insertions(+), 5 deletions(-) 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");