diff --git a/backend/src/main/java/com/magistr/app/controller/LessonsController.java b/backend/src/main/java/com/magistr/app/controller/LessonsController.java new file mode 100644 index 0000000..61a8065 --- /dev/null +++ b/backend/src/main/java/com/magistr/app/controller/LessonsController.java @@ -0,0 +1,178 @@ +package com.magistr.app.controller; + +import com.magistr.app.dto.CreateLessonRequest; +import com.magistr.app.dto.LessonResponse; +import com.magistr.app.model.Lesson; +import com.magistr.app.repository.LessonRepository; +import com.magistr.app.utils.DayAndWeekValidator; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; + +@RestController +@RequestMapping("/api/users/lessons") +public class LessonsController { + + private final LessonRepository lessonRepository; + private static final Logger logger = LoggerFactory.getLogger(LessonsController.class); + + public LessonsController(LessonRepository lessonRepository) { + this.lessonRepository = lessonRepository; + } + + @PostMapping("/create") + public ResponseEntity createLesson(@RequestBody CreateLessonRequest request) { + //Полное логирование входящего запроса + logger.info("Получен запрос на создание занятия: teacherId={}, groupId={}, lessonTypeId={}, day={}, week={}, time={}", + request.getTeacherId(), request.getGroupId(), request.getLessonTypeId(), request.getDay(), request.getWeek(), request.getTime()); + + //Проверка teacherId + if (request.getTeacherId() == null || request.getTeacherId() == 0) { + String errorMessage = "ID преподавателя обязателен"; + logger.info("Ошибка валидации: {}", errorMessage); + return ResponseEntity.badRequest().body(Map.of("message", errorMessage)); + } + + //Проверка groupId + if (request.getGroupId() == null || request.getGroupId() == 0) { + String errorMessage = "ID группы обязателен"; + logger.info("Ошибка валидации: {}", errorMessage); + return ResponseEntity.badRequest().body(Map.of("message", errorMessage)); + } + + //Проверка lessonTypeId + if (request.getLessonTypeId() == null || request.getLessonTypeId() == 0) { + String errorMessage = "ID предмета обязателен"; + logger.info("Ошибка валидации: {}", errorMessage); + return ResponseEntity.badRequest().body(Map.of("message", errorMessage)); + } + + //Проверка day + if (request.getDay() == null || request.getDay().isBlank()) { + String errorMessage = "Выбор дня обязателен"; + logger.info("Ошибка валидации: {}", errorMessage); + return ResponseEntity.badRequest().body(Map.of("message", errorMessage)); + } else if(!DayAndWeekValidator.isValidDay(request.getDay())){ + String errorMessage = "Некорректный день недели. " + DayAndWeekValidator.getValidDaysMessage(); + logger.info("Ошибка валидации дня: '{}' - {}", request.getDay(), errorMessage); + return ResponseEntity.badRequest().body(Map.of("message", errorMessage)); + } + + //Проверка week + if (request.getWeek() == null || request.getWeek().isBlank()) { + String errorMessage = "Выбор недели обязателен"; + logger.info("Ошибка валидации: {}", errorMessage); + return ResponseEntity.badRequest().body(Map.of("message", errorMessage)); + } else if(!DayAndWeekValidator.isValidWeek(request.getWeek())){ + String errorMessage = "Некорректная неделя. " + DayAndWeekValidator.getValidWeekMessage(); + logger.info("Ошибка валидации недели: '{}' - {}", request.getWeek(), errorMessage); + return ResponseEntity.badRequest().body(Map.of("message", errorMessage)); + } + + //Проверка time + if (request.getTime() == null || request.getTime().isBlank()) { + String errorMessage = "Время обязательно"; + logger.info("Ошибка валидации: {}", errorMessage); + return ResponseEntity.badRequest().body(Map.of("message", errorMessage)); + } + + //Сохранение полученных данных и формирование ответа клиенту + try { + Lesson lesson = new Lesson(); + lesson.setTeacherId(request.getTeacherId()); + lesson.setLessonTypeId(request.getLessonTypeId()); + lesson.setGroupId(request.getGroupId()); + lesson.setDay(request.getDay()); + lesson.setWeek(request.getWeek()); + lesson.setTime(request.getTime()); + + Lesson savedLesson = lessonRepository.save(lesson); + + Map response = new LinkedHashMap<>(); + response.put("id", savedLesson.getId()); + response.put("teacherId", savedLesson.getTeacherId()); + response.put("groupId", savedLesson.getGroupId()); + response.put("lessonTypeId", savedLesson.getLessonTypeId()); + response.put("day", savedLesson.getDay()); + response.put("week", savedLesson.getWeek()); + response.put("time", savedLesson.getTime()); + + logger.info("Занятие успешно создано с ID: {}", savedLesson.getId()); + + return ResponseEntity.ok(response); + } catch (Exception e) { + logger.error("Ошибка при сохранении занятия: {}", e.getMessage(),e); + + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Map.of("message", "Произошла ошибка при создании занятия: " + e.getMessage())); + } + } + + @GetMapping + public List getAllLessons() { + logger.info("Запрос на получение всех занятий"); + + try { + List lessons = lessonRepository.findAll().stream() + .map(l -> new LessonResponse(l.getId(), l.getTeacherId(), l.getLessonTypeId(), l.getGroupId(), l.getDay(), l.getWeek(), l.getTime())) + .toList(); + + logger.info("Получено {} занятий", lessons.size()); + return lessons; + } catch (Exception e) { + logger.error("Ошибка при получении списка всех занятий: {}", e.getMessage(), e); + throw e; + } + } + + @GetMapping("/{teacherId}") + public ResponseEntity getLessonsById(@PathVariable Long teacherId) { + logger.info("Запрос на получение занятий для преподавателя с ID: {}", teacherId); + try { + List lessons = lessonRepository.findByTeacherId(teacherId); + + if(lessons.isEmpty()) { + logger.info("У преподавателя с ID {} нет занятий", teacherId); + return ResponseEntity.ok(Map.of( + "message", "У преподавателя с ID " + teacherId +" нет занятий.", + "lessons", Collections.emptyList() + )); + } + + List lessonResponses = lessons.stream() + .map(l -> new LessonResponse( + l.getId(), + l.getTeacherId(), + l.getLessonTypeId(), + l.getGroupId(), + l.getDay(), + l.getWeek(), + l.getTime() + )) + .toList(); + logger.info("Найдено {} занянтий для преподавателя с ID: {}", lessonResponses.size(), teacherId); + return ResponseEntity.ok(lessonResponses); + } catch (Exception e ){ + logger.error("Ошибка при получении занятий для преподавателя с ID {}: {}", teacherId, e.getMessage(), e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Map.of("message", "Ошибка при поиске занятий: " + e.getMessage())); + } + } + + //Тестовый запрос на проверку доступности контроллера + @GetMapping("/ping") + public String ping() { + logger.debug("Получен ping запрос"); + String response = "pong"; + logger.debug("Ответ на ping: {}", response); + return response; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/magistr/app/controller/TestController.java b/backend/src/main/java/com/magistr/app/controller/TestController.java deleted file mode 100644 index 1f7bde5..0000000 --- a/backend/src/main/java/com/magistr/app/controller/TestController.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.magistr.app.controller; - -import com.magistr.app.dto.CreateLessonRequest; -import com.magistr.app.dto.LessonResponse; -import com.magistr.app.model.Lesson; -import com.magistr.app.repository.LessonRepository; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Map; - -@RestController -@RequestMapping("/api/users/test") -public class TestController { - - private final LessonRepository lessonRepository; - - public TestController(LessonRepository lessonRepository) { - this.lessonRepository = lessonRepository; - } - - @PostMapping("/create") - public ResponseEntity createLesson(@RequestBody CreateLessonRequest request) { - if (request.getTeacherId() == null || request.getTeacherId() == 0) { - return ResponseEntity.badRequest().body(Map.of("message", "ID преподавателя обязателен")); - } - if (request.getGroupId() == null || request.getGroupId() == 0) { - return ResponseEntity.badRequest().body(Map.of("message", "ID группы обязателен")); - } - if (request.getLessonTypeId() == null || request.getLessonTypeId() == 0) { - return ResponseEntity.badRequest().body(Map.of("message", "ID предмета обязателен")); - } - if (request.getDay() == null || request.getDay().isBlank()) { - return ResponseEntity.badRequest().body(Map.of("message", "Выбор дня обязателен")); - } - if (request.getWeek() == null || request.getWeek().isBlank()) { - return ResponseEntity.badRequest().body(Map.of("message", "Выбор недели обязателен")); - } - if (request.getTime() == null || request.getTime().isBlank()) { - return ResponseEntity.badRequest().body(Map.of("message", "Время обязательно")); - } - - Lesson lesson = new Lesson(); - lesson.setTeacherId(request.getTeacherId()); - lesson.setLessonTypeId(request.getLessonTypeId()); - lesson.setGroupId(request.getGroupId()); - lesson.setDay(request.getDay()); - lesson.setWeek(request.getWeek()); - lesson.setTime(request.getTime()); - lessonRepository.save(lesson); - - return ResponseEntity.ok(new LessonResponse(lesson.getId(), lesson.getDay(), lesson.getWeek(), lesson.getTime())); - } - - @GetMapping - public List getAllLessons() { - return lessonRepository.findAll().stream() - .map(l -> new LessonResponse(l.getId(), l.getTeacherId(), l.getLessonTypeId(), l.getDay(), l.getWeek(), l.getTime())) - .toList(); - } - - @GetMapping("/ping") - public String ping() { - return "pong"; - } -} \ No newline at end of file diff --git a/backend/src/main/java/com/magistr/app/dto/LessonResponse.java b/backend/src/main/java/com/magistr/app/dto/LessonResponse.java index 873de27..42f9d24 100644 --- a/backend/src/main/java/com/magistr/app/dto/LessonResponse.java +++ b/backend/src/main/java/com/magistr/app/dto/LessonResponse.java @@ -13,7 +13,10 @@ public class LessonResponse { public LessonResponse() { } - public LessonResponse(Long lessonTypeId, String day, String week, String time) { + public LessonResponse(Long id, Long teacherId, Long groupId, Long lessonTypeId, String day, String week, String time) { + this.id = id; + this.teacherId = teacherId; + this.groupId = groupId; this.lessonTypeId = lessonTypeId; this.day = day; this.week = week; diff --git a/backend/src/main/java/com/magistr/app/repository/LessonRepository.java b/backend/src/main/java/com/magistr/app/repository/LessonRepository.java index 3af1d8f..f7f2de8 100644 --- a/backend/src/main/java/com/magistr/app/repository/LessonRepository.java +++ b/backend/src/main/java/com/magistr/app/repository/LessonRepository.java @@ -3,9 +3,12 @@ package com.magistr.app.repository; import com.magistr.app.model.Lesson; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; import java.util.Optional; public interface LessonRepository extends JpaRepository { Optional findByLessonTypeId(Long lessonTypeId); + + List findByTeacherId(Long teacherId); } diff --git a/backend/src/main/java/com/magistr/app/utils/DayAndWeekValidator.java b/backend/src/main/java/com/magistr/app/utils/DayAndWeekValidator.java new file mode 100644 index 0000000..b4461f9 --- /dev/null +++ b/backend/src/main/java/com/magistr/app/utils/DayAndWeekValidator.java @@ -0,0 +1,30 @@ +package com.magistr.app.utils; + +import java.util.Set; + +public class DayAndWeekValidator { + + private static final Set VALID_DAYS = Set.of( + "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота" + ); + + private static final Set VALID_WEEKS = Set.of( + "Верхняя", "Нижняя", "Обе" + ); + + public static boolean isValidDay(String day) { + return day != null && VALID_DAYS.contains(day); + } + + public static boolean isValidWeek(String week) { + return week != null && VALID_WEEKS.contains(week); + } + + public static String getValidDaysMessage() { + return "Допустимые дни: " + String.join(", ", VALID_DAYS); + } + + public static String getValidWeekMessage() { + return "Допустимы для выбора: " + String.join(", ", VALID_WEEKS); + } +} diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 35a3635..8905ccb 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -10,3 +10,6 @@ spring.datasource.driver-class-name=org.postgresql.Driver spring.jpa.hibernate.ddl-auto=validate spring.jpa.show-sql=false spring.jpa.open-in-view=false + +#??? ????????? ???????? ?? ??????? ???????????? ??????? ? ????? BE, ???? ????????? ????? ?? ?????????? ????. ????? ???????????? INFO +#logging.level.root=DEBUG