Skip to content

Node project using fs module to training simple CRUD operations

Notifications You must be signed in to change notification settings

renatoam/talker-manager

Repository files navigation

Talker Manager

Aplicação de cadastro de talkers (palestrantes) em que é possível cadastrar, visualizar, pesquisar, editar e excluir informações.

Orientações

🐳 Rodando no Docker vs Localmente

Com Docker

Rode o serviço node com o comando docker-compose up -d.

  • Esse serviço irá inicializar um container chamado talker_manager.
  • A partir daqui você pode rodar o container via CLI ou abri-lo no VS Code.

Use o comando docker exec -it talker_manager bash.

  • Ele te dará acesso ao terminal interativo do container criado pelo compose, que está rodando em segundo plano.

Instale as dependências [Caso existam] com npm install

👀 De olho na 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.


Sem Docker

Instale as dependências [Caso existam] com npm install

👀 De olho nas dicas:

  1. Para rodar o projeto desta forma, obrigatoriamente você deve ter o node instalado em seu computador.
  2. Versão do node: 16.
🎛 Linter

Usaremos o ESLint para fazer a análise estática do seu código.

Este projeto já vem com as dependências relacionadas ao linter configuradas nos arquivos package.json.

Para 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.

Você pode também instalar o plugin do ESLint no VSCode. Para isso, basta fazer o download do plugin ESLint e instalá-lo.

🔁 Live reload

Usaremos o Nodemon para monitorar as mudanças nos arquivos e reiniciar o servidor automaticamente.

Este projeto já vem com as dependências relacionadas ao nodemon configuradas no arquivo package.json.

Para 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.

🛠 Testes

Usaremos o Jest e o Frisby para fazer os testes de API.

Este projeto já vem configurado e com suas dependências

Executando todos os testes

Para 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.

Executando um teste específico

Para executar um teste expecífico, inicie sua aplicação com npm run dev, em seguida, basta executar o comando npm test nome-do-teste.

Ex: Para executar o teste referente ao login, basta digitar npm test login.

⚠️ Importante: os comandos de testes podem ser executados tanto no terminal do seu computador quanto do Docker.

Requisitos

⚠️ Observações importantes!
  1. Com exceção do requisito 3, todos os outros requisitos deverão ser feitos utilizando o módulo fs.

  2. 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.

  3. Há um arquivo index.js no repositório. Não remova, nele, o seguinte trecho de código:

    app.get('/', (_request, response) => {
      response.status(HTTP_OK_STATUS).send();
    });

Isso está configurado para o avaliador funcionar. 😅

  1. Você pode usar o comando npm run restore para restaurar o arquivo talker.json para seu estado inicial.

  2. 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 -9 node isso finalizá todas as execuções do node.


1 - Crie o endpoint GET /talker

A requisição deve retornar o status 200 e um array com todas as pessoas palestrantes cadastradas. Exemplo:
[
  {
    "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 a requisição deve retornar o status 200 e um array vazio. Exemplo:
[]

2 - Crie o endpoint GET /talker/:id

A requisição deve retornar o status 200 e uma pessoa palestrante com base no id da rota. Por exemplo, ao fazer uma requisição /talker/1, a resposta deve ser:
{
  "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, a requisição deve retornar o status 404 com o seguinte corpo:
{
  "message": "Pessoa palestrante não encontrada"
}

3 - Crie o endpoint POST /login

O 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.

O corpo da requisição deverá ter seguinte formato:
{
  "email": "[email protected]",
  "password": "123456"
}
Os seguintes pontos serão avaliados:
  • O endpoint deverá retornar um código de status 200 com o token gerado e o seguinte corpo:
{
  "token": "7mqaVRXJSp886CGr"
}
  • O endpoint deve retornar um token aleatório a cada vez que for acessado.

4 - Adicione as validações para o endpoint /login

Os 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.

As regras de validação são:
  • o campo email é obrigatório;
  • o campo email deve ter um email válido;
  • o campo password é obrigatório;
  • o campo password deve ter pelo menos 6 caracteres.
Os seguintes pontos serão avaliados:
  • Caso o campo email 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 válido, retorne um código de status 400 com o seguinte corpo:
{
  "message": "O \"email\" deve ter o formato \"[email protected]\""
}
  • Caso o campo password 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"
}

5 - Crie o endpoint POST /talker

Os seguintes pontos serão avaliados:
  • 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 chaves watchedAt e rate:

    • O campo talk é obrigatório.

      • Caso o campo não seja informado retorne status 400, com o seguinte corpo:

        {
          "message": "O campo \"talk\" é obrigatório"
        }
    • A chave watchedAt é obrigatória.

      • Caso a chave não seja informada ou esteja vazia retorne status 400, com o seguinte corpo:

        {
          "message": "O campo \"watchedAt\" é obrigatório"
        }
    • A chave watchedAt deve ser uma data no formato dd/mm/aaaa.

      • Caso a data não respeite o formato dd/mm/aaaa retorne status 400, com o seguinte corpo:

        {
          "message": "O campo \"watchedAt\" deve ter o formato \"dd/mm/aaaa\""
        }
    • O campo rate é obrigatório.

      • Caso o campo não seja informado ou esteja vazio retorne status 400, com o seguinte corpo:

        {
          "message": "O campo \"rate\" é obrigatório"
        }
    • 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"
        }
  • 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
      }
    }

6 - Crie o endpoint PUT /talker/:id

Os seguintes pontos serão avaliados:
  • 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 chaves watchedAt e rate:

    • O campo talk é obrigatório.

      • Caso o campo não seja informado retorne status 400, com o seguinte corpo:

        {
          "message": "O campo \"talk\" é obrigatório"
        }
    • A chave watchedAt é obrigatória.

      • Caso a chave não seja informada ou esteja vazia retorne status 400, com o seguinte corpo:

        {
          "message": "O campo \"watchedAt\" é obrigatório"
        }
    • A chave watchedAt deve ser uma data no formato dd/mm/aaaa.

      • Caso a data não respeite o formato dd/mm/aaaa retorne status 400, com o seguinte corpo:

        {
          "message": "O campo \"watchedAt\" deve ter o formato \"dd/mm/aaaa\""
        }
    • O campo rate é obrigatório.

      • Caso o campo não seja informado ou esteja vazio retorne status 400, com o seguinte corpo:

        {
          "message": "O campo \"rate\" é obrigatório"
        }
    • 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"
        }
  • 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
      }
    }

7 - Crie o endpoint DELETE /talker/:id

Os seguintes pontos serão avaliados:
  • 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.

8 - Crie o endpoint GET /talker/search?q=searchTerm

Os seguintes pontos serão avaliados:
  • 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.

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

About

Node project using fs module to training simple CRUD operations

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages