{"id":24415247,"url":"https://github.com/yevhenii2022/node-js-hw-rest-api","last_synced_at":"2026-04-09T17:03:45.139Z","repository":{"id":183875575,"uuid":"670899739","full_name":"Yevhenii2022/node-js-hw-rest-api","owner":"Yevhenii2022","description":"Побудова REST API","archived":false,"fork":false,"pushed_at":"2023-08-19T06:20:56.000Z","size":803,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-20T07:47:50.015Z","etag":null,"topics":["bcrypt","cors","cross-env","dotenv","express","gravatar","jest","jimp","joi-validation","jsonwebtoken","mongodb-atlas","mongodb-compass","mongoose","morgan","multer","node-js","nodemailer","nodemon","postman","supertest"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Yevhenii2022.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-07-26T05:08:57.000Z","updated_at":"2023-08-10T09:04:19.000Z","dependencies_parsed_at":null,"dependency_job_id":"a33ed70a-17fa-4754-835a-528a9471e9c5","html_url":"https://github.com/Yevhenii2022/node-js-hw-rest-api","commit_stats":null,"previous_names":["yevhenii2022/node-js-hw-rest-api"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yevhenii2022%2Fnode-js-hw-rest-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yevhenii2022%2Fnode-js-hw-rest-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yevhenii2022%2Fnode-js-hw-rest-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yevhenii2022%2Fnode-js-hw-rest-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Yevhenii2022","download_url":"https://codeload.github.com/Yevhenii2022/node-js-hw-rest-api/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243401492,"owners_count":20285052,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bcrypt","cors","cross-env","dotenv","express","gravatar","jest","jimp","joi-validation","jsonwebtoken","mongodb-atlas","mongodb-compass","mongoose","morgan","multer","node-js","nodemailer","nodemon","postman","supertest"],"created_at":"2025-01-20T07:47:59.294Z","updated_at":"2025-12-30T19:42:23.879Z","avatar_url":"https://github.com/Yevhenii2022.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Postman\n\nЩоб перевірити роботу REST API пиши так:\n\n## Базові ендпоінти\n\n### GET http://localhost:3000/api/contacts\n\n`Відповідь` \u0026mdash; повертається масив всіх контактів в json-форматі зі статусом 200\n\n### GET http://localhost:3000/api/contacts/:id\n\n`Відповідь` \u0026mdash; якщо такий id є, повертається об'єкт контакту в json-форматі зі статусом 200; якщо такого id немає, повертається json з ключем \"message\": \"not found\" і статусом 404\n\n### POST http://localhost:3000/api/contacts\n\nОтримує body в форматі {name, email, phone} (усі поля обов'язкові та мають бути стрінгами) \u003cbr\u003e `Відповідь` \u0026mdash; якщо в body немає якихось обов'язкових полів або вони не строки, повертається json з ключем {\"message\": \"missing required field(s) / non-string field(s)\"} і статусом 400; якщо з body все добре, додає унікальний ідентифікатор в об'єкт контакту i повертається об'єкт з доданим id {id, name, email, phone} і статусом 201\n\n### DELETE http://localhost:3000/api/contacts/:id\n\n`Відповідь` \u0026mdash; якщо такий id є, повертається json формату {\"message\": \"contact deleted\"} і статусом 200; якщо такого id немає, повертається json з ключем \"message\": \"not found\" і статусом 404\n\n### PUT http://localhost:3000/api/contacts/:id\n\nОтримує body в json-форматі c оновленням будь-яких полів name, email и phone (валідадія присутня як у додавані контакту)\u003cbr\u003e `Відповідь` \u0026mdash; якщо з body всe добре - повертається оновлений об'єкт контакту зі статусом 200, інакше повертається json з ключем \"message\": \"not found\" і статусом 404\n\n### PATCH http://localhost:3000/api/contacts/:id/favorite\n\nОтримує body в json-форматі з оновленням поля favorite (має бути значення boolean)\u003cbr\u003e `Відповідь` \u0026mdash; якщо в body немає якихось обов'язкових полів або вони не строки, повертається json з ключем {\"message\":\"missing field favorite\"} і статусом 400; якщо з body всe добре - повертається оновлений об'єкт контакту зі статусом 200, інакше повертається json з ключем \"message\": \"not found\" і статусом 404\n\n## Аутентифікація\n\n### POST http://localhost:3000/api/auth/register\n\nОтримує body в форматі {email, password, subscription} (перші два поля обов'язкові, всі поля мають бути стрінгами, валідація присутня) \u003cbr\u003e `Відповідь` \u0026mdash; при помилці валідації повертається \"Помилка від Joi або іншої бібліотеки валідації\" зі статусом 400; якщо пошта вже використовується кимось іншим повертається ResponseBody: {\"message\": \"Email in use\"} зі статусом 409; якщо з body все добре повертається об'єкт наступного виду { \"user\": { \"email\": \"example@example.com\", \"subscription\": \"starter\" } } і статусом 201 (поле subscription додається по замовчуванню, якщо його не вказати при реєстрації через налаштування моделі \"user\" - subscription: { type: String, enum: [\"starter\", \"pro\", \"business\"], default: \"starter\" })\n\n### POST http://localhost:3000/api/auth/login\n\nОтримує body в форматі {email, password} (всі поля обов'язкові та мають бути стрінгами, валідація присутня) \u003cbr\u003e `Відповідь` \u0026mdash; при помилці валідації повертається \"Помилка від Joi або іншої бібліотеки валідації\" зі статусом 400; якщо пароль або email невірний повертається ResponseBody: {\"message\": \"Email or password is wrong\"} зі статусом 401; якщо з body все добре шукається пароль для користувача в БД, якщо пароль знаходиться створюється токен, зберігається в поточному полі юзера і повертається об'єкт наступного виду ResponseBody: { \"token\": \"exampletoken\", \"user\": { \"email\": \"example@example.com\", \"subscription\": \"starter\" } } і статусом 200\n\n### POST http://localhost:3000/api/auth/logout\n\nОтримує пусте body з обовʼязковим заголовком Authorization: \"Bearer {{token}}\" \u003cbr\u003e `Відповідь` \u0026mdash; якщо користувача у моделі \"user\" за \\_id не існує повертається ResponseBody: {\"message\": \"Not authorized\"} і статус 401; в іншому випадку, видаляється токен у поточного юзера і повертається статус 204\n\n### GET http://localhost:3000/api/auth/current\n\nЗапит відправляється з обовʼязковим заголовком Authorization: \"Bearer {{token}}\" \u003cbr\u003e `Відповідь` \u0026mdash; якщо користувача не існує повертається ResponseBody: {\"message\": \"Not authorized\"} і статус 401; в іншому випадку повертається ResponseBody: { \"email\": \"example@example.com\", \"subscription\": \"starter\" } і статус 200\n\n### Команди:\n\n- `npm start` \u0026mdash; старт сервера в режимі production\n- `npm run start:dev` \u0026mdash; старт сервера в режимі розробки (development)\n- `npm run lint` \u0026mdash; запустити виконання перевірки коду з eslint, необхідно виконувати перед кожним PR та виправляти всі помилки лінтера\n- `npm run lint:fix` \u0026mdash; та ж перевірка лінтера, але з автоматичними виправленнями простих помилок\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyevhenii2022%2Fnode-js-hw-rest-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyevhenii2022%2Fnode-js-hw-rest-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyevhenii2022%2Fnode-js-hw-rest-api/lists"}