{"id":21676415,"url":"https://github.com/odeassis/tasks-with-node.js","last_synced_at":"2026-04-13T22:01:38.077Z","repository":{"id":42927387,"uuid":"242048213","full_name":"odeassis/Tasks-with-Node.js","owner":"odeassis","description":"Aplicação para armazenar projetos e suas tarefas utilizando Express.","archived":false,"fork":false,"pushed_at":"2022-12-12T02:23:31.000Z","size":175,"stargazers_count":3,"open_issues_count":5,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-20T09:30:07.275Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/odeassis.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}},"created_at":"2020-02-21T03:46:24.000Z","updated_at":"2020-08-05T14:31:33.000Z","dependencies_parsed_at":"2023-01-27T11:15:52.729Z","dependency_job_id":null,"html_url":"https://github.com/odeassis/Tasks-with-Node.js","commit_stats":null,"previous_names":["odeassis/tasks-with-node.js"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/odeassis/Tasks-with-Node.js","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odeassis%2FTasks-with-Node.js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odeassis%2FTasks-with-Node.js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odeassis%2FTasks-with-Node.js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odeassis%2FTasks-with-Node.js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/odeassis","download_url":"https://codeload.github.com/odeassis/Tasks-with-Node.js/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odeassis%2FTasks-with-Node.js/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31772642,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T20:17:16.280Z","status":"ssl_error","status_checked_at":"2026-04-13T20:17:08.216Z","response_time":93,"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":[],"created_at":"2024-11-25T14:14:00.253Z","updated_at":"2026-04-13T22:01:38.029Z","avatar_url":"https://github.com/odeassis.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch3 align=\"center\"\u003e\n  Desafio 1: Conceitos do NodeJS\n\u003c/h3\u003e\n\n\u003cp align=\"center\"\u003e“Se você quiser fazer uma torta de maçã do nada, primeiro tem que inventar o universo”!\u003c/blockquote\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"GitHub language count\" src=\"https://img.shields.io/github/languages/count/rocketseat/bootcamp-gostack-desafio-01?color=%2304D361\"\u003e\n\n  \u003cimg alt=\"License\" src=\"https://img.shields.io/badge/license-MIT-%2304D361\"\u003e\n\n  \u003ca href=\"https://github.com/fdAssis/desafio-01/stargazers\"\u003e\n    \u003cimg alt=\"Stargazers\" src=\"https://img.shields.io/github/stars/fdAssis/desafio-01?style=social\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#pushpin-sobre-o-desafio\"\u003eSobre o desafio\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"#memo-licença\"\u003eLicença\u003c/a\u003e\n\u003c/p\u003e\n\n## :pushpin: Sobre o desafio\n\nCrie uma aplicação para armazenar projetos e suas tarefas do zero utilizando [Express](https://expressjs.com/pt-br/).\n\n### Rotas\n\n- [x] `POST /projects`: A rota deve receber `id` e `title` dentro do corpo e cadastrar um novo projeto dentro de um array no seguinte formato: `{ id: \"1\", title: 'Novo projeto', tasks: [] }`; Certifique-se de enviar tanto o ID quanto o título do projeto no formato string com aspas duplas.\n\n```js\nserver.post('/projects', (req, res) =\u003e {\n  const { id , title } = req.body;\n\n  const project = {\n    id,\n    title,\n    tasks:[]\n  };\n  \n  projects.push(project);\n  \n  return res.json(projects);\n\n});\n```\n\n- [x] `GET /projects`: Rota que lista todos projetos e suas tarefas;\n\n```js\nserver.get('/projects', (req, res) =\u003e {\n  return res.json(projects);\n});\n```\n\n- [x] `PUT /projects/:id`: A rota deve alterar apenas o título do projeto com o `id` presente nos parâmetros da rota;\n\n```js\nserver.put('/projects/:id', checkIdExist, (req, res) =\u003e {\n  const { id } = req.params;\n  const { title } = req.body;\n\n  const project = projects.find(proj =\u003e proj.id == id);\n\n  project.title = title;\n\n  return res.json(project);\n});\n```\n\n- [x] `DELETE /projects/:id`: A rota deve deletar o projeto com o `id` presente nos parâmetros da rota;\n\n```js\nserver.delete('/projects/:id', checkIdExist, (req, res) =\u003e {\n  const { id } = req.params;\n\n  const projectIndex = projects.findIndex(proj =\u003e proj.id == id);\n  projects.slice(projectIndex , 1);\n\n  return res.send( 'Projeto removido!');\n});\n\n```\n\n- [x] `POST /projects/:id/tasks`: A rota deve receber um campo `title` e armazenar uma nova tarefa no array de tarefas de um projeto específico escolhido através do `id` presente nos parâmetros da rota;\n```js\nserver.post('/projects/:id/tasks', checkIdExist, (req, res) =\u003e {\n  const { id } = req.params;\n  const { title } = req.body;\n\n  const project = projects.find(proj =\u003e proj.id == id);\n  project.tasks.push(title);\n\n  return res.json(project);\n});\n```\n\n### Exemplo\n\nSe eu chamar a rota `POST /projects` repassando `{ id: 1, title: 'Novo projeto' }` e a rota `POST /projects/1/tasks` com `{ title: 'Nova tarefa' }`, meu array de projetos deve ficar assim:\n\n```js\n[\n  {\n    id: \"1\",\n    title: \"Novo projeto\",\n    tasks: [\"Nova tarefa\"]\n  }\n];\n```\n\n### Middlewares\n\n- [x] Crie um middleware que será utilizado em todas rotas que recebem o ID do projeto nos parâmetros da URL que verifica se o projeto com aquele ID existe. Se não existir retorne um erro, caso contrário permita a requisição continuar normalmente;\n\n```js\nfunction checkIdExist(req, res, next) {\n\n  if (!projects[projects.findIndex(proj =\u003e proj.id == req.params.id)])\n    return res.status(400).json({error: \"Projeto nao existe!\"})\n   \n  return next();    \n}\n```\n\n- [x] Crie um middleware global chamado em todas requisições que imprime (`console.log`) uma contagem de quantas requisições foram feitas na aplicação até então;\n\n```js\nfunction countReq(req, res, next){\n  console.count('quantidade de requisicoes' );\n\n  return next();\n}\n\nserver.use(countReq);\n```\n\n## :memo: Licença\n\nEsse projeto está sob a licença MIT.\n\n---","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fodeassis%2Ftasks-with-node.js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fodeassis%2Ftasks-with-node.js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fodeassis%2Ftasks-with-node.js/lists"}