Skip to content

Мини-lms система для родителей, которые организуют семейное обучение детей дома, групповой пет-проект ПРОЕКТ ЗАКРЫТ

License

Notifications You must be signed in to change notification settings

Valentina810/lms

Repository files navigation

Групповой пет-проект lms

Проект закрыт

Участники команды

Java Developer

Frontend Developer (React)

Manual QA

Репозиторий бэкенда

https://github.com/Valentina810/lms - для развертывания склонировать проект, выполнить в корне проекта команду docker-compose up
сваггер будет доступен по адресу https://localhost:8080/swagger-ui/index.html

Репозиторий фронтенда

https://github.com/AnnaSog/LMS

Тест-кейсы API

https://docs.google.com/spreadsheets/d/1uZvrsg0FlwcaEs_8QjwqR4Y30nDS6iXhEKmZsSqvBKs/edit#gid=0

Коллекция postman https://github.com/Valentina810/lms/blob/main/lms%20USER-LESSON-CONTROLLERS.postman_collection.json

Доска

https://github.com/users/Valentina810/projects/1

Ссылка на макеты

https://www.figma.com/file/V7PLGct4lGmFJofvvbgxkw/LMS-(Copy)?type=design&node-id=0-1&mode=design&t=zOfw4q4RFrdDYrCx-0

Схема БД

Схема базы данных

Мини-lms система для родителей, которые организуют семейное обучение детей дома

Первоначальный MVP не предусматривает регистрацию пользователей. Считаем что пользователь уже зарегистрирован. В таблице Users хранятся данные о пользователе: логин, пароль и токен.

Эндпоинты

Контроллер /users

Запрос POST /users - создание пользователя, возвращает пользователя (для теста, в UI интерфейсе регистрации пока не будет)

Специальные заголовки:

Content-Type : application/json

Тело
  {
  "name": "Василий",
  "surname":"Петров", 
  "login":"Vasek",
  "password":"apple",
  "email":"[email protected]",
  "datBirth":"2000-01-01",
  "avatarUrl":"https://pgcookbook.ru/programming/vasia.jpg"
  }

Ответ

Специальные заголовки: нет
Тело
  {
  "id":"1",
  "name": "Василий",
  "surname":"Петров", 
  "login":"Vasek",
  "email":"[email protected]",
  "datBirth":"2000-01-01",
  "avatarUrl":"https://pgcookbook.ru/programming/vasia.jpg"
  }
Возможные коды ответа:
  • 201 - пользователь успешно создан
  • 400 - в теле запроса ошибка
  • 403 - нет прав для создания пользователя
  • 409 - конфликт (например, пользователь с таким email уже существует в БД)
  • 500 - неизвестная ошибка сервера

Ответы в случае ошибок:

Ошибка Дополнительная информация Ответ
400 Ошибка в JSON {
"status": "BAD_REQUEST",
"message": "Неверная структура объекта: проверьте скобки, запятые и названия полей",
"date": "2023-09-11 19:06:04"
}
400 Не передано поле Имя/пустое {
"status": "BAD_REQUEST",
"message": "Имя обязательно для заполнения; ",
"date": "2023-09-11 19:06:04"
}
400 Не передано поле Логин/пустое {
"status": "BAD_REQUEST",
"message": "Login не должен быть пустым; ",
"date": "2023-09-11 19:06:04"
}
400 Не передано поле Password/пустое {
"status": "BAD_REQUEST",
"message": "Пароль не должен быть пустым",
"date": "2023-09-11 19:06:04"
}
400 Не передано поле Email/пустое {
"status": "BAD_REQUEST",
"message": "Поле Email обязательно для заполнения; ",
"date": "2023-09-11 19:06:04"
}
403 нет {
"status": "FORBIDDEN",
"message": "Нет прав для совершения операции",
"date": "2023-09-11 19:06:04"
}
409 Пользователь с указанным Email
уже есть в БД
{
"status": "CONFLICT",
"message": "Эта электронная почта уже существует в базе данных",
"date": "2023-09-11 19:06:04"
}
500 нет {
"status": "INTERNAL_SERVER_ERROR",
"message": "Неизвестная ошибка сервера",
"date": "2023-09-11 19:06:04"
}

