TASK 1

  1. Створіть новий командний репозиторій на основі цього шаблонного репозиторію. Створений вами репозиторій ви будете використовувати на всіх подальших заняттях.

  2. Додайте до нього в колаборатори всіх студентів вашої групи.

  3. Налаштуйте захист на гілку main:

    • Увімкніть опцію "Require a pull request before merging";
    • Увімкніть опцію "Automatically delete head branches".
  4. Склонуйте репозиторій на локальний комп'ютер.

  5. Налаштуйте скрипти для dev та production режиму

  6. Протестуйте запуск серверу

  7. Створіть middleware для обробки помилок:

    • Створіть файл src/middlewares/errorHandler.js;
    • Застосуйте middleware errorHandler у файлі src/server.js;
    • Middleware errorHandler призначений для обробки помилок у вашому Express-сервері та має приймати чотири аргументи;
    • У разі виявлення помилки errorHandler має відправити клієнту відповідь зі статусом 500 та об’єкт з наступними властивостями:
    {
        status: 500,
        message: "Something went wrong",
    }
  1. Створіть і застосуйте у файлі src/server.js middleware notFoundHandler, призначений для обробки запитів, коли клієнт звертається до неіснуючого маршруту. notFoundHandler у разі виявлення помилки має відправити клієнту відповідь зі статусом 404 та об’єкт з наступними властивостями:
    {
        message: "Route not found"
    }
  1. Створіть і застосуйте у файлі src/routers/products.js функцію ctrlWrapper, яка діятиме як обгортка для контролерів у вашому Express-додатку, для автоматичної обробки помилок, що можуть виникнути під час виконання запитів. В цій обгортці при виникненні помилки викличте next(err) для залучення middleware errorHandler.

TASK 2

  1. Створіть свій кластер в mongodb для колекції продуктів (products) та запишіть усі необхідні дані для його підключення у змінні оточення. Назви змінних візьми з файлу env.example.
  2. В папці 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 тощо). Переконайтеся, що назва колекції в коді моделі та в візуальному інтерфейсі співпадають.

TASK 3

Створіть роут GET /products для отримання масиву усіх продуктів.

Обробка цього роута має включати:

  • Реєстрацію роута в файлі src/routers/products.js
  • Опис контролера для цього роута в файлі src/controllers/products.js
  • Створення сервісу в файлі src/services/products.js
  • Відповідь сервера має містити об’єкт з наступними властивостями:
        {
            status: 200,
            message: "Successfully found products!",
            data: <масив продуктів>
        }
    

TASK 4

Створіть роут 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")

TASK 5* (додаткове завдання)

Створіть роут 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: <об'єкт створеного продукта>
   }

TASK 6* (додаткове завдання)

Створіть роут 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")

TASK 7* (додаткове завдання)

Створіть роут 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")