Skip to content

Nesse projeto foi desenvolvido uma API de um CRUD (Create, Read, Update e Delete) de palestrantes. @trybe

Notifications You must be signed in to change notification settings

HenriqueNasciment0/PROJECT-TALKER-MANAGER-TRYBE

Repository files navigation

Project Talker Manager

A tarefa era construir uma aplicação de cadastro de talkers (palestrantes) em que seria possível cadastrar, visualizar, pesquisar, editar e excluir informações. Para isso foi necessário:

Desenvolver uma API de um CRUD (Create, Read, Update e Delete) de palestrantes (talkers) e; Desenvolver alguns endpoints que irão ler e escrever em um arquivo utilizando o módulo fs.

👨‍💻 Meu resultado

🚀 Tecnologias

  • Bash
  • Docker
  • MySQL
  • Workbench
  • Postmann

Instale as dependências:

npm install

Inicie a aplicação e faça as requisições para a porta 3000:

npm run dev

A pasta de testes não está nesse repositório, logo os testes não irão rodar

🚀 Habilidades

  • Realizar operações assíncronas utilizando callbacks;
  • Realizar operações assíncronas utilizando Promises;
  • Ler e escrever arquivos localmente com NodeJS;
  • Escrever seus próprios scripts que criam e consomem Promises;
  • Reescrever código que usa callbacks para que use Promises;
  • Realizar chamadas de funções de forma consciente;
  • Entender os conceitos básicos de como o JavaScript funciona;
  • Detectar e solucionar problemas no código de forma mais objetiva;
  • Entender a diferença entre execução síncrona e assíncrona;
  • Entender o que é o HTTP, o que é uma API e o que os dois têm a ver com o Express;
  • Escrever APIs utilizando Node e Express;
  • Entender a estrutura de uma aplicação Express e como organizar seu código;
  • Criar rotas e aplicar middlewares.

📝 Requisitos do projeto

  • 1. Crie o endpoint GET /talker

  • O endpoint deve retornar um array com todas as pessoas palestrantes cadastradas. Devendo retornar o status 200, com o seguinte corpo:

