Giter Club home page Giter Club logo

amal_backend's Introduction

amal_backend

Setup

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

Run

docker-compose up

Heroku

https://amal-backend.herokuapp.com/ deployed to Heroku

amal_backend's People

Contributors

xx3u avatar bauyrjanseidahmet avatar omegonalpharius avatar nurlan212 avatar zaurqoban avatar

Watchers

 avatar

Forkers

zaurqoban

amal_backend's Issues

Сущность "Направление"

Конечный результат:
Создается сущность "Streams", касающуюся направления учащихся. Создается связь с сущностью "Students".
Прописать валидацию для данной сущности

План решения:

  1. Создать файл миграции для создания модели "Strem";
  2. Создать файл миграции, который поменяет поле "stream" на "streamId" в сущности "Students", а так же создает внешный ключ.

Мотивация:
Появляется сущность "Streams" которая связывается со сущностью "Students" по полю "streamId"

Критерии приемки:
Создана сущность "Streams", а так же связь между сущностями "Streams" и "Students".

Планируемое время работы:
1 час

CRUD Api для Lesson

Конечный результат:
CRUD для модели Lesson

План решения:

  1. Нужно реализовать функционал , добавления, удаления нового объекта модели Lesson.
  2. Подключить валидацию json при создании записи

Мотивация:
Ключевые функции для взаимодействия с расписанием

Критерии приемки:

  1. При отправки POST запроса на http://localhost:8080/lessons/
 {
  "startTime",
  "endTime",
  "groupId",
  "teacherId",
  "subjectId"
  }

создается запись в БД

  1. При отправки DELETE запроса на http://localhost:8080/lessons/{ID}
    Удаляется запись с {ID}

Планируемое время работы:
1 час 30 ммн

Конфликт id из seed c AutoIncrement id

Описание бага
Конфликт id из seed c AutoIncrement id

Шаги воспроизведения:

  1. Запустить с нуля проект,
  2. запустить миграции
  3. запустить seed
  4. Отправить POST запрос на создание студента

Наблюдаемое поведение:
Получаем ошибку что запись с таким id существует

Ожидаемое поведение:
Создается запись

Причины:
AutoIncrement id не учитывает захардкоженные id записей из seeds

Вариант решения:
Изменить все сиды, начиная с 1000 нумерации

Создать функционал показа списка последних оплат учеников

Конечный результат:
По запросу получить список последних оплат учеников

План решения:

Мотивация:
Увидеть статус оплаты учеников

Критерии приемки:
При запросе получим список последних оплат учеников

Планируемое время работы:
1 час

Создание журнала уроков группы на период

Конечный результат:
Реализовать API для создания журнала уроков на заданный период

План решения:

  1. Реализовать роут POST groups/{groupId}/lessons/add
  2. Роут принимает параметры дата начала и конца недели которую принять за шаблон, и период на который создаются записи
  3. Реализовать валидацию параметров
  4. Реализовать запрос уроков для шаблона из бд
  5. Растиражировать уроки на заданный период на основе шаблона

Мотивация:
Необходимый функционал для создания журнала

Критерии приемки:
При POST запросе на groups/{groupId}/lessons/add с соответствующими параметрами создаются записи уроков

Планируемое время работы:
3 час

Создать модель Lesson

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

План решения:
Модель создается при помощи соответствующих команд sequelize.

Мотивация:
Необходимо для взаимодействия с расписанием

Критерии приемки:
Полноценная работающая модель Lesson с сидами и миграциями

Планируемое время работы:
1 час 30 мин

Реализовать пагинацию при запросах

Конечный результат:
Реализовать пагинацию при запросах

План решения:
Один из примеров по реализации: https://bezkoder.com/node-js-sequelize-pagination-mysql/

Мотивация:
Зачем это нужно потребителю

Критерии приемки:
По каким критериям будет приниматься выполненная работа

Планируемое время работы:
1 час

Получение Lesson по принадлежности к Group

