{"id":24984309,"url":"https://github.com/jacks1o/delivery-challenge","last_synced_at":"2026-04-01T18:30:09.786Z","repository":{"id":142356575,"uuid":"611865971","full_name":"JackS1o/Delivery-Challenge","owner":"JackS1o","description":null,"archived":false,"fork":false,"pushed_at":"2023-03-21T11:20:46.000Z","size":193,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-03-28T00:11:55.584Z","etag":null,"topics":["docker","dotenv","express","express-async-errors","jest","joi","jwt","mongodb","mongoose","node"],"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/JackS1o.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,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-09T17:48:01.000Z","updated_at":"2023-03-13T07:16:18.000Z","dependencies_parsed_at":null,"dependency_job_id":"873a88c8-dc57-43f9-8086-d2dfa89e180d","html_url":"https://github.com/JackS1o/Delivery-Challenge","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/JackS1o/Delivery-Challenge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackS1o%2FDelivery-Challenge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackS1o%2FDelivery-Challenge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackS1o%2FDelivery-Challenge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackS1o%2FDelivery-Challenge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JackS1o","download_url":"https://codeload.github.com/JackS1o/Delivery-Challenge/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackS1o%2FDelivery-Challenge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31290858,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["docker","dotenv","express","express-async-errors","jest","joi","jwt","mongodb","mongoose","node"],"created_at":"2025-02-04T09:48:05.650Z","updated_at":"2026-04-01T18:30:09.760Z","avatar_url":"https://github.com/JackS1o.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Boas-vindas ao repositório do projeto ENAFOOD!\n\n## O que foi desenvolvido\n\nNeste projeto, foi desenvolvido uma API para um sistema de delivery de comida. O sistema possui um banco de dados com informações de produtos e usuários, e permite que usuários façam pedidos de produtos cadastrados no banco de dados.\n\nA API permite obter produtos disponíveis para compra e manipular a sacola do usuário, incluindo a inserção, escolha de quantidades e remoção de itens. Para a Fase 1, onde o EnaFood possuía cerca de 100 usuários, cada um fazendo em média 5 pedidos por mês, a API foi desenvolvida com a capacidade de gerenciar pedidos com 1 a 5 produtos.\n\nNa Fase 2, que contava com cerca de 10.000 usuários e uma média de 10 pedidos por mês, a API foi atualizada para lidar com pedidos que continham de 1 a 15 produtos. Na Fase 3, que contava com cerca de 1.000.000 de usuários e uma média de 25 pedidos por mês, a API foi novamente atualizada para lidar com pedidos que continham de 1 a 20 produtos.\n\nPor fim, na Fase 4, onde o EnaFood havia se tornado a principal rede de delivery do Brasil, com cerca de 50.000.000 de usuários, a API passou por uma última atualização para lidar com pedidos que também eram feitos por empresas, com um grande volume de produtos e preços mais em conta.\n\n\n\u003cdetails\u003e\n  \u003csummary\u003e\n    \u003cstrong\u003eComo executar o projeto\u003c/strong\u003e\n  \u003c/summary\u003e\u003cbr\u003e\n\n  1. Clone o repositório \n    `git clone git@github.com:JackS1o/Delivery-Challenge.git`\n  \n  2. Na raíz do projeto, execute o comando `docker-compose up -d` para subir o container da aplicação e do banco de dados. O servidor estará disponível na porta `3001`.\n\n  3. Na raíz do projeto, execute o comando `npm run products:import` para popular o banco de dados com os produtos.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\n    \u003cstrong\u003eRotas desenvolvidas\u003c/strong\u003e\n  \u003c/summary\u003e\u003cbr\u003e\n\n  - `POST /register` - Cria um novo usuário. O corpo da requisição deve conter o `email` e `password` desejados. Exemplo de corpo de requisição:\n  ```json\n  {\n    \"email\": \"jack@gmail.com\",\n    \"password\": \"123456\",\n  }\n  ```\n  a resposta será um objeto com o um `token` de autenticação no seguinte formato:\n  ```json\n  {\n    \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImphQGdtYWlsLmNvbSIsImlhdCI6MTY3ODY2NTU3NiwiZXhwIjoxNjc4NjY5MTc2fQ.svDiQTwItv4FG9_0OZNrxmKWb0EWRPsk8LFbYAtUIAc\"\n  }\n  ```\n\n  - `POST /login` - Realiza o login de um usuário. O corpo da requisição deve conter o `email` e `password` que existam no banco de dados. O retorno dessa requisição tabém gera um `token`. Exemplo de corpo de requisição:\n  ```json\n  {\n    \"email\": \"jack@gmail.com\",\n    \"password\": \"123456\",\n  }\n  ```\n\n  - `GET /products` - Retorna todos os produtos cadastrados no banco de dados. Exemplo de resposta:\n  ```json\n  [\n    {\n      \"_id\": \"640ebdb605aaccc707ab1507\",\n      \"name\": \"Coca-Cola\",\n      \"price\": 5,\n      \"description\": \"Coca-Cola is a carbonated soft drink manufactured by The Coca-Cola Company.\"\n    },\n    {\n      \"_id\": \"640ebdb605aaccc707ab1508\",\n      \"name\": \"Pepsi\",\n      \"price\": 5,\n      \"description\": \"Pepsi is a carbonated soft drink manufactured by PepsiCo.\"\n    }\n  ]\n  ```\n\n  - `GET /orders` - Retorna todas as ordens de compra cadastradas no banco de dados. Exemplo de resposta:\n  ```json\n  [\n    {\n      \"_id\": \"640ebdb605aaccc707ab1507\",\n      \"user\": \"jack@gmail.com\",\n      \"paymentMethod\": \"cartão\",\n      \"address\": \"Rua São Miguel\",\n      \"order\": [\n        {\n          \"_id\": \"640ebdb605aaccc707ab1507\",\n          \"name\": \"Coca-Cola\",\n          \"price\": 5,\n          \"description\": \"Coca-Cola is a carbonated soft drink manufactured by The Coca-Cola Company.\",\n          \"quantity\": 2\n        },\n        {\n          \"_id\": \"640ebdb605aaccc707ab1508\",\n          \"name\": \"Pepsi\",\n          \"price\": 5,\n          \"description\": \"Pepsi is a carbonated soft drink manufactured by PepsiCo.\",\n          \"quantity\": 2\n        }\n      ]\n    }\n  ]\n  ```\n\n  - `GET /user/orders` - Retorna todas as ordens de compra de um usuário específico. Exemplo de resposta:\n  ```json\n  {\n    \"_id\": \"640ebdb605aaccc707ab1507\",\n    \"user\": \"jack@gmail.com\",\n    \"paymentMethod\": \"cartão\",\n    \"address\": \"Rua São Miguel\",\n    \"order\": [\n      {\n        \"_id\": \"640ebdb605aaccc707ab1507\",\n        \"name\": \"Coca-Cola\",\n        \"price\": 5,\n        \"description\": \"Coca-Cola is a carbonated soft drink manufactured by The Coca-Cola Company.\",\n        \"quantity\": 2\n      }\n    ]\n  }\n  ```\n\n  - `GET /order/:id` - Retorna uma ordem de compra específica. Exemplo de resposta:\n  ```json\n  {\n    \"_id\": \"640ebdb605aaccc707ab1507\",\n    \"user\": \"jack@gmail.com\",\n    \"paymentMethod\": \"cartão\",\n    \"address\": \"Rua São Miguel\",\n    \"order\": [\n      {\n        \"_id\": \"640ebdb605aaccc707ab1507\",\n        \"name\": \"Coca-Cola\",\n        \"price\": 5,\n        \"description\": \"Coca-Cola is a carbonated soft drink manufactured by The Coca-Cola Company.\",\n        \"quantity\": 2\n      }\n    ]\n  }\n  ```\n\n  - `DELETE /order/:id` - Deleta uma ordem de compra específica. Exemplo de resposta:\n  ```json\n  {\n    \"message\": \"Sale deleted successfully!\",\n    \"order\": {\n      \"_id\": \"640e204bff9bfc2adbe8933f\",\n      \"user\": \"jack@gmail.com\",\n      \"paymentMethod\": \"cartão\",\n      \"address\": \"Rua São Miguel\",\n      \"order\": [\n        {\n          \"_id\": \"640ebdb605aaccc707ab1507\",\n          \"name\": \"Coca-Cola\",\n          \"price\": 5,\n          \"description\": \"Coca-Cola is a carbonated soft drink manufactured by The Coca-Cola Company.\",\n          \"quantity\": 2\n        }\n      ]\n    }\n  }\n  ```\n\n  - `POST /mvp/order` - é possível criar uma nova ordem de compra, porém, nessa rota, o usuário consegue criar uma ordem com no `máximo 5 produtos`.\n  - `POST /earlyadopters/order` - é possível criar uma nova ordem de compra, porém, nessa rota, o usuário consegue criar uma ordem com no `máximo 15 produtos`.\n  - `POST /earlymajority/order` - é possível criar uma nova ordem de compra, porém, nessa rota, o usuário consegue criar uma ordem com no `máximo 20 produtos`.\n  - `POST /latemajority/order` - é possível criar uma nova ordem de compra sem limite de produtos.\n  - Todas as rotas de criação de ordem de compra recebem o seguinte corpo de requisição:\n\n  ```json\n  {\n    \"paymentMethod\": \"cartão\",\n    \"address\": \"Rua São Miguel\",\n      \"order\": [\n      {\n        \"_id\": \"640ebdb605aaccc707ab1507\",\n        \"name\": \"Coca-Cola\",\n        \"price\": 5,\n        \"description\": \"Coca-Cola is a carbonated soft drink manufactured by The Coca-Cola Company.\",\n        \"quantity\": 2\n      }\n    ]\n  }\n  ```\n\n  - As rotas `PATCH /mvp/order/:id`, `PATCH /earlyadopters/order/:id`, `PATCH /earlymajority/order/:id` e `PATCH /latemajority/order/:id` são responsáveis por atualizar uma ordem de compra específica. Todas as rotas recebem o seguinte corpo de requisição:\n  ```json\n  {\n    \"paymentMethod\": \"cartão\",\n    \"address\": \"Rua São Miguel\",\n      \"order\": [\n      {\n        \"_id\": \"640ebdb605aaccc707ab1507\",\n        \"name\": \"Coca-Cola\",\n        \"price\": 5,\n        \"description\": \"Coca-Cola is a carbonated soft drink manufactured by The Coca-Cola Company.\",\n        \"quantity\": 2\n      }\n    ]\n  }\n  ```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\n    \u003cstrong\u003eTestes\u003c/strong\u003e\n  \u003c/summary\u003e\u003cbr\u003e\n\n  - Para executar os testes, execute o comando `npm test` na raíz do projeto.\n  - Os testes foram desenvolvidos utilizando `Mocha`, `Jest`, `Chai` e `Sinon`.\n  - Os testes foram desenvolvidos para as camadas de `Controller` do projeto.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\n    \u003cstrong\u003eDesenvolvimento\u003c/strong\u003e\n  \u003c/summary\u003e\u003cbr\u003e\n\n  - O projeto foi desenvolvido utilizando arquitetura MSC (Model, Service e Controller) para uma melhor organização do código e também `middlewares` para verificar se os dados enviados pelo usuário estão corretos, se o usuário está autenticado, se o produto enviado pelo usuário existe, se a quantidade de produtos enviados pelo usuário é válida, entre outros.\n\n  - `errorHandler` - Middleware que captura os erros e retorna uma mensagem de erro.\n  - `authToken` - Middleware que verifica se o usuário está autenticado. Caso não esteja, retorna um erro.\n  - `validateLogin` - Middleware que verifica se os dados enviados pelo usuário ao realizar o login ou se registrar estão corretos. Caso não estejam, retorna um erro.\n  - `validateOrderFields` - Middleware que verifica se os dados enviados pelo usuário ao realizar uma nova ordem de compra estão corretos. Caso não estejam, retorna um erro.\n  - `productExists` - Middleware que verifica se o produto enviado pelo usuário ao realizar uma nova ordem de compra existe. Caso não exista, retorna um erro.\n  - `invalidQuantityMVP` - Middleware que verifica se a quantidade de produtos enviados pelo usuário ao realizar uma nova ordem de compra na rota `/mvp/order` é válida. Caso não seja, retorna um erro.\n  - `invalidQuantityEarlyAdop` - Middleware que verifica se a quantidade de produtos enviados pelo usuário ao realizar uma nova ordem de compra na rota `/earlyadopters/order` é válida. Caso não seja, retorna um erro.\n  - `invalidQuantityEarlyMajor` - Middleware que verifica se a quantidade de produtos enviados pelo usuário ao realizar uma nova ordem de compra na rota `/earlymajority/order` é válida. Caso não seja, retorna um erro.\n  - `invalidUpdatedQuantityMVP` - Middleware que verifica se a quantidade de produtos enviados pelo usuário ao atualizar uma ordem de compra na rota `/mvp/order/:id` é válida. Caso não seja, retorna um erro.\n  - `invalidUpdatedQuantityEarlyAdop` - Middleware que verifica se a quantidade de produtos enviados pelo usuário ao atualizar uma ordem de compra na rota `/earlyadopters/order/:id` é válida. Caso não seja, retorna um erro.\n  - `invalidUpdatedQuantityEarlyMajor` - Middleware que verifica se a quantidade de produtos enviados pelo usuário ao atualizar uma ordem de compra na rota `/earlymajority/order/:id` é válida. Caso não seja, retorna um erro.\n  - `invalidUpdatedFields` - Middleware que verifica se os dados enviados pelo usuário ao atualizar uma ordem de compra estão corretos. Caso não estejam, retorna um erro.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\n    \u003cstrong\u003eTecnologias utilizadas\u003c/strong\u003e\n  \u003c/summary\u003e\u003cbr\u003e\n\n  - O projeto foi desenvolvido utilizando o `Docker` para a criação de containers.\n  - Linguagem `Node.js` e banco de dados `MongoDB`.\n  - `Express` para a criação das rotas.\n  - `Mongoose` para a conexão com o banco de dados.\n  - `JWT` para a autenticação de usuários.\n  - `Mocha`, `Jest`, `Chai` e `Sinon` para a realização dos testes.\n  - `Joi` para a validação de dados.\n  - `Express Async Errors` para a tratativa de erros.\n  - `Dotenv` para a utilização de variáveis de ambiente.\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjacks1o%2Fdelivery-challenge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjacks1o%2Fdelivery-challenge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjacks1o%2Fdelivery-challenge/lists"}