Ограничения на длину полей при создании пользователя:

Поле Ограничение Код ответа Ответ в случае если ограничение не выполнено
name Обязательное, не пустое, не более 250 символов 400 {
"status": "BAD_REQUEST",
"message": "Имя должно быть не больше 250 знаков; ",
"date": "2023-09-11 19:06:04"
}
surname Не обязательное, не более 250 символов 400 {
"status": "BAD_REQUEST",
"message": "Фамилия должна быть не больше 250 знаков; ",
"date": "2023-09-11 19:06:04"
}
login Обязательное, не пустое, не более 100 символов 400 {
"status": "BAD_REQUEST",
"message": "Login должен быть не больше 100 знаков; ",
"date": "2023-09-11 19:06:04"
}
password Обязательное, не пустое, не более 100 символов 400 {
"status": "BAD_REQUEST",
"message": "Пароль должен быть не больше 100 знаков; ",
"date": "2023-09-11 19:06:04"
}
email Обязательное, не пустое, не более 250 символов, должно соответствовать фоормату Email: в стандарте указано, что имя пользователя не должно превышать 64 символа, имя домена ограничено 255 символами, а знак @ – это один символ 400 {
"status": "BAD_REQUEST",
"message": "Email должен быть не больше 250 знаков; ",
"date": "2023-09-11 19:06:04"
}
avatarUrl Не обязательное, не более 1000 символов 400 {
"status": "BAD_REQUEST",
"message": "Длина адреса должна быть не больше 1000 знаков; ",
"date": "2023-09-11 19:06:04"
}

Запрос PATCH /users/{userId} - изменение информации о пользователе

Специальные заголовки:

Content-Type : application/json

Тело
  {
  "name": "Василий",
  "surname":"Петров", 
  "login":"Vasek",
  "password":"apple",
  "email":"[email protected]",
  "dateBirth":"2000-01-01",
  "avatarUrl":"https://pgcookbook.ru/programming/vasia.jpg"
  }

Ответ

Специальные заголовки: нет
Тело: данные о пользователе с учетом обновления
  {
  "id_user":2,
  "name": "Василий",
  "surname":"Петров", 
  "login":"Vasek",
  "email":"[email protected]",
  "dateBirth":"2000-01-01",
  "avatarUrl":"https://pgcookbook.ru/programming/vasia.jpg"
  }
Возможные коды ответа:
  • 200 - данные пользователя успешно изменены
  • 400 - в теле запроса ошибка
  • 403 - нет прав для изменения данных
  • 409 - конфликт (например, пользователь с таким email уже существует в БД и это не ткущий пользователь)
  • 500 - неизвестная ошибка сервера

Ответы в случае ошибок:

Ошибка Дополнительная информация Ответ
400 Ошибка в JSON {
"status": "BAD_REQUEST",
"message": "Неверная структура объекта: проверьте скобки, запятые и названия полей",
"date": "2023-09-11 19:06:04"
}
400 Не передано поле Имя/пустое {
"status": "BAD_REQUEST",
"message": "Имя обязательно для заполнения; ",
"date": "2023-09-11 19:06:04"
}
400 Не передано поле Логин/пустое {
"status": "BAD_REQUEST",
"message": "Login не должен быть пустым; ",
"date": "2023-09-11 19:06:04"
}
400 Не передано поле Email/пустое {
"status": "BAD_REQUEST",
"message": "Поле Email обязательно для заполнения; ",
"date": "2023-09-11 19:06:04"
}
403 нет {
"status": "FORBIDDEN",
"message": "Нет прав для совершения операции",
"date": "2023-09-11 19:06:04"
}
409 Пользователь с указанным Email
уже есть в БД
{
"status": "CONFLICT",
"message": "Эта электронная почта уже существует в базе данных",
"date": "2023-09-11 19:06:04"
}
500 нет {
"status": "INTERNAL_SERVER_ERROR",
"message": "Неизвестная ошибка сервера",
"date": "2023-09-11 19:06:04"
}

Ограничения на длину полей при редактировании пользователя:

