Проект закрыт
https://github.com/Valentina810/lms - для развертывания склонировать проект, выполнить в корне проекта команду docker-compose up
сваггер будет доступен по адресу https://localhost:8080/swagger-ui/index.html
https://github.com/AnnaSog/LMS
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
Первоначальный MVP не предусматривает регистрацию пользователей. Считаем что пользователь уже зарегистрирован. В таблице 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" } |
Обязательное, не пустое, не более 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" } |
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 | Может быть пустым | ||
Обязательное, не пустое, не более 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" } |
Запрос 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 автоматически или вручную при любом % выполнения)
{
"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" } |
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 | Не обязательное |
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 - неизвестная ошибка сервера
Ответы в случае ошибок:
аналогичны ответам при создании урока
Ограничения на длину полей при редактировании урока:
аналогичны ответам при создании урока
- 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" } |
[{
"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 запросов в случае если приходит от одного до полного количества полей объекта (и для пользователя и для урока)