{"id":21864914,"url":"https://github.com/gustavogss/talker-manager-project","last_synced_at":"2026-04-05T23:03:57.618Z","repository":{"id":68815336,"uuid":"536839514","full_name":"gustavogss/talker-manager-project","owner":"gustavogss","description":"API Rest para cadastro e pesquisa de talkers implementada em NodeJs e Express","archived":false,"fork":false,"pushed_at":"2022-09-15T02:47:59.000Z","size":255,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-21T21:11:57.017Z","etag":null,"topics":["express","nodejs","rest-api"],"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/gustavogss.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":"2022-09-15T02:46:17.000Z","updated_at":"2023-02-11T22:43:26.000Z","dependencies_parsed_at":"2023-03-05T22:30:24.623Z","dependency_job_id":null,"html_url":"https://github.com/gustavogss/talker-manager-project","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gustavogss/talker-manager-project","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gustavogss%2Ftalker-manager-project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gustavogss%2Ftalker-manager-project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gustavogss%2Ftalker-manager-project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gustavogss%2Ftalker-manager-project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gustavogss","download_url":"https://codeload.github.com/gustavogss/talker-manager-project/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gustavogss%2Ftalker-manager-project/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262018675,"owners_count":23245618,"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":["express","nodejs","rest-api"],"created_at":"2024-11-28T04:13:05.841Z","updated_at":"2025-12-30T22:15:28.561Z","avatar_url":"https://github.com/gustavogss.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Projeto Talker Manager!\n\nCriação de uma API como desafio durante o módulo de Backend na Formação da Trybe \n\n## REQUISITOS OBRIGATÓRIOS :robot:\n\n## 1 - Crie o endpoint GET `/talker`\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\n## 2 - Crie o endpoint GET `/talker/:id`\n\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  ```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  ```json\n  {\n    \"email\": \"email@email.com\",\n    \"password\": \"123456\"\n  }\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\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  - 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- 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 chaves `watchedAt` e `rate`:\n\n  - O campo `talk` é obrigatório.\n\n      - Caso o campo não seja informado retorne `status 400`, com o seguinte corpo:\n\n        ```json\n        {\n          \"message\": \"O campo \\\"talk\\\" é obrigatório\"\n        }\n        ```\n      \n  - A chave `watchedAt` é obrigatória.  \n\n    - Caso a chave não seja informada ou esteja vazia retorne `status 400`, com o seguinte corpo:\n\n      ```json\n      {\n        \"message\": \"O campo \\\"watchedAt\\\" é obrigatório\"\n      }\n      ```\n\n  - A chave `watchedAt` deve ser uma data no formato `dd/mm/aaaa`.\n\n    - Caso a data não respeite 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  - O campo `rate` é obrigatório.  \n\n    - Caso o campo não seja informado ou esteja vazio retorne `status 400`, com o seguinte corpo:\n\n      ```json\n      {\n        \"message\": \"O campo \\\"rate\\\" é obrigatório\"\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- Caso esteja tudo certo, retorne o `status 201`  e a pessoa cadastrada.\n  \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  - 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 chaves `watchedAt` e `rate`:\n\n    - O campo `talk` é obrigatório.\n\n        - Caso o campo não seja informado retorne `status 400`, com o seguinte corpo:\n\n          ```json\n          {\n            \"message\": \"O campo \\\"talk\\\" é obrigatório\"\n          }\n          ```\n        \n    - A chave `watchedAt` é obrigatória.  \n\n      - Caso a chave não seja informada ou esteja vazia retorne `status 400`, com o seguinte corpo:\n\n        ```json\n        {\n          \"message\": \"O campo \\\"watchedAt\\\" é obrigatório\"\n        }\n        ```\n\n    - A chave `watchedAt` deve ser uma data no formato `dd/mm/aaaa`.\n\n      - Caso a data não respeite 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    - O campo `rate` é obrigatório.  \n\n      - Caso o campo não seja informado ou esteja vazio retorne `status 400`, com o seguinte corpo:\n\n        ```json\n        {\n          \"message\": \"O campo \\\"rate\\\" é obrigatório\"\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  - 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  - 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  - 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","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgustavogss%2Ftalker-manager-project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgustavogss%2Ftalker-manager-project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgustavogss%2Ftalker-manager-project/lists"}