Конечный результат:
Нужно создать в Lesson контроллере функцию получения уроков, закрепленных соответствующим группам.

План решения:
После создания контроллера для Lesson, добавить гет-запрос, который принимает id группы и возвращает список уроков соответствующей группы.

Мотивация:
Необходимо для взаимодействия с расписанием.

Критерии приемки:
Запрос принимает id группы и возвращает именно те уроки, что относятся к указанной группе.

Планируемое время работы:
1 час

Добавить "Статус" сущности учащихся

Конечный результат:
Что нужно сделать

План решения:
Как это сделать

Мотивация:
Зачем это нужно потребителю

Критерии приемки:
По каким критериям будет приниматься выполненная работа

Планируемое время работы:
1 час

Добавить endpoint метод /students?groupId=

Конечный результат:
Добавить метод для извлечения студентов по группам

План решения:
Добавить метод в controllers на извлечение студентов, по определенной группе, используя query paramater
Прописать router для извлечения данных.

Мотивация:
Возможность для администратора видеть список учеников по определенной группе.

Критерии приемки:
Проверить запросы на endpoint черезе postman, а также через фронт приложение.

Планируемое время работы:
30 мин

Исправить migration файлы

Описание бага
В файлах миграции, при откате с заполненной таблицей происходят ошибки

Шаги воспроизведения:

  1. Запускаем команду npm run migrate:undo
  2. Появляется ошибка, что какое-то из полей имеет null values/ либо no relation/ no fieldName

Наблюдаемое поведение:
Процесс миграции прерывается

Ожидаемое поведение:
Процесс миграции не должен прерываться

Причины:
Происходит добавление поля поля stream cо свойством allowNull:false

Вариант решения:
Почитать документацию

Сделать параметр "телефон" обязательным для учителей

Конечный результат:
В сущности учителей параметр "telephone" должен быть сделан обязательным.

План решения:
Либо добавить allowNull:false в модель, либо указать это в схеме для учителей в файле schemas для валидатора.

Мотивация:
Телефон для заказчика является обязательным параметром.

Критерии приемки:
Не допускается создание учителя при пустом телефоне

Планируемое время работы:
15 мин.

Рефакторинг метода student update

Конечный результат:
При редактировании студента подправить изменение статуса.
Отрефакторить метод updateOne для передачи данных для редактирования и сократить рабочий код.

План решения:
В контроллере StudentController подправить метод updateOne для того, чтобы изменять статус.
Также подумать как сократить рабочий код при отправке с фронта формы редактирования и получения данных через req.body.
Подправить обработку ошибок с 400 на 404.

Мотивация:
Необходимость рабочего метода для редактирования студента, включая поле статус.

Критерии приемки:
При отправке с фронта данных для изменения студента, получать данные по всем измененным полям.

Планируемое время работы:
1 час

Баг при добавлении студентов - требует группу

Описание бага
При добавлении нового студента, не осуществляет функционал, если поле "Группа" не заполнено, даже, если статус студента "Отчислен". При этом, данное поле не является обязательным.

Шаги воспроизведения:
На фронте:

  1. Зайти на страницу студентов;
  2. Добавить нового студента;
  3. Заполнить обязательные формы, оставив строку с Группой пустой;
  4. Не добавляет студента, ссылается на ошибку в бэкенде.

Наблюдаемое поведение:
При проверке на бэке через консоль лог, выдает ошибку кода 22P02. Текст гласит, что original: error: invalid input syntax for type integer: ""

Ожидаемое поведение:
Функция добавления должна добавлять нового студента безотносительно наличия группы. Однако, добавление осуществляется, если группа в соответствующей форме выбрана.

Причины:
Отмечает, что поле с группой модели "Студент" не может принимать пустые значения.

Вариант решения:
Возможно, стоит отредактировать поле StreamId на предмет его обязательности.

Удалить dotenv файл и зависимость из проекта

Описание
Удалить файл dotenv файл

Шаги воспроизведения:

  1. Удалить файл .env
  2. Удалить файл .env.example
  3. Удалить зависимость dotenv из проекта

Причины:
В дальнейшем будем запускать проект через докер

Время: 10 минут

Аутентификация

Конечный результат:
Реализовать возможность логина пользователя, которая в будущем повлияет на осуществление тех или иных запросов проекта.

План решения:
В данном случае - воспользовавшись полученными знаниями изучения модуля passport js. Модели user нужно добавить свойства имени/пароля/токена/роли для пользователя с контроллером и роутами.

Мотивация:
Аутентификация - одна из центральных возможностей в данном проекте.

Критерии приемки:

  1. Запускаем Postman

  2. Для регистрации: выбираем метод POST, на адресной строке http://localhost:8080/users/register
    в формате JSON пишем логин и пароль:
    {
    "username": "test6",
    "password": "test123456"
    }

  3. Отправляем запрос

  4. При успешной регистрации показывает
    {
    "id": 5,
    "username": "test6",
    "password": "$2b$10$3z7zGBCqVYs9OC3G94DQjuRQQ37Xluhxy81lzTLxhnqqhBAsZ9g1O",
    "updatedAt": "2021-08-11T16:06:30.556Z",
    "createdAt": "2021-08-11T16:06:30.556Z"
    }

  5. Чтобы войти: выбираем метод POST, на адресной строке http://localhost:8080/users/login
    в формате JSON пишем логин и пароль.

  6. Если успешно вошли в систему, показывает токен

  7. Скоприровать токен

  8. Через GET отправляем запрос на адрес http://localhost:8080/students

  9. Выходит ошибка Unauthorized

  10. Заходим во вкладку Authorization

  11. Из Type выбираем Bearer Token

  12. Появляется инпут Token,туда вставим скопирванный токен

  13. Отправляем запрос

  14. Появляется список студентов

Планируемое время работы:
8 часов

Создать метод в контроллере GroupController для обновления записи группы

Конечный результат:
Что нужно сделать

План решения:
Как это сделать

Мотивация:
Зачем это нужно потребителю

Критерии приемки:
По каким критериям будет приниматься выполненная работа

Планируемое время работы:
1 час

Создать виртуальное поле "Статус оплаты" в модели Payment

Конечный результат:
В модели Payment появится виртуальное поле "Статус оплаты"

План решения:
Создать виртуальное поле "Статус оплаты" в модели Payment

Критерии приемки:
В модели Payment появится виртуальное поле "Статус оплаты"

Планируемое время работы:
3 часа

При get запросе по студентам получить поле stream.name для передачи на фронт

Конечный результат:
При get запросе по студентам получить поле stream.name для передачи и отображения на фронте

План решения:
В StudentsController доработать метод getAll для получения студентов вместе с полем stream.name

Мотивация:
Администратору необходимо видеть наименование направления вместо stream.id

Критерии приемки:
При запросе на фронте по списку студентов получить наименование направления

Планируемое время работы:
2 часа

Создать функционал автоматического удаления из группы ученика при изменении статуса на "Отчисленный"

Конечный результат:
При редактировании ученика, когда статус меняется на "Отчисленный", поле "Группа" станет пустой;

План решения:
В StudentController в метод updateOne добавить условие на проверку статуса студента. Если приходит статус "Отчисленный", то передавать значение groupId = null.

Мотивация:
Если ученик отчисляется, то группа обнуляется.

Критерии приемки:
При редактировании ученика, когда статус меняется на "Отчисленный", поле "Группа" станет пустой;

Планируемое время работы:
30 мин

Гайд для приложения

Конечный результат:
Гайд по запуску приложения, описание API

План решения:
Описать в readme.md

Мотивация:
Необходимо для использования другими разработчиками

Критерии приемки:
По каким критериям будет приниматься выполненная работа

Планируемое время работы:
1 час

Изучение Passport JS для будущей реализации авторизации.

Конечный результат:
Что нужно сделать

План решения:
Нужно изучить документацию http://www.passportjs.org/ и сопутствующие материалы (включая видео-уроки по теме) для использования в будущем в качестве основы функционала авторизации.

Мотивация:
Это нужно, в первую очередь, разработчику для осуществления одной из основополагающих функций проекта - авторизации пользователя.

Критерии приемки:
Полученные навыки будут задействованы в выполнении тикета по авторизации.

Планируемое время работы:
5 часов. Либо больше, либо меньше - в зависимости от скорости усвоения материала.

Добавить поле комментариев на сущность Оплат

Конечный результат:
Админ может добавлять комментарии касательно оплаты учеников

План решения:
Вызвать команды модернизации поля таблицы sequelize
На появившемся файле миграции, написать функцию добавления поля на таблицу

Мотивация:
Написать нюансы касательно оплат учеников

Критерии приемки:
При запросах можно выполнять CRUD операции на поле комментариев таблицы Оплат

Планируемое время работы:
1 час

Настроить eslint/prettier

Конечный результат:
Автоматическое форматирование, исправление стилистических ошибок

План решения:
Запустить npx eslint --init
выбрать настройки
установить зависимости

Мотивация:
Соблюдение единого стиля кода приложения

Критерии приемки:
По каким критериям будет приниматься выполненная работа

Планируемое время работы:
1 час

Создать StreamController, StreamRoutes

Конечный результат:
Создать StreamController, StreamRoutes

План решения:
Добавить метод getAll на получения списка по Направлению

Мотивация:
Отобразить список направлений на фронте

Критерии приемки:
Через postman отправить get запрос на /streams и получить список направлений

Планируемое время работы:
30 мин

Настройки eslint

Конечный результат:
файл с настройками eslint в проекте,
устранить ошибки eslint в проекте

План решения:
Изучить документацию https://eslint.org/

Мотивация:
Соблюдение единого стиля написания кода

Критерии приемки:
Наличие корректного файла .eslintrc

Планируемое время работы:
1 час

Связать Groups & Students

Конечный результат:

  • Связать Groups & Students.

План решения:

  • Изучить документацию по реализации связей в Sequalize https://sequelize.org/master/manual/assocs.html
  • Реализовать связь между Groups & Students OneToMany
  • Добавить migaration файл
  • Добавить seed файл

Мотивация:
Необходим функционал добавления групп для выбранных студентов, у которых не было группы.

Критерии приемки:
Связь между Студентами и Группами.
Есть migartin
Есть seed
Планируемое время работы:
3 часа

Создать сущность Групп с роутами

Конечный результат:
Создается сущность Group с наименованием в качестве главного свойства. К сущности создаются роуты с CRUD
Создать валидацию для указанной сущности

План решения:
По аналогии с сущностью учеников.
Установить программы postgresql, ORM sequelize, pgAdmin4

Мотивация:
Позволит осуществлять манипуляции с группами

Критерии приемки:
Бэк корректно реагирует на наличие новой сущности, а роуты выполняют свои функции.

Планируемое время работы:
4 часа

добавить в dev dependency sequilize CLI

Конечный результат:
Что нужно сделать

План решения:
Как это сделать

Мотивация:
Зачем это нужно потребителю

Критерии приемки:
По каким критериям будет приниматься выполненная работа

Планируемое время работы:
20мин

Связь между сущностями Учители и Предметы

Конечный результат:
Связаные сущности Учители и Предметы между собой

План решения:

  1. Добавление нужных полей для связи
  2. Связать через foreign keys

Мотивация:
Таблица учителей ссылается на таблицу предметов чтобы взять данных

Критерии приемки:
При JOIN полей имя, фамилия, название предмета таблиц Учители и Предметы в pgAdmin4 показывает общую таблицу, которая показывает какой учитель преподает по какому предмету

Планируемое время работы:
1 час

Создать сущность предметов

Конечный результат:
Получаем базу всех предметов

План решения:
Создать модель, миграцинный файл, сиды, роуты(для отображения и создания) для сущности Предметов

Мотивация:
Хранение всех данных касательно предметов на одной базе

Критерии приемки:
На постмоне работают запросы показа предметов и добавления их

Планируемое время работы:
1 час

Добавить include в PaymentController getById для фронта

Конечный результат:
Добавить include в PaymentController getById для фронта

План решения:
Добавить include в PaymentController getById

Мотивация:
Необходимо выводить имя, фамилия студента при оплате

Критерии приемки:
Добавить include в PaymentController getById для фронта

Планируемое время работы:
10 мин

Рефакторинг функции helper получения статус оплаты студентов

Описание
Рефакторинг кода

Наблюдаемое поведение:
Код нечитаемый

Ожидаемое поведение:
Легче читать код, у каждой функции один функционал

Причины:
В одной функции getPaymentStatus много функционала: прибавление + 1 месяц к дате, нахождение последний день следующего месяца, сравнение и возвращение стасус оплаты

Вариант решения:
Вывести в отдельные функции эти функционалы

Время: 30 минут

Создать роуты, контроллеры для добавления, редактирования, удаления записи по оплате

Конечный результат:
Готовый роут и контроллер для добавления, редактирования, удаления записи по оплате;

План решения:

  1. Создать котроллер с методами для добавления, редакирования и удаления записи;
  2. Создать роут;
  3. Добавить роут в server.js по эндпойнту "/payment";

Мотивация:
Созданные роут и контроллер обеспечут добавление, редактирование, удаление записи по оплате;

Критерии приемки:
Созданные роут и контроллер должны обеспечить добавление, редактирование, удаление записи по оплате;

Планируемое время работы:
3 часа

Создать сущность user для авторизации и поле id со связью c учителями

Конечный результат:
Создать сущность user для авторизации

План решения:
Создать модель, миграции, сиды через команды

Мотивация:
Авторизация пользователей

Критерии приемки:
Имеется связь между таблиц Users и Teachers

Планируемое время работы:
1 час

Детализация по оплатам определенного ученика

Конечный результат:
Получить все внесенные оплаты по определенному ученику

План решения:
Создать метод в PaymentController для извлечения всех оплат через findAll, используя query parameter studentId, отсортированный по последней даты оплаты.

Мотивация:
Возможность видеть детализацию оплат по студенту.

Критерии приемки:
При запросе получить все оплаты касательно этого ученика, отсортированную начиная с последней даты оплаты.

Планируемое время работы:
1 час

При добавлении существующей группы добавляется как новая группа

Описание бага
При добавлении существующей группы добавляется как новая группа,

Шаги воспроизведения:

  1. На странице Группы заполняем наименование совпадающее с существующей группой
  2. Нажимаем на добавить группу
  3. Создается новая группа с уже имеющимся наименованием

Наблюдаемое поведение:
Добавляется новая группа с уже имеющимся наименованием

Ожидаемое поведение:
Формируется ошибка

Причины:
Нет проверки, что группа с таким именем уже существуют

Вариант решения:
Добавить полю таблицы атрибут unique

30 минут

Реализовать rest api для студентов

Конечный результат:
API CRUD для студентов

План решения:
Реализовать обработку запросов

  • GET /students - получить список студентов.
  • POST /students - добавить студента
  • PUT /students - изменить данные студента

Мотивация:
Базовый функционал приложения

Критерии приемки:
Приложение обрабатывает запросы

  • GET /students - получить список студентов.
  • POST /students - добавить студента
  • PUT /students - изменить данные студента

Планируемое время работы:
1 час

Создать сущность учителей

Конечный результат:
Получаем базу всех учителей

План решения:
Создать модель(с полями фамилия, имя, предмет, язык преподавания, телефон, email) миграцинный файл, сиды, роуты(CRUD) для сущности Учителей

Мотивация:
Хранение всех данных касательно учителей на одной базе

Критерии приемки:
На постмоне все CRUD операции работают

Планируемое время работы:
1 час

Валидация для Lesson

Конечный результат:
Для сущности lesson нужна валидация времени: соответствие свободного временного промежутка преподавателя, группы и урока.

План решения:
Можно реализовать в качестве миддлвэра, который сравнивает временные промежутки преподавателей, групп и уроков и совмещается с пост-запросом на добавление предмета. Если промежутки преподавателя и группы не соответствуют условиям - добавление не осуществляется.

Мотивация:
Важная составляющая для составления расписания.

Критерии приемки:
Уроки создаются после успешной валидации.

Планируемое время работы:
1 ч.

Реализовать обработку ошибок

Конечный результат:
Все костомные ошибки стандартной структуры, для упрощения обработки на frontend

План решения:
https://dev.to/nedsoft/central-error-handling-in-express-3aej

Мотивация:
Зачем это нужно потребителю

Критерии приемки:
По каким критериям будет приниматься выполненная работа

Планируемое время работы:
1 час

API для выбора учителей по предметам

Конечный результат:
Создать в контроллере Teacher функцию получения учителей по предметам - getBySubject (к примеру), которая выдаст список учителей, закрепленных за искомым предметом.

План решения:
В TeacherController задействовать гет-запрос, включающий фильтрацию списка учителей через передачу subjectId.

Мотивация:
Одна из ключевых функций для расписания.

Критерии приемки:
При запросе и передаче id предмета, функция возвращает список найденных преподавателей.

Планируемое время работы:
1 час

Рефакторинг получения уроков по группам

Конечный результат:
Запрос на получение уроков на основании id группы должен функционировать после переноса ряда функций.

План решения:
Функция получения уроков по группе должна быть отрефакторена и перенесена в контроллер Групп.

Мотивация:
Другая важная функция для работы с расписанием

Критерии приемки:
При соответствующем запросе с фильтрующим параметром возвращает список уроков, закрепленных за группой.
Пример запроса
http://localhost:8080/groups/1/lessons?startTime=2021-01-31&endTime=2021-02-02
Планируемое время работы:
30 мин

Реализовать API добавления студентов в группу

Конечный результат:
ENDPOINT PUT /group/{$groupId}/add-students

План решения:

  • Добавить новый контроллер, роутер для изменения students по полю "Группа".
  • Почитать документацию https://sequelize.org/master/manual/transactions.html
  • Добавить transaction тип для изменения списка студентов по группе.
  • Протестировать endpoint
    Мотивация:
    Необходим функционал добавления групп для выбранных студентов, у которых не было группы.

Критерии приемки:
Добавление группы для выбранных студентов, у которых не было группы.

Планируемое время работы:
3 часа

Добавить валидацию запросов в приложение

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

План решения:
Как это сделать

Мотивация:
Для обработки ошибок на frontend`е

Критерии приемки:

Планируемое время работы:

Запрос уроков по учителю

Конечный результат:
Запрос на получение уроков на основании id учителя.

План решения:
Гет запрос и функция в контроллере учителей, где в качестве параметра фильтрации уроков будет использован teacherId.

Мотивация:
Другая важная функция для работы с расписанием

Критерии приемки:
При соответствующем запросе с фильтрующим параметром возвращает список уроков, закрепленных за учителем.
Пример запроса
/teachers/1/lessons?startTime=2021-01-31T09:30:00.000Z&endTime=2021-01-31T10:00:00.000Z
Планируемое время работы:
1 час

В БД добавить сущность для хранения оплаты

Конечный результат:
В БД добавить сущность для хранения оплаты

План решения:

  1. Создать файл миграции для создания модели для оплаты. Поля: id(integer), sudentId(int), payment(int), date(date);
  2. Создать seed файл для заполнения данными таблицы для оплаты;

Критерии приемки:
Должен быть файлы миграции, файл seed. Создание и откаты по файлам миграции и seed должны проходить без ошибок.

Планируемое время работы:
3 часа

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.