Поле Ограничение Код ответа Ответ в случае если ограничение не выполнено
name Обязательное, не пустое, не более 250 символов 400 {
"status": "BAD_REQUEST",
"message": "Имя должно быть не больше 250 знаков; ",
"date": "2023-09-11 19:06:04"
}
surname Не обязательное, не более 250 символов 400 {
"status": "BAD_REQUEST",
"message": "Фамилия должна быть не больше 250 знаков; ",
"date": "2023-09-11 19:06:04"
}
login Обязательное, не пустое, не более 100 символов 400 {
"status": "BAD_REQUEST",
"message": "Login должен быть не больше 100 знаков; ",
"date": "2023-09-11 19:06:04"
}
password Может быть пустым
email Обязательное, не пустое, не более 250 символов, должно соответствовать фоормату Email: в стандарте указано, что имя пользователя не должно превышать 64 символа, имя домена ограничено 255 символами, а знак @ – это один символ 400 {
"status": "BAD_REQUEST",
"message": "Email должен быть не больше 250 знаков; ",
"date": "2023-09-11 19:06:04"
}
avatarUrl Не обязательное, не более 1000 символов 400 {
"status": "BAD_REQUEST",
"message": "Длина адреса должна быть не больше 1000 знаков; ",
"date": "2023-09-11 19:06:04"
}

Запрос GET /users/{userId} - получение информации о пользователе (Имя, Фамилия, Логин, Дата рождения, Дата регистрации, Аватар)

Специальные заголовки: нет
Тело: нет

Ответ

Специальные заголовки: нет
Тело: данные о пользователе
  {
  "id_user":2,
  "name": "Василий",
  "surname":"Петров", 
  "login":"Vasek",
  "email":"[email protected]",
  "date_birth":"2000-01-01",
  "dateRegistration":"2000-01-01",
  "avatarUrl":"https://pgcookbook.ru/programming/vasia.jpg"
  }
Возможные коды ответа:
  • 200 - данные пользователя успешно получены
  • 403 - нет прав для получения данных
  • 404 - по данному id пользователь не найден
  • 500 - неизвестная ошибка сервера

Ответы в случае ошибок:

Ошибка Ответ
403 {
"status": "FORBIDDEN",
"message": "Нет прав для совершения операции",
"date": "2023-09-11 19:06:04"
}
404 {
"status": "NOT_FOUND",
"message": "Пользователь c id 10 не найден ",
"date": "2023-09-11 19:06:04"
}
500 {
"status": "INTERNAL_SERVER_ERROR",
"message": "Неизвестная ошибка сервера",
"date": "2023-09-11 19:06:04"
}

Контроллер /users/lessons

Запрос GET /users/{userId}/lessons?from=2020-12-25&&to=2020-12-31 - получение информации о запланированных пользователем уроках в заданном диапазоне, включая указанные даты. Если параметры не указаны - то возвращаются уроки за текущую неделю. Список отсортирован от меньшей даты к большей. Список параметров по каждому событию:

  • Дата
  • Время начала
  • Время окончания
  • Название предмета
  • Прогресс
  • Отметка о выполнении (выставляется при % выполнения 100 автоматически или вручную при любом % выполнения - за это отвечает бэк)
Специальные заголовки:
Тело: нет

Ответ

Специальные заголовки: нет
Тело: массив уроков за указанный диапазон, отсортированный от меньшей даты к большей
[
  {
    "idLesson": 1,
    "subject": {
      "idSubject": 1,
      "name": "Математика"
    },
    "topic": "Считаем до 5",
    "date": "2023-09-11",
    "timeStart": "09:00:00",
    "timeEnd": "09:40:00",
    "progress": 0,
    "checkSuccessfully": false
  },
  {
    "idLesson": 2,
    "subject": {
      "idSubject": 4,
      "name": "Технология"
    },
    "topic": "Переходим дорогу",
    "date": "2023-09-11",
    "timeStart": "10:00:00",
    "timeEnd": "10:40:00",
    "progress": 0,
    "checkSuccessfully": false
  }
]
Возможные коды ответа:
  • 200 - данные успешно получены

  • 400 - ошибка в строке запроса

  • 403 - нет прав для получения данных

  • 500 - неизвестная ошибка сервера

    Ответы в случае ошибок:

