Skip to content

maxprih/repetgel

Repository files navigation

Backend для образовательной платформы "RepetGel"

1. Обзор проекта

Данный проект представляет собой backend-компонент образовательной платформы, предназначенной для взаимодействия между репетиторами и студентами. Система обеспечивает управление учебным процессом, включая создание и ведение классов, планирование уроков, выдачу и проверку домашних заданий, а также отслеживание успеваемости студентов.

2. Цели проекта

  • Разработать масштабируемую и надежную серверную часть для поддержки ключевых функций образовательной платформы.
  • Обеспечить безопасную аутентификацию и авторизацию пользователей с разделением ролей.
  • Реализовать API для взаимодействия с будущим frontend-приложением.
  • Интегрировать внешние сервисы для хранения файлов и кэширования данных.
  • Обеспечить атомарность операций и целостность данных через транзакции.
  • Использовать современные практики разработки и проверенный технологический стек.

3. Ключевые функциональные возможности

3.1. Управление пользователями и аутентификация:

  • Интеграция с Keycloak для аутентификации (JWT) и управления ролями (TUTOR, STUDENT).
  • Хранение расширенных профилей пользователей в локальной базе данных, связанных с keycloakUserId.
  • Возможность для пользователей (репетиторов, студентов) обновлять свои профильные данные (имя, фамилия).

3.2. Управление классами (группами):

  • CRUD-операции для классов (создание, чтение, обновление, удаление) репетитором.
  • Привязка класса к конкретному репетитору (связь ManyToOne).
  • Управление списком студентов в классе (добавление/удаление, связь ManyToMany).

3.3. Управление уроками:

  • CRUD-операции для уроков в рамках класса.
  • Поддержка однократных и повторяющихся уроков (с использованием формата iCalendar RRULE для правил повторения).
  • Указание статуса урока (SCHEDULED, COMPLETED, CANCELLED).
  • Возможность прикрепления файлов к урокам (материалы лекций, презентации и т.д.). Файлы хранятся в S3 (MinIO).

3.4. Управление домашними заданиями:

  • CRUD-операции для домашних заданий, привязанных к уроку.
  • Поддержка двух типов заданий: FILE_UPLOAD (студент загружает файл) и TEST (студент проходит тест).
  • Установка дедлайнов для выполнения.
  • Создание тестов:
    • Формирование набора вопросов (Question) для теста (Test).
    • Для каждого вопроса — создание вариантов ответов (AnswerOption) с указанием правильного(ых).

3.5. Процесс выполнения и проверки домашних заданий:

  • Студенты могут просматривать назначенные им домашние задания.
  • Для типа FILE_UPLOAD: загрузка файла-ответа в S3 (MinIO).
  • Для типа TEST: отображение вопросов/вариантов, прием ответов студента (сохраняются в формате JSONB).
  • Создание записи о сдаче (HomeworkSubmission) с фиксацией времени, статуса (вовремя/с опозданием).
  • Репетиторы могут просматривать сданные работы, скачивать файлы, видеть ответы на тесты.
  • Возможность выставления оценки (0-100) и предоставления текстовой обратной связи.

3.6. Система "Жизней" (геймификация):

  • Студенты имеют ограниченное количество "жизней" (по умолчанию 3).
  • "Жизнь" теряется при сдаче домашнего задания после дедлайна или при несдаче к определенному моменту (реализован механизм проверки через @Scheduled задачу).
  • При достижении 0 "жизней" функциональность студента на платформе может быть ограничена (требуется вмешательство репетитора).
  • Репетиторы могут предоставлять дополнительные "жизни" студентам и продлевать дедлайны для них (текущая реализация продления дедлайна для ДЗ изменяет общий дедлайн, отмечено как точка для улучшения).

3.7. Календарь:

  • API для получения списка уроков в заданном временном диапазоне для календаря репетитора и студента.

3.8. Хранение файлов:

  • Интеграция с S3-совместимым хранилищем MinIO для всех пользовательских файлов (материалы уроков, сданные ДЗ).
  • Генерация presigned URL для безопасного скачивания файлов.

3.9. Кэширование:

  • Использование Redis для кэширования часто запрашиваемых данных (детали уроков, профили, списки классов) для снижения нагрузки на БД и ускорения ответа API.

4. Архитектурные решения

  • Многослойная архитектура:
    • Controller: Прием HTTP-запросов, валидация входных данных (DTO), делегирование бизнес-логики сервисному слою.
    • Service: Реализация бизнес-логики, управление транзакциями (@Transactional), взаимодействие с репозиториями и внешними сервисами.
    • Repository: Абстракция доступа к данным с использованием Spring Data JPA.
    • DTO (Data Transfer Objects): Используются для определения контрактов API, обеспечивая слабую связанность между слоями.
  • Обработка исключений: Глобальный обработчик (@RestControllerAdvice) для кастомных и стандартных исключений, возвращающий стандартизированные JSON-ответы об ошибках.
  • Аутентификация и Авторизация: На базе Spring Security OAuth2 Resource Server, интеграция с Keycloak для валидации JWT и извлечения ролей/информации о пользователе.
  • Использование UUID v7: В качестве первичных ключей для большинства сущностей (кроме User, где PK – keycloakUserId), генерируемых на стороне PostgreSQL с помощью расширения pg_uuidv7, что обеспечивает хорошую производительность при вставке и хронологическую сортируемость.
  • Управление зависимостями и сборка: Gradle.
  • Управление схемой БД: Liquibase с использованием SQL-формата для миграций.

5. Технологический стек

  • Язык программирования: Java 21
  • Основной фреймворк: Spring Boot 3
  • ORM: Spring Data JPA (Hibernate)
  • База данных: PostgreSQL 16 (с расширением pg_uuidv7)
  • Аутентификация и авторизация: Keycloak
  • Кэш: Redis
  • Файловое хранилище: S3-совместимое (MinIO).
  • Миграции базы данных: Liquibase
  • Библиотеки:
    • Lombok: для сокращения шаблонного кода.
    • MapStruct: для маппинга между DTO и сущностями.
    • Hypersistence Utils: для улучшенной поддержки JSONB и других типов Hibernate.
  • Контейнеризация: Docker, Docker Compose (для локальной разработки и развертывания стека).

6. Потенциальные направления для развития и улучшения

  • Реализация более гранулярных прав доступа (например, репетитор может редактировать только свои классы/уроки).
  • Внедрение системы уведомлений (WebSocket, Email) для ключевых событий (новое ДЗ, сдача работы, получение оценки).
  • Расширение функционала тестов (разные типы вопросов, лимиты по времени, автоматический подсчет баллов с учетом весов вопросов).
  • Более гибкая система продления дедлайнов для домашних заданий (индивидуальные оверрайды для студентов).
  • Оптимизация @Scheduled задач для обработки просроченных ДЗ на больших объемах данных.
  • Разработка административной панели для управления платформой.
  • Полноценное покрытие кода тестами (юнит, интеграционные).

About

RepetGel is a platform for tutors

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages