-
Створіть новий командний репозиторій на основі цього шаблонного репозиторію. Створений вами репозиторій ви будете використовувати на всіх подальших заняттях.
-
Додайте до нього в колаборатори всіх студентів вашої групи.
-
Налаштуйте захист на гілку
main
:- Увімкніть опцію "Require a pull request before merging";
- Увімкніть опцію "Automatically delete head branches".
-
Склонуйте репозиторій на локальний комп'ютер.
-
Налаштуйте скрипти для dev та production режиму
-
Протестуйте запуск серверу
-
Створіть middleware для обробки помилок:
- Створіть файл
src/middlewares/errorHandler.js
; - Застосуйте middleware
errorHandler
у файліsrc/server.js
; - Middleware
errorHandler
призначений для обробки помилок у вашому Express-сервері та має приймати чотири аргументи; - У разі виявлення помилки
errorHandler
має відправити клієнту відповідь зі статусом500
та об’єкт з наступними властивостями:
- Створіть файл
{
status: 500,
message: "Something went wrong",
}
- Створіть і застосуйте у файлі
src/server.js
middlewarenotFoundHandler
, призначений для обробки запитів, коли клієнт звертається до неіснуючого маршруту.notFoundHandler
у разі виявлення помилки має відправити клієнту відповідь зі статусом 404 та об’єкт з наступними властивостями:
{
message: "Route not found"
}
- Створіть і застосуйте у файлі
src/routers/products.js
функціюctrlWrapper
, яка діятиме як обгортка для контролерів у вашому Express-додатку, для автоматичної обробки помилок, що можуть виникнути під час виконання запитів. В цій обгортці при виникненні помилки викличте next(err) для залучення middlewareerrorHandler
.
- Створіть свій кластер в mongodb для колекції продуктів (
products
) та запишіть усі необхідні дані для його підключення у змінні оточення. Назви змінних візьми з файлуenv.example
. - В папці
src/db
створіть модель продуктуProduct
, що буде включати в себе такі поля:
- name - string, required
- price - number, required
- category - string, enum('books', 'electronics', 'clothing', 'other'), required, default 'other'
- description - string, optional
- createdAt - дата створення
- updatedAt - дата оновлення
Для останніх двох полів достатньо використати параметр timestamps: true
при створенні моделі.
Імпортуйте базовий набір продуктів із файлу src/db/products.json
до вашої бази, користуючись будь-яким UI інтерфейсом (в браузері, Mongo Compass тощо). Переконайтеся, що назва колекції в коді моделі та в візуальному інтерфейсі співпадають.
Створіть роут GET /products
для отримання масиву усіх продуктів.
Обробка цього роута має включати:
- Реєстрацію роута в файлі
src/routers/products.js
- Опис контролера для цього роута в файлі
src/controllers/products.js
- Створення сервісу в файлі
src/services/products.js
- Відповідь сервера має містити об’єкт з наступними властивостями:
{ status: 200, message: "Successfully found products!", data: <масив продуктів> }
Створіть роут GET /products/productId
для отримання даних одного продукта по його ідентифікатору.
Обробка цього роута має включати:
- Реєстрацію роута в файлі
src/routers/products.js
- Опис контролера для цього роута в файлі
src/controllers/products.js
- Створення сервісу в файлі
src/services/products.js
- Якщо за переданим ідентифікатором продукт було знайдено, то відповідь сервера має містити об’єкт з наступними властивостями:
{
status: 200,
message: "Successfully found product with id {productId}!",
data: <об'єкт продукта>
}
- Додайте перевірку чи продукт за переданим ідентифікатором було знайдено. Якщо продукт не було знайдено, то за допомогою http-errors створіть помилку зі статусом 404 і повідомленням "Product not found".
http-errors(404, "Product not found")
Створіть роут POST /products
для створення нового продукту. Тіло запиту має в себе включати наступні властивості:
- name - обов’язково;
- price - обов’язково;
- category - обов’язково;
- description - не обов’язково;
Обробка цього роута має включати:
- Реєстрацію роута в файлі
src/routers/products.js
- Опис контролера для цього роута в файлі
src/controllers/products.js
- Створення сервісу в файлі
src/services/products.js
- При вдалому запиті відповідь сервера має містити об’єкт з наступними властивостями:
{
status: 201,
message: "Successfully created a product!",
data: <об'єкт створеного продукта>
}
Створіть роут PATCH /products/productId
для оновлення даних одного продукта по його ідентифікатору. Тіло запиту має в себе включати наступні властивості:
- name - не обов’язково;
- price - не обов’язково;
- category - не обов’язково;
- description - не обов’язково;
Обробка цього роута має включати:
- Реєстрацію роута в файлі
src/routers/products.js
- Опис контролера для цього роута в файлі
src/controllers/products.js
- Створення сервісу в файлі
src/services/products.js
- Якщо за переданим ідентифікатором продукт було знайдено, то відповідь сервера має містити об’єкт з наступними властивостями:
{
status: 200,
message: "Successfully patched a product!",
data: <оновлений об'єкт продукта>
}
- Додайте перевірку чи продукт за переданим ідентифікатором було знайдено. Якщо продукт не було знайдено, то за допомогою http-errors створіть помилку зі статусом 404 і повідомленням "Product not found".
http-errors(404, "Product not found")
Створіть роут DELETE /products/productId
для видалення одного продукта по його ідентифікатору.
Обробка цього роута має включати:
-
Реєстрацію роута в файлі
src/routers/products.js
-
Опис контролера для цього роута в файлі
src/controllers/products.js
-
Створення сервісу в файлі
src/services/products.js
-
Відповідь сервера, в разі успішного видалення продукту, має бути зі статусом 204 без тіла відповіді
-
Додайте перевірку чи продукт за переданим ідентифікатором було знайдено. Якщо продукт не було знайдено, то за допомогою http-errors створіть помилку зі статусом 404 і повідомленням "Product not found".
http-errors(404, "Product not found")