Ошибка Дополнительная информация Ответ
400 Ошибка в строке запроса
(например, несуществующая дата)
{
"status": "BAD_REQUEST",
"message": "Неверный параметр запроса: проверьте параметры",
"date": "2023-09-11 19:06:04"
}
403 нет {
"status": "FORBIDDEN",
"message": "Нет прав для совершения операции",
"date": "2023-09-11 19:06:04"
}
500 нет {
"status": "INTERNAL_SERVER_ERROR",
"message": "Неизвестная ошибка сервера",
"date": "2023-09-11 19:06:04"
}

Запрос GET /users/{userId}/lessons/{lessonId}- получение информации о конкретном уроке. Возвращаются данные:

  • Дата
  • Время начала
  • Время окончания
  • Название предмета
  • Ссылка на теорию (ссылка на файл, пока просто храним как строку)
  • Ссылка на практическое задание (ссылка на файл, пока просто храним как строку)
  • Ссылка на домашнюю рабооту (ссылка на файл, пока просто храним как строку)
  • % выполнения (от 0 до 100%)
  • Отметка о выполнении (выставляется при % выполнения 100 автоматически или вручную при любом % выполнения)
Специальные заголовки: нет
Тело: нет

Ответ

Специальные заголовки: нет
Тело: данные об уроке с указанным id
{
  "idLesson": 2,
  "subject": {
    "idSubject": 4,
    "name": "Технология"
  },
  "topic": "Переходим дорогу",
  "date": "2023-09-11",
  "timeStart": "10:00:00",
  "timeEnd": "10:40:00",
  "theoryUrl": "https://pgcookbook.ru/programming/1.htm",
  "practiceUrl": "https://pgcookbook.ru/programming/1.htm",
  "homeworkUrl": "https://pgcookbook.ru/programming/1.htm",
  "progress": 0,
  "checkSuccessfully": false
}
Возможные коды ответа:
  • 200 - данные успешно получены

  • 403 - нет прав для получения данных

  • 404 - урок не найден

  • 500 - неизвестная ошибка сервера

    Ответы в случае ошибок:

Ошибка Дополнительная информация Ответ
403 нет {
"status": "FORBIDDEN",
"message": "Нет прав для совершения операции",
"date": "2023-09-11 19:06:04"
}
404 Урок у указанного пользователя
с указанныи id не найден
{
"status": "NOT_FOUND",
"message": "У пользователя с id 1 не найден урок с id 1",
"date": "2023-09-11 19:06:04"
}
500 нет {
"status": "INTERNAL_SERVER_ERROR",
"message": "Неизвестная ошибка сервера",
"date": "2023-09-11 19:06:04"
}

Запрос POST /users/{userId}/lessons - создание нового урока, в теле данные урока

Специальные заголовки:

Content-Type : application/json

Тело:
{
  "subject": {
    "idSubject": 2
  },
  "topic": "Предлоги",
  "date": "2023-09-14",
  "timeStart": "09:40:00",
  "timeEnd": "09:40:00",
  "theoryUrl": "https://habr.com/ru/theoryUrl.htm",
  "practiceUrl": "https://habr.com/ru/practiceUrl.htm",
  "homeworkUrl": "https://habr.com/ru/homeworkUrl.htm",
  "progress": 0,
  "checkSuccessfully": false
}

Ответ

Специальные заголовки: нет
Тело: данные о созданном уроке
{
  "idLesson": 29,
  "subject": {
    "idSubject": 2,
    "name": "Русский язык"
  },
  "topic": "Предлоги",
  "date": "2023-09-24",
  "timeStart": "09:40:00",
  "timeEnd": "09:40:00",
  "theoryUrl": "https://habr.com/ru/theoryUrl.htm",
  "practiceUrl": "https://habr.com/ru/practiceUrl.htm",
  "homeworkUrl": "https://habr.com/ru/homeworkUrl.htm",
  "progress": 0,
  "checkSuccessfully": false
}
Возможные коды ответа:
  • 201 - урок успешно создан

  • 400 - ошибка в запросе

  • 403 - нет прав для создания урока

  • 500 - неизвестная ошибка сервера

    Ответы в случае ошибок:

Ошибка Дополнительная информация Ответ
400 Ошибка в JSON {
"status": "BAD_REQUEST",
"message": "Неверная структура объекта: проверьте скобки, запятые и названия полей",
"date": "2023-09-11 19:06:04"
}
400 Не указан id предмета {
"status": "BAD_REQUEST",
"message": "Id предмета обязателен для заполнения; ",
"date": "2023-09-11 19:06:04"
}
400 Не указана тема урока/пустая {
"status": "BAD_REQUEST",
"message": "Тема урока обязательна для заполнения; ",
"date": "2023-09-11 19:06:04"
}
400 Не указана дата урока/пустая {
"status": "BAD_REQUEST",
"message": "Дата урока обязательна для заполнения; ",
"date": "2023-09-11 19:06:04"
}
400 Не указано время начала урока/пустое {
"status": "BAD_REQUEST",
"message": "Время начала урока обязательно для заполнения; ",
"date": "2023-09-11 19:06:04"
}
400 Не указано время окончания урока/пустое {
"status": "BAD_REQUEST",
"message": "Время окончания урока обязательно для заполнения; ",
"date": "2023-09-11 19:06:04"
}
403 нет {
"status": "FORBIDDEN",
"message": "Нет прав для совершения операции",
"date": "2023-09-11 19:06:04"
}
404 Указан предмет с несуществующим id {
"status": "NOT_FOUND",
"message": "Предмет c id 0 не найден",
"date": "2023-09-11 19:06:04"
}
500 нет {
"status": "INTERNAL_SERVER_ERROR",
"message": "Неизвестная ошибка сервера",
"date": "2023-09-11 19:06:04"
}

Ограничения на длину полей при создании урока:

Поле Ограничение Код ответа Ответ в случае если ограничение не выполнено
subject.idSubject Должно существовать с таблице subjects 404 {
"status": "NOT_FOUND",
"message": "Предмет c id 0 не найден.",
"date": "2023-09-13 19:46:24"
}
subject.idSubject Обязательное 400 {
"status": "BAD_REQUEST",
"message": "Id предмета обязателен для заполнения; ",
"date": "2023-09-13 19:47:53"
}
topic Обязательное 400 {
"status": "BAD_REQUEST",
"message": "Тема урока обязательна для заполнения; ",
"date": "2023-09-13 19:55:12"
}
topic Не более 500 символов 400 {
"status": "BAD_REQUEST",
"message": "Тема урока должна быть не больше 500 знаков; ",
"date": "2023-09-13 19:55:12"
}
date Обязательное 400 {
"status": "BAD_REQUEST",
"message": "Дата урока обязательна для заполнения; ",
"date": "2023-09-13 19:56:09"
}
timeStart Обязательное 400 {
"status": "BAD_REQUEST",
"message": "Время начала урока обязательно для заполнения; ",
"date": "2023-09-13 19:59:16"
}
timeEnd Обязательное {
"status": "BAD_REQUEST",
"message": "Время окончания урока обязательно для заполнения; ",
"date": "2023-09-13 19:59:16"
}
theoryUrl Не обязательное, не более 1000 символов 400 {
"status": "BAD_REQUEST",
"message": "Длина адреса должна быть не больше 1000 знаков; ",
"date": "2023-09-11 19:06:04"
}
practiceUrl Не обязательное, не более 1000 символов 400 {
"status": "BAD_REQUEST",
"message": "Длина адреса должна быть не больше 1000 знаков; ",
"date": "2023-09-11 19:06:04"
}
homeworkUrl Не обязательное, не более 1000 символов 400 {
"status": "BAD_REQUEST",
"message": "Длина адреса должна быть не больше 1000 знаков; ",
"date": "2023-09-11 19:06:04"
}
progress Не обязательное, целое число от 0 (включительно) до 100 (включительно) 400 {
"status": "BAD_REQUEST",
"message": "Прогресс должен быть числом от 0 до 100; ",
"date": "2023-09-11 19:06:04"
}
checkSuccessfully Не обязательное

Запрос PATCH /users/{userId}/lessons/{lessonId} - изменение урока, в теле данные урока

Специальные заголовки:

Content-Type : application/json

