Виконайте форк цього репозиторію для виконання домашніх завдань (2-6) Форк створить репозиторій на вашому http://github.com
Додайте ментора до колаборації
Для кожної домашньої роботи створюйте свою гілку.
- hw02
- hw03
- hw04
- hw05
- hw06
Кожна нова гілка для др повинна робитися з master
Після того, як ви закінчили виконувати домашнє завдання у своїй гілці, необхідно зробити пулл-реквест (PR). Потім додати ментора для рев'ю коду. Тільки після того, як ментор заапрувить PR, ви можете виконати мердж гілки з домашнім завданням у майстер.
Уважно читайте коментарі ментора. Виправте зауваження та зробіть коміт у гілці з домашнім завданням. Зміни підтягнуться у PR автоматично після того, як ви відправите коміт з виправленнями на github Після виправлення знову додайте ментора на рев'ю коду.
- При здачі домашньої роботи є посилання на PR
- JS-код чистий та зрозумілий, для форматування використовується Prettier
npm start
— старт сервера в режимі productionnpm run start:dev
— старт сервера в режимі розробки (development)npm run lint
— запустити виконання перевірки коду з eslint, необхідно виконувати перед кожним PR та виправляти всі помилки лінтераnpm lint:fix
— та ж перевірка лінтера, але з автоматичними виправленнями простих помилок
- Створено репозиторій з домашнім завданням — REST API додаток
- При створенні репозиторія використаний бойлерплейт
- Пулл-реквест (PR) з відповідним дз відправлений менторові на перевірку (посилання на PR)
- Код відповідає технічному завданню проекта
- При виконанні коду не виникає необроблених помилок
- Назва змінних, властивостей і методів починається з малої літери і записуються в нотації CamelCase. Використовуються англійські іменники
- Назва функції або методу містить дієслово
- У коді немає закоментуваних ділянок коду
- Проект коректно працює з актуальною LTS-версією Node
Подивися пояснююче відео як це зробити та здавати ДЗ правильно:
Написати REST API для роботи з колекцією контактів. Для роботи з REST API використовуй [Postman] (https://www.getpostman.com/).
Прочитай уважно readme в клонованому темплейті, там описаний механізм здачі домашніх завдань. Та починай виконувати ДЗ
Створи гілку hw02-express
з гілки master.
Встанови модулі командою
npm i
Такі модулі є в проекті:
У app.js
– веб сервер на express
і прошарки morgan
та cors
. Почни
налаштовувати раутінг для роботи з колекцією контактів.
REST API повинен підтримувати такі раути.
- нічого не отримує
- викликає функцію
listContacts
для роботи з json-файломcontacts.json
- повертає масив всіх контактів в json-форматі зі статусом
200
- Не отримує
body
- Отримує параметр
id
- викликає функцію
getById
для роботи з json-файломcontacts.json
- якщо такий
id
є, повертає об'єкт контакту в json-форматі зі статусом200
- якщо такого
id
немає, повертає json з ключем"message": "Not found"
і статусом404
- Отримує
body
в форматі{name, email, phone}
(усі поля обов'язкові) - Якщо в
body
немає якихось обов'язкових полів, повертає json з ключем{"message": "missing required name field"}
і статусом400
- Якщо з
body
все добре, додає унікальний ідентифікатор в об'єкт контакту - Викликає функцію
addContact(body)
для збереження контакту в файліcontacts.json
- За результатом роботи функції повертає об'єкт з доданим
id
{id, name, email, phone}
і статусом201
- Не отримує
body
- Отримує параметр
id
- Викликає функцію
removeContact
для роботи з json-файломcontacts.json
- якщо такий
id
є, повертає json формату{"message": "contact deleted"}
і статусом200
- якщо такого
id
немає, повертає json з ключем"message": "Not found"
і статусом404
- Отримує параметр
id
- Отримує
body
в json-форматі з оновленням будь-яких полівname, email и phone
- Якщо
body
немає, повертає json з ключем{"message": "missing fields"}
і статусом400
- Якщо з
body
все добре, викликає функціюupdateContact(contactId, body)
. (Напиши її) для поновлення контакту в файліcontacts.json
- За результатом роботи функції повертає оновлений об'єкт контакту і статусом
200
. В іншому випадку, повертає json з ключем"message": "Not found"
і статусом404
Для маршрутів, що приймають дані (POST
та PUT
), продумайте перевірку
(валідацію) отриманих даних. Для валідації прийнятих даних використовуйте пакет
joi
Створи гілку 04-auth
з гілки master
.
Продовж створення REST API для роботи з колекцією контактів. Додай логіку аутентифікації/авторизації користувача через JWT.
У коді створи схему і модель користувача для колекції users
.
{
password: {
type: String,
required: [true, 'Set password for user'],
},
email: {
type: String,
required: [true, 'Email is required'],
unique: true,
},
subscription: {
type: String,
enum: ["starter", "pro", "business"],
default: "starter"
},
token: String
}
Змініть схему контактів, щоб кожен користувач бачив тільки свої контакти. Для цього в схемі контактів додайте властивість
owner: {
type: Schema.Types.ObjectId,
ref: 'user',
}
Примітка: 'user'
- назва колекції, у якій зберігаються користувачі
Створити ендпоінт /users/register
Зробити валідацію всіх обов'язкових полів (email і password). При помилці валідації повернути Помилку валідації.
У разі успішної валідації в моделі User
створити користувача за даними, які
пройшли валідацію. Для засолювання паролів використовуй
bcrypt або
bcryptjs
- Якщо пошта вже використовується кимось іншим, повернути Помилку Conflict.
- В іншому випадку повернути Успішна відповідь.
POST /users/register
Content-Type: application/json
RequestBody: {
"email": "example@example.com",
"password": "examplepassword"
}
Status: 400 Bad Request
Content-Type: application/json
ResponseBody: <Помилка від Joi або іншої бібліотеки валідації>
Status: 409 Conflict
Content-Type: application/json
ResponseBody: {
"message": "Email in use"
}
Status: 201 Created
Content-Type: application/json
ResponseBody: {
"user": {
"email": "example@example.com",
"subscription": "starter"
}
}
Створити ендпоінт /users/login
В моделі User
знайти користувача за email
.
Зробити валідацію всіх обов'язкових полів (email і password). При помилці валідації повернути Помилку валідації.
- В іншому випадку, порівняти пароль для знайденого користувача, якщо паролі збігаються створити токен, зберегти в поточному юзера і повернути Успішна відповідь.
- Якщо пароль або імейл невірний, повернути Помилку Unauthorized.
GET /users/login
Content-Type: application/json
RequestBody: {
"email": "example@example.com",
"password": "examplepassword"
}
Status: 400 Bad Request
Content-Type: application/json
ResponseBody: <Помилка від Joi або іншої бібліотеки валідації>
Status: 200 OK
Content-Type: application/json
ResponseBody: {
"token": "exampletoken",
"user": {
"email": "example@example.com",
"subscription": "starter"
}
}
Status: 401 Unauthorized
ResponseBody: {
"message": "Email or password is wrong"
}
Створи мідлвар для перевірки токена і додай його до всіх раутів, які повинні бути захищені.
- Мідлвар бере токен з заголовків
Authorization
, перевіряє токен на валідність. - У випадку помилки повернути Помилку Unauthorized.
- Якщо валідація пройшла успішно, отримати з токена
id
користувача. Знайти користувача в базі даних з цимid
. - Якщо користувач існує і токен збігається з тим, що знаходиться в базі,
записати його дані в
req.user
і викликатиnext()
. - Якщо користувача з таким
id
НЕ існує або токени не збігаються, повернути Помилку Unauthorized
Status: 401 Unauthorized
Content-Type: application/json
ResponseBody: {
"message": "Not authorized"
}
Створити ендпоінт /users/logout
Додай в маршрут мідлвар перевірки токена.
- У моделі
User
знайти користувача за_id
. - Якщо користувача не існує повернути Помилку Unauthorized.
- В іншому випадку, видалити токен у поточного юзера і повернути Успішна відповідь.
POST /users/logout
Authorization: "Bearer {{token}}"
Status: 401 Unauthorized
Content-Type: application/json
ResponseBody: {
"message": "Not authorized"
}
Status: 204 No Content
Створити ендпоінт /users/current
Додай в раут мідлвар перевірки токена.
- Якщо користувача не існує повернути Помилку Unauthorized
- В іншому випадку повернути Успішну відповідь
GET /users/current
Authorization: "Bearer {{token}}"
Status: 401 Unauthorized
Content-Type: application/json
ResponseBody: {
"message": "Not authorized"
}
Status: 200 OK
Content-Type: application/json
ResponseBody: {
"email": "example@example.com",
"subscription": "starter"
}
- Зробити пагінацію для колекції контактів (GET /contacts?page=1&limit=20).
- Зробити фільтрацію контактів по полю обраного (GET /contacts?favorite=true)
- Оновлення підписки (
subscription
) користувача через ендпоінтPATCH
/users
. Підписка повинна мати одне з наступних значень['starter', 'pro', 'business']