[
  {
    "name": "Henrique Albuquerque",
    "age": 62,
    "id": 1,
    "talk": { "watchedAt": "23/10/2020", "rate": 5 }
  },
  {
    "name": "Heloísa Albuquerque",
    "age": 67,
    "id": 2,
    "talk": { "watchedAt": "23/10/2020", "rate": 5 }
  },
  {
    "name": "Ricardo Xavier Filho",
    "age": 33,
    "id": 3,
    "talk": { "watchedAt": "23/10/2020", "rate": 5 }
  },
  {
    "name": "Marcos Costa",
    "age": 24,
    "id": 4,
    "talk": { "watchedAt": "23/10/2020", "rate": 5 }
  }
]
  • Caso não exista nenhuma pessoa palestrante cadastrada o endpoint deve retornar um array vazio e o status 200.

  • 2. Crie o endpoint GET /talker/:id

  • 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:

    {
      "name": "Henrique Albuquerque",
      "age": 62,
      "id": 1,
      "talk": { "watchedAt": "23/10/2020", "rate": 5 }
    }
  • 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:

    {
      "message": "Pessoa palestrante não encontrada"
    }

  • 3. Crie o endpoint POST /login

  • O endpoint deve ser capaz de retornar um token aleatório de 16 caracteres que deverá ser utilizado nas demais requisições.

    • O endpoint deverá retornar um código de status 200 com o token gerado, com o seguinte corpo:
    {
      "token": "7mqaVRXJSp886CGr"
    }
  • O corpo da requisição deverá ter o seguinte formato:

    {
      "email": "[email protected]",
      "password": "123456"
    }
  • O campo email deverá ser um email válido. Ele é obrigatório.

    • Caso o campo não seja passado ou esteja vazio retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O campo \"email\" é obrigatório"
      }
    • Caso o email passado não seja um email válido retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O \"email\" deve ter o formato \"[email protected]\""
      }
  • O campo password deverá ter pelo menos 6 caracteres.

    • Caso o campo não seja passado ou esteja vazio retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O campo \"password\" é obrigatório"
      }
    • Caso a senha não tenha pelo menos 6 caracteres retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O \"password\" deve ter pelo menos 6 caracteres"
      }

  • 4. Crie o endpoint POST /talker

  • O endpoint deve ser capaz de adicionar uma nova pessoa palestrante ao seu arquivo;

  • O corpo da requisição deverá ter o seguinte formato:

    {
      "name": "Danielle Santos",
      "age": 56,
      "talk": {
        "watchedAt": "22/10/2019",
        "rate": 5
      }
    }
  • A requisição deve ter o token de autenticação nos headers, no campo authorization.

    • Caso o token não seja encontrado retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token não encontrado"
      }
    • Caso o token seja inválido retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token inválido"
      }
  • O campo name deverá ter no mínimo 3 caracteres. Ele é obrigatório.

    • Caso o campo não seja passado ou esteja vazio retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O campo \"name\" é obrigatório"
      }
    • Caso o nome não tenha pelo menos 3 caracteres retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O \"name\" deve ter pelo menos 3 caracteres"
      }
  • O campo age deverá ser um inteiro e apenas pessoas maiores de idade (pelo menos 18 anos) podem ser cadastrados. Ele é obrigatório.

    • Caso o campo não seja passado ou esteja vazio retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O campo \"age\" é obrigatório"
      }
    • Caso a pessoa palestrante não tenha pelo menos 18 anos retorne status 400, com o seguinte corpo:

      {
        "message": "A pessoa palestrante deve ser maior de idade"
      }
  • O campo talk deverá ser um objeto com as seguintes chaves:

    • A chave watchedAt deve ser uma data no formato dd/mm/aaaa.

      • Caso a data não respeito o formato dd/mm/aaaa retorne status 400, com o seguinte corpo:
      {
        "message": "O campo \"watchedAt\" deve ter o formato \"dd/mm/aaaa\""
      }
    • A chave rate deve ser um inteiro de 1 à 5.

      • Caso a nota não seja um inteiro de 1 à 5 retorne status 400, com o seguinte corpo:

        {
          "message": "O campo \"rate\" deve ser um inteiro de 1 à 5"
        }
    • O campo talk é obrigatório e nenhuma das chaves citadas anteriormente podem ser vazias.

      • 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:

        {
          "message": "O campo \"talk\" é obrigatório e \"watchedAt\" e \"rate\" não podem ser vazios"
        }
  • Caso esteja tudo certo, retorne o status 201 e a pessoa cadastrada.

  • O endpoint deve retornar o status 201 e a pessoa palestrante que foi cadastrada, da seguinte forma:

    {
      "id": 1,
      "name": "Danielle Santos",
      "age": 56,
      "talk": {
        "watchedAt": "22/10/2019",
        "rate": 5
      }
    }

  • 5. Crie o endpoint PUT /talker/:id

  • O endpoint deve ser capaz de editar uma pessoa palestrante com base no id da rota, sem alterar o id registrado.

  • O corpo da requisição deverá ter o seguinte formato:

    {
      "name": "Danielle Santos",
      "age": 56,
      "talk": {
        "watchedAt": "22/10/2019",
        "rate": 5
      }
    }
  • A requisição deve ter o token de autenticação nos headers, no campo authorization.

    • Caso o token não seja encontrado retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token não encontrado"
      }
    • Caso o token seja inválido retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token inválido"
      }
  • O campo name deverá ter no mínimo 3 caracteres. Ele é obrigatório.

    • Caso o campo não seja passado ou esteja vazio retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O campo \"name\" é obrigatório"
      }
    • Caso o nome não tenha pelo menos 3 caracteres retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O \"name\" ter pelo menos 3 caracteres"
      }
  • O campo age deverá ser um inteiro e apenas pessoas maiores de idade (pelo menos 18 anos) podem ser cadastrados. Ele é obrigatório.

    • Caso o campo não seja passado ou esteja vazio retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O campo \"age\" é obrigatório"
      }
    • Caso a pessoa palestrante não tenha pelo menos 18 anos retorne status 400, com o seguinte corpo:

      {
        "message": "A pessoa palestrante deve ser maior de idade"
      }
  • O campo talk deverá ser um objeto com as seguintes chaves:

    • A chave watchedAt deve ser uma data no formato dd/mm/aaaa.

      • Caso a data não respeito o formato dd/mm/aaaa retorne status 400, com o seguinte corpo:
      {
        "message": "O campo \"watchedAt\" deve ter o formato \"dd/mm/aaaa\""
      }
    • A chave rate deve ser um inteiro de 1 à 5.

      • Caso a nota não seja um inteiro de 1 à 5 retorne status 400, com o seguinte corpo:

        {
          "message": "O campo \"rate\" deve ser um inteiro de 1 à 5"
        }
    • O campo talk é obrigatório e nenhuma das chaves citadas anteriormente podem ser vazias.

      • 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:

        {
          "message": "O campo \"talk\" é obrigatório e \"watchedAt\" e \"rate\" não podem ser vazios"
        }
  • Caso esteja tudo certo, retorne o status 200 e a pessoa editada.

  • O endpoint deve retornar o status 200 e a pessoa palestrante que foi editada, da seguinte forma:

    {
      "id": 1,
     "name": "Danielle Santos",
      "age": 56,
      "talk": {
        "watchedAt": "22/10/2019",
        "rate": 4
      }
    }

  • 6. Crie o endpoint DELETE /talker/:id

  • A requisição deve ter o token de autenticação nos headers, no campo authorization.

    • Caso o token não seja encontrado retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token não encontrado"
      }
    • Caso o token seja inválido retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token inválido"
      }
  • O endpoint deve deletar uma pessoa palestrante com base no id da rota. Devendo retornar o status 204, sem conteúdo na resposta.

  • 7. Crie o endpoint GET /talker/search?q=searchTerm

  • 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:

    /search?q=Da
    
    [
      {
        "id": 1,
       "name": "Danielle Santos",
        "age": 56,
        "talk": {
          "watchedAt": "22/10/2019",
          "rate": 5
        }
      }
    ]
  • A requisição deve ter o token de autenticação nos headers, no campo authorization.

    • Caso o token não seja encontrado retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token não encontrado"
      }
    • Caso o token seja inválido retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token inválido"
      }
  • 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.

  • Caso nenhuma pessoa palestrante satisfaça a busca, o endpoint deve retornar o status 200 e um array vazio.

##Instale as dependências:

npm install

Inicie a aplicação e faça as requisições para a porta 3000:

npm run dev

🚀 Habilidades

  • Realizar operações assíncronas utilizando callbacks;
  • Realizar operações assíncronas utilizando Promises;
  • Ler e escrever arquivos localmente com NodeJS;
  • Escrever seus próprios scripts que criam e consomem Promises;
  • Reescrever código que usa callbacks para que use Promises;
  • Realizar chamadas de funções de forma consciente;
  • Entender os conceitos básicos de como o JavaScript funciona;
  • Detectar e solucionar problemas no código de forma mais objetiva;
  • Entender a diferença entre execução síncrona e assíncrona;
  • Entender o que é o HTTP, o que é uma API e o que os dois têm a ver com o Express;
  • Escrever APIs utilizando Node e Express;
  • Entender a estrutura de uma aplicação Express e como organizar seu código;
  • Criar rotas e aplicar middlewares.

🔧 Desenvolvimento

Nesse projeto foi desenvolvido uma API de um CRUD (Create, Read, Update e Delete) de palestrantes.

📝 Requisitos do projeto

  • 1. Crie o endpoint GET /talker

  • O endpoint deve retornar um array com todas as pessoas palestrantes cadastradas. Devendo retornar o status 200, com o seguinte corpo:

[
  {
    "name": "Henrique Albuquerque",
    "age": 62,
    "id": 1,
    "talk": { "watchedAt": "23/10/2020", "rate": 5 }
  },
  {
    "name": "Heloísa Albuquerque",
    "age": 67,
    "id": 2,
    "talk": { "watchedAt": "23/10/2020", "rate": 5 }
  },
  {
    "name": "Ricardo Xavier Filho",
    "age": 33,
    "id": 3,
    "talk": { "watchedAt": "23/10/2020", "rate": 5 }
  },
  {
    "name": "Marcos Costa",
    "age": 24,
    "id": 4,
    "talk": { "watchedAt": "23/10/2020", "rate": 5 }
  }
]
  • Caso não exista nenhuma pessoa palestrante cadastrada o endpoint deve retornar um array vazio e o status 200.

  • 2. Crie o endpoint GET /talker/:id

  • 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:

    {
      "name": "Henrique Albuquerque",
      "age": 62,
      "id": 1,
      "talk": { "watchedAt": "23/10/2020", "rate": 5 }
    }
  • 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:

    {
      "message": "Pessoa palestrante não encontrada"
    }

  • 3. Crie o endpoint POST /login

  • O endpoint deve ser capaz de retornar um token aleatório de 16 caracteres que deverá ser utilizado nas demais requisições.

    • O endpoint deverá retornar um código de status 200 com o token gerado, com o seguinte corpo:
    {
      "token": "7mqaVRXJSp886CGr"
    }
  • O corpo da requisição deverá ter o seguinte formato:

    {
      "email": "[email protected]",
      "password": "123456"
    }
  • O campo email deverá ser um email válido. Ele é obrigatório.

    • Caso o campo não seja passado ou esteja vazio retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O campo \"email\" é obrigatório"
      }
    • Caso o email passado não seja um email válido retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O \"email\" deve ter o formato \"[email protected]\""
      }
  • O campo password deverá ter pelo menos 6 caracteres.

    • Caso o campo não seja passado ou esteja vazio retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O campo \"password\" é obrigatório"
      }
    • Caso a senha não tenha pelo menos 6 caracteres retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O \"password\" deve ter pelo menos 6 caracteres"
      }

  • 4. Crie o endpoint POST /talker

  • O endpoint deve ser capaz de adicionar uma nova pessoa palestrante ao seu arquivo;

  • O corpo da requisição deverá ter o seguinte formato:

    {
      "name": "Danielle Santos",
      "age": 56,
      "talk": {
        "watchedAt": "22/10/2019",
        "rate": 5
      }
    }
  • A requisição deve ter o token de autenticação nos headers, no campo authorization.

    • Caso o token não seja encontrado retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token não encontrado"
      }
    • Caso o token seja inválido retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token inválido"
      }
  • O campo name deverá ter no mínimo 3 caracteres. Ele é obrigatório.

    • Caso o campo não seja passado ou esteja vazio retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O campo \"name\" é obrigatório"
      }
    • Caso o nome não tenha pelo menos 3 caracteres retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O \"name\" deve ter pelo menos 3 caracteres"
      }
  • O campo age deverá ser um inteiro e apenas pessoas maiores de idade (pelo menos 18 anos) podem ser cadastrados. Ele é obrigatório.

    • Caso o campo não seja passado ou esteja vazio retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O campo \"age\" é obrigatório"
      }
    • Caso a pessoa palestrante não tenha pelo menos 18 anos retorne status 400, com o seguinte corpo:

      {
        "message": "A pessoa palestrante deve ser maior de idade"
      }
  • O campo talk deverá ser um objeto com as seguintes chaves:

    • A chave watchedAt deve ser uma data no formato dd/mm/aaaa.

      • Caso a data não respeito o formato dd/mm/aaaa retorne status 400, com o seguinte corpo:
      {
        "message": "O campo \"watchedAt\" deve ter o formato \"dd/mm/aaaa\""
      }
    • A chave rate deve ser um inteiro de 1 à 5.

      • Caso a nota não seja um inteiro de 1 à 5 retorne status 400, com o seguinte corpo:

        {
          "message": "O campo \"rate\" deve ser um inteiro de 1 à 5"
        }
    • O campo talk é obrigatório e nenhuma das chaves citadas anteriormente podem ser vazias.

      • 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:

        {
          "message": "O campo \"talk\" é obrigatório e \"watchedAt\" e \"rate\" não podem ser vazios"
        }
  • Caso esteja tudo certo, retorne o status 201 e a pessoa cadastrada.

  • O endpoint deve retornar o status 201 e a pessoa palestrante que foi cadastrada, da seguinte forma:

    {
      "id": 1,
      "name": "Danielle Santos",
      "age": 56,
      "talk": {
        "watchedAt": "22/10/2019",
        "rate": 5
      }
    }

  • 5. Crie o endpoint PUT /talker/:id

  • O endpoint deve ser capaz de editar uma pessoa palestrante com base no id da rota, sem alterar o id registrado.

  • O corpo da requisição deverá ter o seguinte formato:

    {
      "name": "Danielle Santos",
      "age": 56,
      "talk": {
        "watchedAt": "22/10/2019",
        "rate": 5
      }
    }
  • A requisição deve ter o token de autenticação nos headers, no campo authorization.

    • Caso o token não seja encontrado retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token não encontrado"
      }
    • Caso o token seja inválido retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token inválido"
      }
  • O campo name deverá ter no mínimo 3 caracteres. Ele é obrigatório.

    • Caso o campo não seja passado ou esteja vazio retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O campo \"name\" é obrigatório"
      }
    • Caso o nome não tenha pelo menos 3 caracteres retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O \"name\" ter pelo menos 3 caracteres"
      }
  • O campo age deverá ser um inteiro e apenas pessoas maiores de idade (pelo menos 18 anos) podem ser cadastrados. Ele é obrigatório.

    • Caso o campo não seja passado ou esteja vazio retorne um código de status 400, com o seguinte corpo:

      {
        "message": "O campo \"age\" é obrigatório"
      }
    • Caso a pessoa palestrante não tenha pelo menos 18 anos retorne status 400, com o seguinte corpo:

      {
        "message": "A pessoa palestrante deve ser maior de idade"
      }
  • O campo talk deverá ser um objeto com as seguintes chaves:

    • A chave watchedAt deve ser uma data no formato dd/mm/aaaa.

      • Caso a data não respeito o formato dd/mm/aaaa retorne status 400, com o seguinte corpo:
      {
        "message": "O campo \"watchedAt\" deve ter o formato \"dd/mm/aaaa\""
      }
    • A chave rate deve ser um inteiro de 1 à 5.

      • Caso a nota não seja um inteiro de 1 à 5 retorne status 400, com o seguinte corpo:

        {
          "message": "O campo \"rate\" deve ser um inteiro de 1 à 5"
        }
    • O campo talk é obrigatório e nenhuma das chaves citadas anteriormente podem ser vazias.

      • 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:

        {
          "message": "O campo \"talk\" é obrigatório e \"watchedAt\" e \"rate\" não podem ser vazios"
        }
  • Caso esteja tudo certo, retorne o status 200 e a pessoa editada.

  • O endpoint deve retornar o status 200 e a pessoa palestrante que foi editada, da seguinte forma:

    {
      "id": 1,
     "name": "Danielle Santos",
      "age": 56,
      "talk": {
        "watchedAt": "22/10/2019",
        "rate": 4
      }
    }

  • 6. Crie o endpoint DELETE /talker/:id

  • A requisição deve ter o token de autenticação nos headers, no campo authorization.

    • Caso o token não seja encontrado retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token não encontrado"
      }
    • Caso o token seja inválido retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token inválido"
      }
  • O endpoint deve deletar uma pessoa palestrante com base no id da rota. Devendo retornar o status 204, sem conteúdo na resposta.

  • 7. Crie o endpoint GET /talker/search?q=searchTerm

  • 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:

    /search?q=Da
    
    [
      {
        "id": 1,
       "name": "Danielle Santos",
        "age": 56,
        "talk": {
          "watchedAt": "22/10/2019",
          "rate": 5
        }
      }
    ]
  • A requisição deve ter o token de autenticação nos headers, no campo authorization.

    • Caso o token não seja encontrado retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token não encontrado"
      }
    • Caso o token seja inválido retorne um código de status 401, com o seguinte corpo:

      {
        "message": "Token inválido"
      }
  • 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.

  • Caso nenhuma pessoa palestrante satisfaça a busca, o endpoint deve retornar o status 200 e um array vazio.

About

Nesse projeto foi desenvolvido uma API de um CRUD (Create, Read, Update e Delete) de palestrantes. @trybe

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •