- Управление курсами: создание курсов с модулями и уроками, организация по категориям
- Управление пользователями: регистрация студентов и преподавателей, управление профилями
- Запись на курсы: студенты могут записываться на курсы и отслеживать свой прогресс
- Обучающие материалы: размещение уроков, заданий и материалов в рамках курсов
- Тестирование: создание тестов с вопросами и вариантами ответов, автоматическая проверка
- Выполнение заданий: студенты могут отправлять выполненные задания на проверку
- Система отзывов: возможность оставлять отзывы и оценки курсам
- Backend: Java, Spring Boot, Spring Data JPA, Hibernate
- База данных: PostgreSQL
- Миграции: Flyway
- Сборка: Maven
- Контейнеризация: Docker, Docker Compose
-
Controller Layer (Контроллеры)
- Обработка HTTP-запросов и маршрутизация
- Валидация входных данных
- Формирование HTTP-ответов
- Прямое взаимодействие с Repository Layer
-
Repository Layer (Слой доступа к данным)
- Взаимодействие с базой данных через JPA/Hibernate
- CRUD операции над сущностями
-
DTO (Data Transfer Objects) - объекты для передачи данных между слоями
-
Mapper - преобразование между Entity и DTO
-
Model/Entity - JPA-сущности, представляющие таблицы БД
-
Exception - обработка исключений
Примечание о Service Layer: В текущей реализации слой сервисов не используется, так как вся логика представляет собой простые CRUD операции. Создание дополнительного слоя абстракции без реальной бизнес-логики привело бы к избыточности кода. Как только появится настоящая бизнес-логика (сложные транзакции, валидация правил, координация между несколькими репозиториями), контроллеры будут рефакторены для использования Service Layer вместо прямого обращения к репозиториям.
Приложение предоставляет RESTful API со следующими основными группами эндпоинтов:
- Пользователи (
/api/users) - Категории (
/api/categories) - Курсы (
/api/courses) - Модули (
/api/modules) - Уроки (
/api/lessons) - Задания (
/api/assignments) - Тесты (
/api/quizzes) - Записи на курсы (
/api/enrollments) - Отзывы (
/api/reviews)
Реализованы следующие GitHub Actions workflows:
Файл: .github/workflows/ci.yml
Триггеры:
- Push в ветки
master,dev - Pull Request в ветки
master,dev - Ручной запуск (workflow_dispatch)
Процесс:
- Разворачивание PostgreSQL в Docker контейнере для тестов
- Сборка проекта с Maven (
./mvnw clean compile) - Запуск всех тестов с подключением к тестовой БД
- Упаковка приложения в JAR файл
- Сохранение артефакта (JAR файл) на 7 дней
- Генерация отчета о тестировании
Файл: .github/workflows/cd.yml
Триггеры:
- Push в ветки
master,dev(отключен) - Pull Request в ветки
master,dev(отключен) - Ручной запуск (workflow_dispatch) с опциональным указанием тега Docker образа
Процесс:
- Сборка проекта с Maven (
./mvnw clean package) - Настройка Docker Buildx для мультиплатформенной сборки
- Авторизация в Docker Hub
- Извлечение метаданных для тегирования образа (ветка, версия, SHA коммита)
- Сборка и публикация Docker образа в Docker Hub с несколькими тегами
- Создание GitHub Release при публикации тега версии
Файл: .github/workflows/code-quality.yml
Триггеры:
- Push в ветки
master,dev - Pull Request в ветки
master,dev - Ручной запуск (workflow_dispatch)
Процесс:
- Анализ кода с помощью SonarCloud (покрытие тестами, код смеллы, уязвимости)
- Проверка стиля кода с помощью Checkstyle
- Статический анализ кода с помощью SpotBugs (поиск багов и потенциальных проблем)
Файл: .github/workflows/dependency-review.yml
Триггеры:
- Pull Request в ветки
master,dev
Процесс:
- Проверка добавленных зависимостей на наличие известных уязвимостей
- Блокировка PR при обнаружении уязвимостей уровня moderate и выше
- Автоматическое добавление комментария с результатами в Pull Request
Создать .env по шаблону .env.template (если хотите поменять значения по умолчанию)
Выполнить команду:
docker compose up -d --buildСервер будет доступен по адресу http://localhost:8080/. Также при запуске автоматически добавятся тестовые данные.
Для запуска тестов выполните команду:
./mvnw testИли на Windows:
mvnw.cmd testДля запуска с подробным выводом:
./mvnw test -Dspring.profiles.active=testGET /api/users- Получить всех пользователейGET /api/users/{id}- Получить пользователя по IDGET /api/users/email/{email}- Получить пользователя по emailPOST /api/users- Создать пользователяPUT /api/users/{id}- Обновить пользователяDELETE /api/users/{id}- Удалить пользователя
GET /api/categories- Получить все категорииGET /api/categories/{id}- Получить категорию по IDGET /api/categories/name/{name}- Получить категорию по имениPOST /api/categories- Создать категориюPUT /api/categories/{id}- Обновить категориюDELETE /api/categories/{id}- Удалить категорию
GET /api/courses- Получить все курсыGET /api/courses/{id}- Получить курс по IDGET /api/courses/teacher/{teacherId}- Получить курсы преподавателяGET /api/courses/category/{categoryId}- Получить курсы по категорииGET /api/courses/category/name/{categoryName}- Получить курсы по названию категорииPOST /api/courses- Создать курсPUT /api/courses/{id}- Обновить курсDELETE /api/courses/{id}- Удалить курс
GET /api/enrollments- Получить все записиGET /api/enrollments/{id}- Получить запись по IDGET /api/enrollments/student/{studentId}- Получить записи студентаGET /api/enrollments/course/{courseId}- Получить записи на курсGET /api/enrollments/student/{studentId}/course/{courseId}- Получить запись студента на курсPOST /api/enrollments- Создать запись на курсPUT /api/enrollments/{id}- Обновить записьDELETE /api/enrollments/{id}- Удалить запись
GET /api/modules- Получить все модулиGET /api/modules/{id}- Получить модуль по IDGET /api/modules/course/{courseId}- Получить модули курсаPOST /api/modules- Создать модульPUT /api/modules/{id}- Обновить модульDELETE /api/modules/{id}- Удалить модуль
GET /api/lessons- Получить все урокиGET /api/lessons/{id}- Получить урок по IDGET /api/lessons/module/{moduleId}- Получить уроки по модулюPOST /api/lessons- Создать урокPUT /api/lessons/{id}- Обновить урокDELETE /api/lessons/{id}- Удалить урок
GET /api/assignments- Получить все заданияGET /api/assignments/{id}- Получить задание по IDGET /api/assignments/lesson/{lessonId}- получить задания урокаPOST /api/assignments- Создать заданиеPUT /api/assignments/{id}- Обновить заданиеDELETE /api/assignments/{id}- Удалить задание
GET /api/submissions- Получить все отправки работGET /api/submissions/{id}- Получить отправку по IDGET /api/submissions/assignment/{assignmentId}- Получить отправки по заданиюGET /api/submissions/student/{studentId}- Получить отправки студентаGET /api/submissions/assignment/{assignmentId}/student/{studentId}- Получить отправку студента по заданиюPOST /api/submissions- Создать отправку работыPUT /api/submissions/{id}- Обновить отправкуDELETE /api/submissions/{id}- Удалить отправку
GET /api/quizzes- Получить все тестыGET /api/quizzes/{id}- Получить тест по IDGET /api/quizzes/module/{moduleId}- Получить тест модуляPOST /api/quizzes- Создать тестPUT /api/quizzes/{id}- Обновить тестDELETE /api/quizzes/{id}- Удалить тест
GET /api/questions- Получить все вопросыGET /api/questions/{id}- Получить вопрос по IDGET /api/questions/quiz/{quizId}- Получить вопросы тестаPOST /api/questions- Создать вопросPUT /api/questions/{id}- Обновить вопросDELETE /api/questions/{id}- Удалить вопрос
GET /api/answer-options- Получить все варианты ответовGET /api/answer-options/{id}- Получить вариант ответа по IDGET /api/answer-options/question/{questionId}- Получить варианты ответов вопросаPOST /api/answer-options- Создать вариант ответаPUT /api/answer-options/{id}- Обновить вариант ответаDELETE /api/answer-options/{id}- Удалить вариант ответа
GET /api/quiz-submissions- Получить все отправки тестовGET /api/quiz-submissions/{id}- Получить отправку теста по IDGET /api/quiz-submissions/student/{studentId}- Получить отправки тестов студентаGET /api/quiz-submissions/quiz/{quizId}- Получить отправки по тестуGET /api/quiz-submissions/quiz/{quizId}/student/{studentId}- Получить отправку студента по тестуPOST /api/quiz-submissions- Создать отправку тестаPUT /api/quiz-submissions/{id}- Обновить отправку тестаDELETE /api/quiz-submissions/{id}- Удалить отправку теста
GET /api/reviews- Получить все отзывыGET /api/reviews/{id}- Получить отзыв по IDGET /api/reviews/course/{courseId}- Получить отзывы по курсуGET /api/reviews/student/{studentId}- Получить отзывы студентаPOST /api/reviews- Создать отзывPUT /api/reviews/{id}- Обновить отзывDELETE /api/reviews/{id}- Удалить отзыв
AnswerOptionAssignmentCategoryCourseCourseModuleCourseReviewCourseScheduleEnrollmentLessonMaterialNotificationProfileQuestionQuizQuizSubmissionSubmissionTagUser
