{"id":22468383,"url":"https://github.com/kelsonbatista/project-node-express","last_synced_at":"2025-03-27T15:44:10.742Z","repository":{"id":152492502,"uuid":"487086494","full_name":"kelsonbatista/project-node-express","owner":"kelsonbatista","description":"Project Node Express with CRUD functions","archived":false,"fork":false,"pushed_at":"2022-05-03T11:49:23.000Z","size":251,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-01T19:29:25.431Z","etag":null,"topics":["crud","express","listen","nodejs","server","statuscode"],"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/kelsonbatista.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":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-04-29T19:20:14.000Z","updated_at":"2022-04-29T19:24:53.000Z","dependencies_parsed_at":null,"dependency_job_id":"176035ab-4a73-4586-b74a-7a3c38f01229","html_url":"https://github.com/kelsonbatista/project-node-express","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kelsonbatista%2Fproject-node-express","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kelsonbatista%2Fproject-node-express/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kelsonbatista%2Fproject-node-express/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kelsonbatista%2Fproject-node-express/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kelsonbatista","download_url":"https://codeload.github.com/kelsonbatista/project-node-express/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245874062,"owners_count":20686694,"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":["crud","express","listen","nodejs","server","statuscode"],"created_at":"2024-12-06T11:16:32.902Z","updated_at":"2025-03-27T15:44:10.735Z","avatar_url":"https://github.com/kelsonbatista.png","language":"JavaScript","readme":"### Termos e acordos\n\nAo iniciar este projeto, você concorda com as diretrizes do Código de Ética e Conduta e do Manual da Pessoa Estudante da Trybe.\n\n---\n\n# Boas vindas ao repositório do Talker Manager!\n\nVocê já usa o GitHub diariamente para desenvolver os exercícios, certo? Agora, para desenvolver os projetos, você deverá seguir as instruções a seguir. Fique atento a cada passo, e se tiver qualquer dúvida, nos envie por Slack! #vqv 🚀\n\nAqui você vai encontrar os detalhes de como estruturar o desenvolvimento do seu projeto a partir deste repositório, utilizando uma branch específica e um Pull Request para colocar seus códigos.\n\n---\n\n# Sumário\n\n- [Boas vindas ao repositório do Talker Manager!](#boas-vindas-ao-repositório-do-talker-manager)\n- [Sumário](#sumário)\n- [Habilidades](#habilidades)\n  - [- Criar rotas e aplicar middlewares.](#--criar-rotas-e-aplicar-middlewares)\n- [Entregáveis](#entregáveis)\n  - [O que deverá ser desenvolvido](#o-que-deverá-ser-desenvolvido)\n  - [Desenvolvimento](#desenvolvimento)\n    - [Data de Entrega](#data-de-entrega)\n- [Instruções para entregar seu projeto](#instruções-para-entregar-seu-projeto)\n  - [Antes de começar a desenvolver:](#antes-de-começar-a-desenvolver)\n    - [Rodando no Docker vs Localmente](#rodando-no-docker-vs-localmente)\n  - [Durante o desenvolvimento](#durante-o-desenvolvimento)\n  - [Depois de terminar o desenvolvimento (opcional):](#depois-de-terminar-o-desenvolvimento-opcional)\n    - [Revisando um pull request](#revisando-um-pull-request)\n- [Como desenvolver:](#como-desenvolver)\n  - [Sobre o avaliador](#sobre-o-avaliador)\n- [Requisitos do projeto](#requisitos-do-projeto)\n    - [Linter](#linter)\n    - [Live reload](#live-reload)\n  - [Testes](#testes)\n    - [Executando todos os testes](#executando-todos-os-testes)\n    - [Executando um teste específico](#executando-um-teste-específico)\n  - [:notebook: Lista de requisitos](#notebook-lista-de-requisitos)\n    - [Observações](#observações)\n    - [1 - Crie o endpoint GET `/talker`](#1---crie-o-endpoint-get-talker)\n      - [Os seguintes pontos serão avaliados:](#os-seguintes-pontos-serão-avaliados)\n    - [2 - Crie o endpoint GET `/talker/:id`](#2---crie-o-endpoint-get-talkerid)\n    - [3 - Crie o endpoint POST `/login`](#3---crie-o-endpoint-post-login)\n      - [Os seguintes pontos serão avaliados:](#os-seguintes-pontos-serão-avaliados-1)\n    - [4 - Adicione as validações para o endpoint `/login`](#4---adicione-as-validações-para-o-endpoint-login)\n      - [Os seguintes pontos serão avaliados:](#os-seguintes-pontos-serão-avaliados-2)\n    - [5 - Crie o endpoint POST `/talker`](#5---crie-o-endpoint-post-talker)\n      - [Os seguintes pontos serão avaliados:](#os-seguintes-pontos-serão-avaliados-3)\n    - [6 - Crie o endpoint PUT `/talker/:id`](#6---crie-o-endpoint-put-talkerid)\n      - [Os seguintes pontos serão avaliados:](#os-seguintes-pontos-serão-avaliados-4)\n    - [7 - Crie o endpoint DELETE `/talker/:id`](#7---crie-o-endpoint-delete-talkerid)\n      - [Os seguintes pontos serão avaliados:](#os-seguintes-pontos-serão-avaliados-5)\n    - [8 - Crie o endpoint GET `/talker/search?q=searchTerm`](#8---crie-o-endpoint-get-talkersearchqsearchterm)\n      - [Os seguintes pontos serão avaliados:](#os-seguintes-pontos-serão-avaliados-6)\n- [Avisos finais](#avisos-finais)\n\n---\n\n# Habilidades\n\nNeste projeto, verificamos se você é capaz de:\n\n- Realizar operações assíncronas utilizando callbacks;\n- Realizar operações assíncronas utilizando Promises;\n- Ler e escrever arquivos localmente com NodeJS;\n- Escrever seus próprios scripts que criam e consomem Promises;\n- Reescrever código que usa callbacks para que use Promises;\n- Realizar chamadas de funções de forma consciente;\n- Entender os conceitos básicos de como o JavaScript funciona;\n- Detectar e solucionar problemas no código de forma mais objetiva;\n- Entender a diferença entre execução síncrona e assíncrona;\n- Entender o que é o HTTP, o que é uma API e o que os dois têm a ver com o Express;\n- Escrever APIs utilizando Node e Express;\n- Entender a estrutura de uma aplicação Express e como organizar seu código;\n- Criar rotas e aplicar middlewares.\n---\n\n# Entregáveis\n\nPara entregar o seu projeto você deverá criar um Pull Request neste repositório.\n\nLembre-se que você pode consultar nosso conteúdo sobre [Git \u0026 GitHub](https://app.betrybe.com/course/4d67f5b4-34a6-489f-a205-b6c7dc50fc16/) e nosso [Blog - Git \u0026 GitHub](https://blog.betrybe.com/tecnologia/git-e-github/) sempre que precisar!\n\n## O que deverá ser desenvolvido\n\nVocê vai desenvolver uma API de um CRUD (**C**reate, **R**ead, **U**pdate e **D**elete) de palestrantes. Você vai desenvolver alguns endpoints que irão ler e escrever em um arquivo, isso utilizando o módulo `fs`.\n\n## Desenvolvimento\n\n### Data de Entrega\n\nO projeto tem até a seguinte data: `04/05/2022 14:00`. Para ser entregue a avaliação final.\n\n---\n\n# Instruções para entregar seu projeto\n\n## Antes de começar a desenvolver:\n\n1. Clone o repositório\n\n- `git clone git@github.com:tryber/sd-017-project-talker-manager.git`.\n- Entre na pasta do repositório que você acabou de clonar:\n  - `cd sd-017-project-talker-manager`\n\n---\n### Rodando no Docker vs Localmente\n\n\u003cdetails close\u003e\n  \u003csummary\u003eDocker\u003c/summary\u003e\n  \u003cbr\u003e\n\n  \u003e Rode o serviço `node` com o comando `docker-compose up -d`.\n  - Esse serviço irá inicializar um container chamado `talker_manager`.\n  - A partir daqui você pode rodar o container via CLI ou abri-lo no VS Code.\n\n  \u003e Use o comando `docker exec -it talker_manager bash`.\n  - Ele te dará acesso ao terminal interativo do container criado pelo compose, que está rodando em segundo plano.\n\n  \u003e Instale as dependências [**Caso existam**] com `npm install`\n\n✨ **Dica:** A extensão `Remote - Containers` do VS Code (que estará na seção de extensões recomendadas do programa) é indicada para que você possa desenvolver sua aplicação no container Docker direto no VS Code, como você faz com seus arquivos locais.\n\n\u003cimg src=\"images/remote-container.png\" width=\"800px\" \u003e\n\u003c/details\u003e\n\n\u003cdetails close\u003e\n  \u003csummary\u003eLocalmente\u003c/summary\u003e\n  \u003cbr\u003e\n\n  \u003e Instale as dependências [**Caso existam**] com `npm install`\n\n  ✨ **Dica:** Para rodar o projeto desta forma, obrigatoriamente você deve ter o `node` instalado em seu computador.\n  ✨ **Dica:** O avaliador espera que a versão do `node` utilizada seja a 16.\n\n\u003c/details\u003e\n\n---\n\n2. Crie uma branch a partir da branch `master`\n\n- Verifique que você está na branch `master`\n  - Exemplo: `git branch`\n- Se não estiver, mude para a branch `master`\n  - Exemplo: `git checkout master`\n- Agora crie uma branch à qual você vai submeter os `commits` do seu projeto\n  - Você deve criar uma branch no seguinte formato: `nome-de-usuario-nome-do-projeto`\n  - Exemplo: `git checkout -b joaozinho-sd-017-project-talker-manager`\n\n3. Adicione as mudanças ao _stage_ do Git e faça um `commit`\n\n- Verifique que as mudanças ainda não estão no _stage_\n  - Exemplo: `git status` (deve aparecer listada a pasta _joaozinho_ em vermelho)\n- Adicione o novo arquivo ao _stage_ do Git\n  - Exemplo:\n    - `git add .` (adicionando todas as mudanças - _que estavam em vermelho_ - ao stage do Git)\n    - `git status` (deve aparecer listado o arquivo _joaozinho/README.md_ em verde)\n- Faça o `commit` inicial\n  - Exemplo:\n    - `git commit -m 'iniciando o projeto x'` (fazendo o primeiro commit)\n    - `git status` (deve aparecer uma mensagem tipo _nothing to commit_ )\n\n4. Adicione a sua branch com o novo `commit` ao repositório remoto\n\n- Usando o exemplo anterior: `git push -u origin joaozinho-sd-017-project-talker-manager`\n\n5. Crie um novo `Pull Request` _(PR)_\n\n- Vá até a página de _Pull Requests_ do [repositório no GitHub](https://github.com/tryber/sd-017-project-talker-manager/pulls)\n- Clique no botão verde _\"New pull request\"_\n- Clique na caixa de seleção _\"Compare\"_ e escolha a sua branch **com atenção**\n- Clique no botão verde _\"Create pull request\"_\n- Adicione uma descrição para o _Pull Request_ e clique no botão verde _\"Create pull request\"_\n- **Não se preocupe em preencher mais nada por enquanto!**\n- Volte até a [página de _Pull Requests_ do repositório](https://github.com/tryber/sd-017-project-talker-manager/pulls) e confira que o seu _Pull Request_ está criado\n\n## Durante o desenvolvimento\n\n- Faça `commits` das alterações que você fizer no código regularmente\n\n- Lembre-se de sempre após um (ou alguns) `commits` atualizar o repositório remoto\n\n- Os comandos que você utilizará com mais frequência são:\n  1. `git status` _(para verificar o que está em vermelho - fora do stage - e o que está em verde - no stage)_\n  2. `git add` _(para adicionar arquivos ao stage do Git)_\n  3. `git commit` _(para criar um commit com os arquivos que estão no stage do Git)_\n  4. `git push -u nome-da-branch` _(para enviar o commit para o repositório remoto na primeira vez que fizer o `push` de uma nova branch)_\n  5. `git push` _(para enviar o commit para o repositório remoto após o passo anterior)_\n\n## Depois de terminar o desenvolvimento (opcional):\n\nPara sinalizar que o seu projeto está pronto para o _\"Code Review\"_ dos seus colegas, faça o seguinte:\n\n- Vá até a página **DO SEU** _Pull Request_, adicione a label de _\"code-review\"_ e marque seus colegas:\n\n  - No menu à direita, clique no _link_ **\"Labels\"** e escolha a _label_ **code-review**;\n\n  - No menu à direita, clique no _link_ **\"Assignees\"** e escolha **o seu usuário**;\n\n  - No menu à direita, clique no _link_ **\"Reviewers\"** e digite `students`, selecione o time `tryber/students-sd-017`.\n\nCaso tenha alguma dúvida, [aqui tem um video explicativo](https://vimeo.com/362189205).\n\n### Revisando um pull request\n\nUse o conteúdo sobre [Code Review](https://course.betrybe.com/real-life-engineer/code-review/) para te ajudar a revisar os _Pull Requests_.\n\n---\n\n# Como desenvolver:\n\n## Sobre o avaliador\n\nO avaliador automático não necessariamente avalia seu projeto na ordem em que os requisitos aparecem no readme. Isso acontece para deixar o processo de avaliação mais rápido. Então, não se assuste se isso acontecer, ok?\n\n# Requisitos do projeto\n\n### Linter\n\nUsaremos o [ESLint](https://eslint.org/) para fazer a análise estática do seu código.\n\nEste projeto já vem com as dependências relacionadas ao _linter_ configuradas nos arquivos `package.json`.\n\nPara poder rodar o `ESLint` em um projeto basta executar o comando `npm install` dentro do projeto e depois `npm run lint`. Se a análise do `ESLint` encontrar problemas no seu código, tais problemas serão mostrados no seu terminal. Se não houver problema no seu código, nada será impresso no seu terminal.\n\nVocê pode também instalar o plugin do `ESLint` no `VSCode`, bastar ir em extensions e baixar o [plugin `ESLint`](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint).\n\n### Live reload\n\nUsaremos o [Nodemon](https://nodemon.io) para monitorar as mudanças nos arquivos e reiniciar o servidor automaticamente.\n\nEste projeto já vem com as dependências relacionadas ao _nodemon_ configuradas no arquivo `package.json`.\n\nPara iniciar o servidor em modo de desenvolvimento basta executar o comando `npm run dev`. Este comando fará com que o servidor reinicie de forma automática ao salvar uma modificação realizada nos arquivos do projeto.\n\n---\n\n## Testes\n\nUsaremos o [Jest](https://jestjs.io/pt-BR/) e o [Frisby](https://docs.frisbyjs.com/) para fazer os testes de api.\n\nEste projeto já vem configurado e com suas dependências\n\n### Executando todos os testes\n\nPara poder executar os testes, inicie sua aplicação com `npm run dev`, em seguida, basta executar o comando `npm test` e **todos** os seus testes serão executados.\n\n### Executando um teste específico\n\nPara executar um teste expecífico, inicie sua aplicação com `npm run dev`, em seguida, basta executar o comando `npm test nome-do-teste`.\n\nEx: Para executar o teste referente ao **login**, basta digitar `npm test login`.\n\n❗ **Importante:** os comandos de testes podem ser executados tanto no terminal do seu computador quanto do **_Docker_**.\n\n---\n\n## :notebook: Lista de requisitos\n\n### Observações\n\n1. Com exceção do requisito 3, **todos** os outros requisitos deverão ser feitos utilizando o módulo `fs`.\n\n2. O arquivo `talker.json` será utilizado como base para fazer as requisições da API. As operações de **leitura** e **escrita** dos requisitos **devem** ser feitas nesse arquivo usando os métodos da biblioteca `fs`.\n\n3. Há um arquivo `index.js` no repositório. Não remova, nele, o seguinte trecho de código:\n  ```javascript\n  app.get('/', (_request, response) =\u003e {\n    response.status(HTTP_OK_STATUS).send();\n  });\n  ```\n  Isso está configurado para o avaliador funcionar.\n\n4. Caso os testes falhem seu arquivo `talker.json` não será restaurado, para isso utilize `npm run restore`.\n\n5. Ao se deparar com o erro de que a porta já está em uso: `EADDRINUSE: address already in use 0.0.0.0:3000`, execute em seu terminal `killall node` isso finaliza todas as execuções do node.\n\n---\n\n### 1 - Crie o endpoint GET `/talker`\n\n#### Os seguintes pontos serão avaliados:\n\n- O endpoint deve retornar um array com todas as pessoas palestrantes cadastradas. Devendo retornar o `status 200`, com o seguinte corpo:\n\n```json\n[\n  {\n    \"name\": \"Henrique Albuquerque\",\n    \"age\": 62,\n    \"id\": 1,\n    \"talk\": { \"watchedAt\": \"23/10/2020\", \"rate\": 5 }\n  },\n  {\n    \"name\": \"Heloísa Albuquerque\",\n    \"age\": 67,\n    \"id\": 2,\n    \"talk\": { \"watchedAt\": \"23/10/2020\", \"rate\": 5 }\n  },\n  {\n    \"name\": \"Ricardo Xavier Filho\",\n    \"age\": 33,\n    \"id\": 3,\n    \"talk\": { \"watchedAt\": \"23/10/2020\", \"rate\": 5 }\n  },\n  {\n    \"name\": \"Marcos Costa\",\n    \"age\": 24,\n    \"id\": 4,\n    \"talk\": { \"watchedAt\": \"23/10/2020\", \"rate\": 5 }\n  }\n]\n```\n\n- Caso não exista nenhuma pessoa palestrante cadastrada o endpoint deve retornar um array vazio e o `status 200`.\n\n\n### 2 - Crie o endpoint GET `/talker/:id`\n\n- O endpoint deve retornar uma pessoa palestrante com base no id da rota. Devendo retornar o `status 200` ao fazer uma requisição `/talker/1`, com o seguinte corpo:\n\n  ```json\n  {\n    \"name\": \"Henrique Albuquerque\",\n    \"age\": 62,\n    \"id\": 1,\n    \"talk\": { \"watchedAt\": \"23/10/2020\", \"rate\": 5 }\n  }\n  ```\n\n- Caso não seja encontrada uma pessoa palestrante com base no id da rota, o endpoint deve retornar o `status 404` com o seguinte corpo:\n\n  ```json\n  {\n    \"message\": \"Pessoa palestrante não encontrada\"\n  }\n  ```\n\n### 3 - Crie o endpoint POST `/login`\n\nO endpoint deverá receber no corpo da requisição os campos `email` e `password` e retornar um token aleatório de 16 caracteres. Este token será utilizado pelas requisições dos próximos requisitos do projeto.\n\n- O corpo da requisição deverá ter o seguinte formato:\n\n```json\n{\n  \"email\": \"email@email.com\",\n  \"password\": \"123456\"\n}\n```\n\n#### Os seguintes pontos serão avaliados:\n\n- O endpoint deverá retornar um código de `status 200` com o token gerado e o seguinte corpo:\n\n```json\n{\n  \"token\": \"7mqaVRXJSp886CGr\"\n}\n```\n\n- O endpoint deve retornar um token aleatório a cada vez que for acessado.\n\n### 4 - Adicione as validações para o endpoint `/login`\n\nOs campos recebidos pela requisição devem ser validados e, caso os valores sejam inválidos, o endpoint deve retornar o código de `status 400` com a respectiva mensagem de erro ao invés do token.\n\nAs regras de validação são:\n- o campo `email` é obrigatório;\n- o campo `email` deve ter um email válido;\n- o campo `password` é obrigatório;\n- o campo `password` deve ter pelo menos 6 caracteres.\n \n#### Os seguintes pontos serão avaliados:\n\n- Caso o campo `email` não seja passado ou esteja vazio, retorne um código de `status 400` com o seguinte corpo:\n\n```json\n{\n  \"message\": \"O campo \\\"email\\\" é obrigatório\"\n}\n```\n\n- Caso o email passado não seja válido, retorne um código de `status 400` com o seguinte corpo:\n\n```json\n{\n  \"message\": \"O \\\"email\\\" deve ter o formato \\\"email@email.com\\\"\"\n}\n```\n\n- Caso o campo `password` não seja passado ou esteja vazio retorne um código de `status 400` com o seguinte corpo:\n\n```json\n{\n  \"message\": \"O campo \\\"password\\\" é obrigatório\"\n}\n```\n\n- Caso a senha não tenha pelo menos 6 caracteres retorne um código de `status 400` com o seguinte corpo:\n\n```json\n{\n  \"message\": \"O \\\"password\\\" deve ter pelo menos 6 caracteres\"\n}\n```\n\n### 5 - Crie o endpoint POST `/talker`\n\n#### Os seguintes pontos serão avaliados:\n\n- O endpoint deve ser capaz de adicionar uma nova pessoa palestrante ao seu arquivo;\n\n- O corpo da requisição deverá ter o seguinte formato:\n\n  ```json\n  {\n    \"name\": \"Danielle Santos\",\n    \"age\": 56,\n    \"talk\": {\n      \"watchedAt\": \"22/10/2019\",\n      \"rate\": 5\n    }\n  }\n  ```\n\n- A requisição deve ter o token de autenticação nos headers, no campo `authorization`.\n\n  - Caso o token não seja encontrado retorne um código de `status 401`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"Token não encontrado\"\n    }\n    ```\n\n  - Caso o token seja inválido retorne um código de `status 401`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"Token inválido\"\n    }\n    ```\n\n- O campo `name` deverá ter no mínimo 3 caracteres. Ele é obrigatório.\n\n  - Caso o campo não seja passado ou esteja vazio retorne um código de `status 400`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"O campo \\\"name\\\" é obrigatório\"\n    }\n    ```\n\n  - Caso o nome não tenha pelo menos 3 caracteres retorne um código de `status 400`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"O \\\"name\\\" deve ter pelo menos 3 caracteres\"\n    }\n    ```\n\n- O campo `age` deverá ser um inteiro e apenas pessoas maiores de idade (pelo menos `18 anos`) podem ser cadastrados. Ele é obrigatório.\n\n  - Caso o campo não seja passado ou esteja vazio retorne um código de `status 400`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"O campo \\\"age\\\" é obrigatório\"\n    }\n    ```\n\n  - Caso a pessoa palestrante não tenha pelo menos 18 anos retorne `status 400`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"A pessoa palestrante deve ser maior de idade\"\n    }\n    ```\n\n- O campo `talk` deverá ser um objeto com as seguintes chaves:\n\n  - A chave `watchedAt` deve ser uma data no formato `dd/mm/aaaa`.\n\n    - Caso a data não respeito o formato `dd/mm/aaaa` retorne `status 400`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"O campo \\\"watchedAt\\\" deve ter o formato \\\"dd/mm/aaaa\\\"\"\n    }\n    ```\n\n  - A chave `rate` deve ser um inteiro de 1 à 5.\n\n    - Caso a nota não seja um inteiro de 1 à 5 retorne `status 400`, com o seguinte corpo:\n\n      ```json\n      {\n        \"message\": \"O campo \\\"rate\\\" deve ser um inteiro de 1 à 5\"\n      }\n      ```\n\n  - O campo `talk` é obrigatório e nenhuma das chaves citadas anteriormente podem ser vazias.\n\n    - Caso o campo não seja informado, esteja vazio ou então alguma de suas chaves não tenham sido informadas retorne `status 400`, com o seguinte corpo:\n\n      ```json\n      {\n        \"message\": \"O campo \\\"talk\\\" é obrigatório e \\\"watchedAt\\\" e \\\"rate\\\" não podem ser vazios\"\n      }\n      ```\n- Caso esteja tudo certo, retorne o `status 201`  e a pessoa cadastrada.\n- O endpoint deve retornar o `status 201` e a pessoa palestrante que foi cadastrada, da seguinte forma:\n\n  ```json\n  {\n    \"id\": 1,\n    \"name\": \"Danielle Santos\",\n    \"age\": 56,\n    \"talk\": {\n      \"watchedAt\": \"22/10/2019\",\n      \"rate\": 5\n    }\n  }\n  ```\n\n### 6 - Crie o endpoint PUT `/talker/:id`\n\n#### Os seguintes pontos serão avaliados:\n\n- O endpoint deve ser capaz de editar uma pessoa palestrante com base no id da rota, sem alterar o id registrado.\n\n- O corpo da requisição deverá ter o seguinte formato:\n\n  ```json\n  {\n    \"name\": \"Danielle Santos\",\n    \"age\": 56,\n    \"talk\": {\n      \"watchedAt\": \"22/10/2019\",\n      \"rate\": 5\n    }\n  }\n  ```\n  \n- A requisição deve ter o token de autenticação nos headers, no campo `authorization`.\n\n  - Caso o token não seja encontrado retorne um código de `status 401`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"Token não encontrado\"\n    }\n    ```\n\n  - Caso o token seja inválido retorne um código de `status 401`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"Token inválido\"\n    }\n    ```\n\n- O campo `name` deverá ter no mínimo 3 caracteres. Ele é obrigatório.\n\n  - Caso o campo não seja passado ou esteja vazio retorne um código de `status 400`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"O campo \\\"name\\\" é obrigatório\"\n    }\n    ```\n\n  - Caso o nome não tenha pelo menos 3 caracteres retorne um código de `status 400`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"O \\\"name\\\" ter pelo menos 3 caracteres\"\n    }\n    ```\n\n- O campo `age` deverá ser um inteiro e apenas pessoas maiores de idade (pelo menos `18 anos`) podem ser cadastrados. Ele é obrigatório.\n\n  - Caso o campo não seja passado ou esteja vazio retorne um código de `status 400`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"O campo \\\"age\\\" é obrigatório\"\n    }\n    ```\n\n  - Caso a pessoa palestrante não tenha pelo menos 18 anos retorne `status 400`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"A pessoa palestrante deve ser maior de idade\"\n    }\n    ```\n\n- O campo `talk` deverá ser um objeto com as seguintes chaves:\n\n  - A chave `watchedAt` deve ser uma data no formato `dd/mm/aaaa`.\n\n    - Caso a data não respeito o formato `dd/mm/aaaa` retorne `status 400`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"O campo \\\"watchedAt\\\" deve ter o formato \\\"dd/mm/aaaa\\\"\"\n    }\n    ```\n\n  - A chave `rate` deve ser um inteiro de 1 à 5.\n\n    - Caso a nota não seja um inteiro de 1 à 5 retorne `status 400`, com o seguinte corpo:\n\n      ```json\n      {\n        \"message\": \"O campo \\\"rate\\\" deve ser um inteiro de 1 à 5\"\n      }\n      ```\n\n  - O campo `talk` é obrigatório e nenhuma das chaves citadas anteriormente podem ser vazias.\n\n    - Caso o campo não seja informado, esteja vazio ou então alguma de suas chaves não tenham sido informadas retorne `status 400`, com o seguinte corpo:\n\n      ```json\n      {\n        \"message\": \"O campo \\\"talk\\\" é obrigatório e \\\"watchedAt\\\" e \\\"rate\\\" não podem ser vazios\"\n      }\n      ```\n- Caso esteja tudo certo, retorne o `status 200` e a pessoa editada.\n- O endpoint deve retornar o `status 200` e a pessoa palestrante que foi editada, da seguinte forma:\n\n  ```json\n  {\n    \"id\": 1,\n    \"name\": \"Danielle Santos\",\n    \"age\": 56,\n    \"talk\": {\n      \"watchedAt\": \"22/10/2019\",\n      \"rate\": 4\n    }\n  }\n  ```\n\n### 7 - Crie o endpoint DELETE `/talker/:id`\n\n#### Os seguintes pontos serão avaliados:\n\n- A requisição deve ter o token de autenticação nos headers, no campo `authorization`.\n\n  - Caso o token não seja encontrado retorne um código de `status 401`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"Token não encontrado\"\n    }\n    ```\n\n  - Caso o token seja inválido retorne um código de `status 401`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"Token inválido\"\n    }\n    ```\n\n- O endpoint deve deletar uma pessoa palestrante com base no id da rota. Devendo retornar o `status 204`, sem conteúdo na resposta.\n\n### 8 - Crie o endpoint GET `/talker/search?q=searchTerm`\n\n#### Os seguintes pontos serão avaliados:\n\n- O endpoint deve retornar um array de palestrantes que contenham em seu nome o termo pesquisado no queryParam da URL. Devendo retornar o `status 200`, com o seguinte corpo:\n\n  ```\n  /search?q=Da\n  ```\n\n  ```json\n  [\n    {\n      \"id\": 1,\n      \"name\": \"Danielle Santos\",\n      \"age\": 56,\n      \"talk\": {\n        \"watchedAt\": \"22/10/2019\",\n        \"rate\": 5,\n      },\n    }\n  ]\n  ```\n\n- A requisição deve ter o token de autenticação nos headers, no campo `authorization`.\n\n  - Caso o token não seja encontrado retorne um código de `status 401`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"Token não encontrado\"\n    }\n    ```\n\n  - Caso o token seja inválido retorne um código de `status 401`, com o seguinte corpo:\n\n    ```json\n    {\n      \"message\": \"Token inválido\"\n    }\n    ```\n\n- Caso `searchTerm` não seja informado ou esteja vazio, o endpoint deverá retornar um array com todos as pessoas palestrantes cadastradas, assim como no endpoint GET `/talker`, com um `status 200`.\n\n- Caso nenhuma pessoa palestrante satisfaça a busca, o endpoint deve retornar o `status 200` e um array vazio.\n\n**Dica** é importante ter atenção se essa rota não entra em conflito com as outras, já que a ordem das rotas faz diferença na interpretação da aplicação\n\n---\n\n# Avisos finais\n\nAo finalizar e submeter o projeto, não se esqueça de avaliar sua experiência preenchendo o formulário. Leva menos de 3 minutos!\n\nLink: [FORMULÁRIO DE AVALIAÇÃO DE PROJETO](https://be-trybe.typeform.com/to/ZTeR4IbH)\n\nO avaliador automático não necessariamente avalia seu projeto na ordem em que os requisitos aparecem no readme. Isso acontece para deixar o processo de avaliação mais rápido. Então, não se assuste se isso acontecer, ok?\n\n---\n\nVocê sabia que o LinkedIn é a principal rede social profissional e compartilhar o seu aprendizado lá é muito importante para quem deseja construir uma carreira de sucesso? Compartilhe esse projeto no seu LinkedIn, marque o perfil da Trybe (@trybe) e mostre para a sua rede toda a sua evolução.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkelsonbatista%2Fproject-node-express","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkelsonbatista%2Fproject-node-express","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkelsonbatista%2Fproject-node-express/lists"}