docker-compose build
// Run migrations
docker-compose run backend npx sequelize-cli db:migrate
// Run seeds
docker-compose run backend npx sequelize-cli db:seed:all
docker-compose up
https://amal-backend.herokuapp.com/ deployed to Heroku
docker-compose build
// Run migrations
docker-compose run backend npx sequelize-cli db:migrate
// Run seeds
docker-compose run backend npx sequelize-cli db:seed:all
docker-compose up
https://amal-backend.herokuapp.com/ deployed to Heroku
Конечный результат:
Создается сущность "Streams", касающуюся направления учащихся. Создается связь с сущностью "Students".
Прописать валидацию для данной сущности
План решения:
Мотивация:
Появляется сущность "Streams" которая связывается со сущностью "Students" по полю "streamId"
Критерии приемки:
Создана сущность "Streams", а так же связь между сущностями "Streams" и "Students".
Планируемое время работы:
1 час
Конечный результат:
CRUD для модели Lesson
План решения:
Мотивация:
Ключевые функции для взаимодействия с расписанием
Критерии приемки:
http://localhost:8080/lessons/
{
"startTime",
"endTime",
"groupId",
"teacherId",
"subjectId"
}
создается запись в БД
http://localhost:8080/lessons/{ID}
Планируемое время работы:
1 час 30 ммн
Описание бага
Конфликт id из seed c AutoIncrement id
Шаги воспроизведения:
Наблюдаемое поведение:
Получаем ошибку что запись с таким id существует
Ожидаемое поведение:
Создается запись
Причины:
AutoIncrement id не учитывает захардкоженные id записей из seeds
Вариант решения:
Изменить все сиды, начиная с 1000 нумерации
Конечный результат:
По запросу получить список последних оплат учеников
План решения:
Мотивация:
Увидеть статус оплаты учеников
Критерии приемки:
При запросе получим список последних оплат учеников
Планируемое время работы:
1 час
Конечный результат:
Реализовать API для создания журнала уроков на заданный период
План решения:
POST groups/{groupId}/lessons/add
Мотивация:
Необходимый функционал для создания журнала
Критерии приемки:
При POST запросе на groups/{groupId}/lessons/add
с соответствующими параметрами создаются записи уроков
Планируемое время работы:
3 час
Конечный результат:
Создать модель для урока, которая будет включать в себя ссылку на предмет, учителей,группу, время и дату начала и окончания, а так же сиды и миграции для нее.
План решения:
Модель создается при помощи соответствующих команд sequelize.
Мотивация:
Необходимо для взаимодействия с расписанием
Критерии приемки:
Полноценная работающая модель Lesson с сидами и миграциями
Планируемое время работы:
1 час 30 мин
Конечный результат:
Реализовать пагинацию при запросах
План решения:
Один из примеров по реализации: https://bezkoder.com/node-js-sequelize-pagination-mysql/
Мотивация:
Зачем это нужно потребителю
Критерии приемки:
По каким критериям будет приниматься выполненная работа
Планируемое время работы:
1 час
Конечный результат:
Нужно создать в Lesson контроллере функцию получения уроков, закрепленных соответствующим группам.
План решения:
После создания контроллера для Lesson, добавить гет-запрос, который принимает id группы и возвращает список уроков соответствующей группы.
Мотивация:
Необходимо для взаимодействия с расписанием.
Критерии приемки:
Запрос принимает id группы и возвращает именно те уроки, что относятся к указанной группе.
Планируемое время работы:
1 час
Конечный результат:
Что нужно сделать
План решения:
Как это сделать
Мотивация:
Зачем это нужно потребителю
Критерии приемки:
По каким критериям будет приниматься выполненная работа
Планируемое время работы:
1 час
Конечный результат:
Добавить метод для извлечения студентов по группам
План решения:
Добавить метод в controllers на извлечение студентов, по определенной группе, используя query paramater
Прописать router для извлечения данных.
Мотивация:
Возможность для администратора видеть список учеников по определенной группе.
Критерии приемки:
Проверить запросы на endpoint черезе postman, а также через фронт приложение.
Планируемое время работы:
30 мин
Описание бага
В файлах миграции, при откате с заполненной таблицей происходят ошибки
Шаги воспроизведения:
Наблюдаемое поведение:
Процесс миграции прерывается
Ожидаемое поведение:
Процесс миграции не должен прерываться
Причины:
Происходит добавление поля поля stream cо свойством allowNull:false
Вариант решения:
Почитать документацию
Конечный результат:
В сущности учителей параметр "telephone" должен быть сделан обязательным.
План решения:
Либо добавить allowNull:false в модель, либо указать это в схеме для учителей в файле schemas для валидатора.
Мотивация:
Телефон для заказчика является обязательным параметром.
Критерии приемки:
Не допускается создание учителя при пустом телефоне
Планируемое время работы:
15 мин.
Конечный результат:
При редактировании студента подправить изменение статуса.
Отрефакторить метод updateOne для передачи данных для редактирования и сократить рабочий код.
План решения:
В контроллере StudentController подправить метод updateOne для того, чтобы изменять статус.
Также подумать как сократить рабочий код при отправке с фронта формы редактирования и получения данных через req.body.
Подправить обработку ошибок с 400 на 404.
Мотивация:
Необходимость рабочего метода для редактирования студента, включая поле статус.
Критерии приемки:
При отправке с фронта данных для изменения студента, получать данные по всем измененным полям.
Планируемое время работы:
1 час
Описание бага
При добавлении нового студента, не осуществляет функционал, если поле "Группа" не заполнено, даже, если статус студента "Отчислен". При этом, данное поле не является обязательным.
Шаги воспроизведения:
На фронте:
Наблюдаемое поведение:
При проверке на бэке через консоль лог, выдает ошибку кода 22P02. Текст гласит, что original: error: invalid input syntax for type integer: ""
Ожидаемое поведение:
Функция добавления должна добавлять нового студента безотносительно наличия группы. Однако, добавление осуществляется, если группа в соответствующей форме выбрана.
Причины:
Отмечает, что поле с группой модели "Студент" не может принимать пустые значения.
Вариант решения:
Возможно, стоит отредактировать поле StreamId на предмет его обязательности.
Описание
Удалить файл dotenv файл
Шаги воспроизведения:
Причины:
В дальнейшем будем запускать проект через докер
Время: 10 минут
Конечный результат:
Реализовать возможность логина пользователя, которая в будущем повлияет на осуществление тех или иных запросов проекта.
План решения:
В данном случае - воспользовавшись полученными знаниями изучения модуля passport js. Модели user нужно добавить свойства имени/пароля/токена/роли для пользователя с контроллером и роутами.
Мотивация:
Аутентификация - одна из центральных возможностей в данном проекте.
Критерии приемки:
Запускаем Postman
Для регистрации: выбираем метод POST, на адресной строке http://localhost:8080/users/register
в формате JSON пишем логин и пароль:
{
"username": "test6",
"password": "test123456"
}
Отправляем запрос
При успешной регистрации показывает
{
"id": 5,
"username": "test6",
"password": "$2b$10$3z7zGBCqVYs9OC3G94DQjuRQQ37Xluhxy81lzTLxhnqqhBAsZ9g1O",
"updatedAt": "2021-08-11T16:06:30.556Z",
"createdAt": "2021-08-11T16:06:30.556Z"
}
Чтобы войти: выбираем метод POST, на адресной строке http://localhost:8080/users/login
в формате JSON пишем логин и пароль.
Если успешно вошли в систему, показывает токен
Скоприровать токен
Через GET отправляем запрос на адрес http://localhost:8080/students
Выходит ошибка Unauthorized
Заходим во вкладку Authorization
Из Type выбираем Bearer Token
Появляется инпут Token,туда вставим скопирванный токен
Отправляем запрос
Появляется список студентов
Планируемое время работы:
8 часов
Конечный результат:
Что нужно сделать
План решения:
Как это сделать
Мотивация:
Зачем это нужно потребителю
Критерии приемки:
По каким критериям будет приниматься выполненная работа
Планируемое время работы:
1 час
Конечный результат:
В модели Payment появится виртуальное поле "Статус оплаты"
План решения:
Создать виртуальное поле "Статус оплаты" в модели Payment
Критерии приемки:
В модели Payment появится виртуальное поле "Статус оплаты"
Планируемое время работы:
3 часа
Конечный результат:
При get запросе по студентам получить поле stream.name для передачи и отображения на фронте
План решения:
В StudentsController доработать метод getAll для получения студентов вместе с полем stream.name
Мотивация:
Администратору необходимо видеть наименование направления вместо stream.id
Критерии приемки:
При запросе на фронте по списку студентов получить наименование направления
Планируемое время работы:
2 часа
Конечный результат:
При редактировании ученика, когда статус меняется на "Отчисленный", поле "Группа" станет пустой;
План решения:
В StudentController в метод updateOne добавить условие на проверку статуса студента. Если приходит статус "Отчисленный", то передавать значение groupId = null.
Мотивация:
Если ученик отчисляется, то группа обнуляется.
Критерии приемки:
При редактировании ученика, когда статус меняется на "Отчисленный", поле "Группа" станет пустой;
Планируемое время работы:
30 мин
Конечный результат:
Гайд по запуску приложения, описание API
План решения:
Описать в readme.md
Мотивация:
Необходимо для использования другими разработчиками
Критерии приемки:
По каким критериям будет приниматься выполненная работа
Планируемое время работы:
1 час
Конечный результат:
Что нужно сделать
План решения:
Нужно изучить документацию http://www.passportjs.org/ и сопутствующие материалы (включая видео-уроки по теме) для использования в будущем в качестве основы функционала авторизации.
Мотивация:
Это нужно, в первую очередь, разработчику для осуществления одной из основополагающих функций проекта - авторизации пользователя.
Критерии приемки:
Полученные навыки будут задействованы в выполнении тикета по авторизации.
Планируемое время работы:
5 часов. Либо больше, либо меньше - в зависимости от скорости усвоения материала.
Конечный результат:
Админ может добавлять комментарии касательно оплаты учеников
План решения:
Вызвать команды модернизации поля таблицы sequelize
На появившемся файле миграции, написать функцию добавления поля на таблицу
Мотивация:
Написать нюансы касательно оплат учеников
Критерии приемки:
При запросах можно выполнять CRUD операции на поле комментариев таблицы Оплат
Планируемое время работы:
1 час
Конечный результат:
Если получен query параметр, то обработать запрос по этим параметрам
Планируемое время работы:
1 час
Конечный результат:
Автоматическое форматирование, исправление стилистических ошибок
План решения:
Запустить npx eslint --init
выбрать настройки
установить зависимости
Мотивация:
Соблюдение единого стиля кода приложения
Критерии приемки:
По каким критериям будет приниматься выполненная работа
Планируемое время работы:
1 час
Конечный результат:
Создать StreamController, StreamRoutes
План решения:
Добавить метод getAll на получения списка по Направлению
Мотивация:
Отобразить список направлений на фронте
Критерии приемки:
Через postman отправить get запрос на /streams и получить список направлений
Планируемое время работы:
30 мин
Конечный результат:
файл с настройками eslint в проекте,
устранить ошибки eslint в проекте
План решения:
Изучить документацию https://eslint.org/
Мотивация:
Соблюдение единого стиля написания кода
Критерии приемки:
Наличие корректного файла .eslintrc
Планируемое время работы:
1 час
Конечный результат:
План решения:
Мотивация:
Необходим функционал добавления групп для выбранных студентов, у которых не было группы.
Критерии приемки:
Связь между Студентами и Группами.
Есть migartin
Есть seed
Планируемое время работы:
3 часа
Конечный результат:
Создается сущность Group с наименованием в качестве главного свойства. К сущности создаются роуты с CRUD
Создать валидацию для указанной сущности
План решения:
По аналогии с сущностью учеников.
Установить программы postgresql, ORM sequelize, pgAdmin4
Мотивация:
Позволит осуществлять манипуляции с группами
Критерии приемки:
Бэк корректно реагирует на наличие новой сущности, а роуты выполняют свои функции.
Планируемое время работы:
4 часа
Конечный результат:
Что нужно сделать
План решения:
Как это сделать
Мотивация:
Зачем это нужно потребителю
Критерии приемки:
По каким критериям будет приниматься выполненная работа
Планируемое время работы:
20мин
Конечный результат:
Связаные сущности Учители и Предметы между собой
План решения:
Мотивация:
Таблица учителей ссылается на таблицу предметов чтобы взять данных
Критерии приемки:
При JOIN полей имя, фамилия, название предмета таблиц Учители и Предметы в pgAdmin4 показывает общую таблицу, которая показывает какой учитель преподает по какому предмету
Планируемое время работы:
1 час
Перенести из прошлых веток руководство по API на вики
План действий:
Конечный результат:
Получаем базу всех предметов
План решения:
Создать модель, миграцинный файл, сиды, роуты(для отображения и создания) для сущности Предметов
Мотивация:
Хранение всех данных касательно предметов на одной базе
Критерии приемки:
На постмоне работают запросы показа предметов и добавления их
Планируемое время работы:
1 час
Конечный результат:
Добавить include в PaymentController getById для фронта
План решения:
Добавить include в PaymentController getById
Мотивация:
Необходимо выводить имя, фамилия студента при оплате
Критерии приемки:
Добавить include в PaymentController getById для фронта
Планируемое время работы:
10 мин
Описание
Рефакторинг кода
Наблюдаемое поведение:
Код нечитаемый
Ожидаемое поведение:
Легче читать код, у каждой функции один функционал
Причины:
В одной функции getPaymentStatus много функционала: прибавление + 1 месяц к дате, нахождение последний день следующего месяца, сравнение и возвращение стасус оплаты
Вариант решения:
Вывести в отдельные функции эти функционалы
Время: 30 минут
Конечный результат:
Готовый роут и контроллер для добавления, редактирования, удаления записи по оплате;
План решения:
Мотивация:
Созданные роут и контроллер обеспечут добавление, редактирование, удаление записи по оплате;
Критерии приемки:
Созданные роут и контроллер должны обеспечить добавление, редактирование, удаление записи по оплате;
Планируемое время работы:
3 часа
Конечный результат:
Создать сущность user для авторизации
План решения:
Создать модель, миграции, сиды через команды
Мотивация:
Авторизация пользователей
Критерии приемки:
Имеется связь между таблиц Users и Teachers
Планируемое время работы:
1 час
Конечный результат:
Получить все внесенные оплаты по определенному ученику
План решения:
Создать метод в PaymentController для извлечения всех оплат через findAll, используя query parameter studentId, отсортированный по последней даты оплаты.
Мотивация:
Возможность видеть детализацию оплат по студенту.
Критерии приемки:
При запросе получить все оплаты касательно этого ученика, отсортированную начиная с последней даты оплаты.
Планируемое время работы:
1 час
Описание бага
При добавлении существующей группы добавляется как новая группа,
Шаги воспроизведения:
Наблюдаемое поведение:
Добавляется новая группа с уже имеющимся наименованием
Ожидаемое поведение:
Формируется ошибка
Причины:
Нет проверки, что группа с таким именем уже существуют
Вариант решения:
Добавить полю таблицы атрибут unique
30 минут
Конечный результат:
API CRUD для студентов
План решения:
Реализовать обработку запросов
GET /students
- получить список студентов.POST /students
- добавить студентаPUT /students
- изменить данные студентаМотивация:
Базовый функционал приложения
Критерии приемки:
Приложение обрабатывает запросы
GET /students
- получить список студентов.POST /students
- добавить студентаPUT /students
- изменить данные студентаПланируемое время работы:
1 час
Конечный результат:
Получаем базу всех учителей
План решения:
Создать модель(с полями фамилия, имя, предмет, язык преподавания, телефон, email) миграцинный файл, сиды, роуты(CRUD) для сущности Учителей
Мотивация:
Хранение всех данных касательно учителей на одной базе
Критерии приемки:
На постмоне все CRUD операции работают
Планируемое время работы:
1 час
Конечный результат:
Для сущности lesson нужна валидация времени: соответствие свободного временного промежутка преподавателя, группы и урока.
План решения:
Можно реализовать в качестве миддлвэра, который сравнивает временные промежутки преподавателей, групп и уроков и совмещается с пост-запросом на добавление предмета. Если промежутки преподавателя и группы не соответствуют условиям - добавление не осуществляется.
Мотивация:
Важная составляющая для составления расписания.
Критерии приемки:
Уроки создаются после успешной валидации.
Планируемое время работы:
1 ч.
Конечный результат:
Все костомные ошибки стандартной структуры, для упрощения обработки на frontend
План решения:
https://dev.to/nedsoft/central-error-handling-in-express-3aej
Мотивация:
Зачем это нужно потребителю
Критерии приемки:
По каким критериям будет приниматься выполненная работа
Планируемое время работы:
1 час
Конечный результат:
Создать в контроллере Teacher функцию получения учителей по предметам - getBySubject (к примеру), которая выдаст список учителей, закрепленных за искомым предметом.
План решения:
В TeacherController задействовать гет-запрос, включающий фильтрацию списка учителей через передачу subjectId.
Мотивация:
Одна из ключевых функций для расписания.
Критерии приемки:
При запросе и передаче id предмета, функция возвращает список найденных преподавателей.
Планируемое время работы:
1 час
Конечный результат:
Запрос на получение уроков на основании id группы должен функционировать после переноса ряда функций.
План решения:
Функция получения уроков по группе должна быть отрефакторена и перенесена в контроллер Групп.
Мотивация:
Другая важная функция для работы с расписанием
Критерии приемки:
При соответствующем запросе с фильтрующим параметром возвращает список уроков, закрепленных за группой.
Пример запроса
http://localhost:8080/groups/1/lessons?startTime=2021-01-31&endTime=2021-02-02
Планируемое время работы:
30 мин
Конечный результат:
ENDPOINT PUT /group/{$groupId}/add-students
План решения:
Критерии приемки:
Добавление группы для выбранных студентов, у которых не было группы.
Планируемое время работы:
3 часа
Конечный результат:
Обработка запросов и формирование и отправка ошибок однообразной структуры
План решения:
Как это сделать
Мотивация:
Для обработки ошибок на frontend`е
Критерии приемки:
Планируемое время работы:
Конечный результат:
Запрос на получение уроков на основании id учителя.
План решения:
Гет запрос и функция в контроллере учителей, где в качестве параметра фильтрации уроков будет использован teacherId.
Мотивация:
Другая важная функция для работы с расписанием
Критерии приемки:
При соответствующем запросе с фильтрующим параметром возвращает список уроков, закрепленных за учителем.
Пример запроса
/teachers/1/lessons?startTime=2021-01-31T09:30:00.000Z&endTime=2021-01-31T10:00:00.000Z
Планируемое время работы:
1 час
Конечный результат:
В БД добавить сущность для хранения оплаты
План решения:
Критерии приемки:
Должен быть файлы миграции, файл seed. Создание и откаты по файлам миграции и seed должны проходить без ошибок.
Планируемое время работы:
3 часа
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.