Тело:
{
  "subject": {
    "idSubject": 2
  },
  "topic": "Предлоги",
  "date": "2023-09-16",
  "timeStart": "15:40:00",
  "timeEnd": "16:00:00",
  "theoryUrl": "https://habr.com/ru/theoryUrl.htm",
  "practiceUrl": "https://habr.com/ru/practiceUrl.htm",
  "homeworkUrl": "https://habr.com/ru/homeworkUrl.htm",
  "progress": 100,
  "checkSuccessfully": true
}

Ответ

Специальные заголовки: нет
Тело: обновленная информация об уроке
{
  "idLesson": 1,
  "subject": {
    "idSubject": 2,
    "name": "Русский язык"
  },
  "topic": "Предлоги",
  "date": "2023-09-16",
  "timeStart": "15:40:00",
  "timeEnd": "16:00:00",
  "theoryUrl": "https://habr.com/ru/theoryUrl.htm",
  "practiceUrl": "https://habr.com/ru/practiceUrl.htm",
  "homeworkUrl": "https://habr.com/ru/homeworkUrl.htm",
  "progress": 100,
  "checkSuccessfully": true
}
Возможные коды ответа:
  • 200 - данные успешно обновлены
  • 400 - ошибка в запросе
  • 403 - нет прав для изменения данных
  • 404 - урок не найден
  • 500 - неизвестная ошибка сервера

Ответы в случае ошибок:
аналогичны ответам при создании урока

Ограничения на длину полей при редактировании урока:
аналогичны ответам при создании урока

Запрос DELETE /users/{userId}/lessons/{lessonId} - удаление урока

Специальные заголовки:нет
Тело: нет

Ответ

Специальные заголовки: нет
Тело: нет
Возможные коды ответа:
  • 204 - урок успешно удален
  • 404 - пользователь или урок не найден
  • 403 - нет прав для удаления урока
  • 500 - неизвестная ошибка сервера
Ошибка Дополнительная информация Ответ
403 нет {
"status": "FORBIDDEN",
"message": "Нет прав для совершения операции",
"date": "2023-09-11 19:06:04"
}
404 Пользователь с указанным id не найден {
"status": "NOT_FOUND",
"message": "Пользователь c id 10 не найден ",
"date": "2023-09-11 19:06:04"
}
404 Урок с указанным id не найден {
"status": "NOT_FOUND",
"message": "Урок c id 0 не найден",
"date": "2023-09-11 19:06:04"
}
500 нет {
"status": "INTERNAL_SERVER_ERROR",
"message": "Неизвестная ошибка сервера",
"date": "2023-09-11 19:06:04"
}

Контроллер /subjects

Запрос GET /subjects - возвращает список предметов

Тело: нет

Ответ

Специальные заголовки: нет
Тело: массив предметов
[{
		"subject": {
			"idSubject": 1,
			"name": "Математика"
		}
	},
	{
		"subject": {
			"idSubject": 2,
			"name": "Русский язык"
		}
	},
	{
		"subject": {
			"idSubject": 3,
			"name": "Технология"
		}
	}
]
Возможные коды ответа:
  • 200 - данные успешно получены
  • 403 - нет прав для получения данных
  • 500 - неизвестная ошибка сервера
Ошибка Дополнительная информация Ответ
403 нет {
"status": "FORBIDDEN",
"message": "Нет прав для совершения операции",
"date": "2023-09-11 19:06:04"
}
500 нет {
"status": "INTERNAL_SERVER_ERROR",
"message": "Неизвестная ошибка сервера",
"date": "2023-09-11 19:06:04"
}

Фичи для дальнейшего развития

  • добавить регистрацию и авторизацию
  • добавить проверку при создании урока на пересечение урока с уже существующими (если урок пересекается с другим, сообщать об этом и урок не создавать)
  • добавить проверку что время начала урока не раньше его окончания
  • добавить вывод в интерефейс по дням, неделям, месяцам
  • в списке предметов сделать сортировку по алфавиту (метод GET /subjects)
  • в логине пользователя ограничить символы: можно использовать только английские буквы и цифры
  • добавить сохранение логов на сервере в файл (бэкенд)
  • реализовать обновление сущностей с помощью PATCH запросов в случае если приходит от одного до полного количества полей объекта (и для пользователя и для урока)

About

Мини-lms система для родителей, которые организуют семейное обучение детей дома, групповой пет-проект ПРОЕКТ ЗАКРЫТ

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published