Repositório do projeto account-control!

Aplicação

Uma aplicação de cadastro usuarios em que será possível cadastrar, visualizar, pesquisar, editar e excluir informações. Para isso você deverá:

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

Orientações

Clonando o projeto e criando um PR
  1. Clone o repositório
  • git clone git@github.com:UnifelDesenvolvimentoWeb/account-control.git.
  • Entre na pasta do repositório que você acabou de clonar:
    • account-control
  1. Crie uma branch a partir da branch master
  • Verifique que você está na branch master
    • Exemplo: git branch
  • Se não estiver, mude para a branch master
    • Exemplo: git checkout master
  • Agora crie uma branch à qual você vai submeter os commits do seu projeto
    • Você deve criar uma branch no seguinte formato: nome-de-usuario-nome-do-projeto
    • Exemplo: git checkout -b maria-account-control
  1. Faça alguma alteração ou algum requisito e depois adicione as mudanças ao stage do Git e faça um commit
  • Verifique que as mudanças ainda não estão no stage
    • Exemplo: git status (deve aparecer listada a pasta em vermelho)
  • Adicione o novo arquivo ao stage do Git
    • Exemplo:
      • git add . (adicionando todas as mudanças - que estavam em vermelho - ao stage do Git)
      • git status (deve aparecer listado o arquivo que foi adicionado em verde)
  • Faça o commit inicial
    • Exemplo:
      • git commit -m 'iniciando o projeto account-control' (fazendo o primeiro commit)
      • git status (deve aparecer uma mensagem tipo nothing to commit )
  1. Adicione a sua branch com o novo commit ao repositório remoto
  • Usando o exemplo anterior: git push -u origin maria-account-control
  1. Crie um novo Pull Request (PR)
  • Vá até a página de Pull Requests do repositório no GitHub
  • Clique no botão verde "New pull request"
  • Clique na caixa de seleção "Compare" e escolha a sua branch com atenção
  • Clique no botão verde "Create pull request"
  • Adicione uma descrição para o Pull Request e clique no botão verde "Create pull request"
  • Volte até a página de Pull Requests do repositório e confira que o seu Pull Request está criado
Informações Adicionais

Instale as dependências com npm install

O arquivo src/users.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.

Há um arquivo src/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();
    });

Você pode usar o comando npm run restore para restaurar o arquivo src/users.json para seu estado inicial.

Durante o desenvolvimento
  • Faça commits das alterações que você fizer no código regularmente

  • Os comandos que você utilizará com mais frequência são:

    1. git status (para verificar o que está em vermelho - fora do stage - e o que está em verde - no stage)
    2. git add (para adicionar arquivos ao stage do Git)
    3. git commit (para criar um commit com os arquivos que estão no stage do Git)
    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)
    5. git push (para enviar o commit para o repositório remoto após o passo anterior)
Testes

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 01-getAll, basta digitar npm test 01.

Requisitos


1 - Crie o endpoint GET /users

Especificações:
A requisição deve retornar o status 200 e um array com todas usuários cadastradas. Exemplo:
[
  {
    "id": 1,
    "name": "Cristina Oliveira",
    "email": "cristina.oliveira@example.com",
    "password": "12345678",
    "age": 25,
    "info": {
      "city": "Salvador",
      "phoneNumber": "(71) 73265-0285"
    },
    "accessDate": {
      "registrationDate": "2023-08-15T11:20:31.665Z",
      "lastAccess": "2024-04-18T02:15:25.665Z"
    }
  },
  {
    "id": 2,
    "name": "Amanda Ferraz",
    "email": "amanda.ferraz@example.com",
    "password": "12345678",
    "age": 31,
    "info": {
      "city": "Belo Horizonte",
      "phoneNumber": "(31) 7256-5521"
    },
    "accessDate": {
      "registrationDate": "2024-01-28T16:19:20.665Z",
      "lastAccess": "2024-04-21T18:21:15.665Z"
    }
  },
  //...
]
Caso não exista nenhum usuário cadastrado a requisição deve retornar o status 200 e um array vazio. Exemplo:
[]

2 - Crie o endpoint GET /users/:id

Especificações:
A requisição deve retornar o status 200 e um usuário com base no id da rota. Por exemplo, ao fazer uma requisição /users/5, a resposta deve ser:
 {
  "id": 5,
  "name": "João Carlos",
  "email": "joão.carlos@example.com",
  "password": "12345678",
  "age": 38,
  "info": {
    "city": "Salvador",
    "phoneNumber": "(71) 7548-9655"
  },
  "accessDate": {
    "registrationDate": "2024-01-12T12:50:36.665Z",
    "lastAccess": "2024-04-21T12:20:41.665Z"
  }
}
Caso não seja encontrado um usuário com base no id da rota, a requisição deve retornar o status 404 com o seguinte corpo:
{
  "message": "Usuário não encontrado"
}

3 - Crie o endpoint POST /login e suas validações.

Especificações:
O endpoint deverá receber no corpo da requisição os campos `email` e `password`.

Deverá ocorrer uma validação se a senha e email estão corretos de acordo com os usuários já cadastrados.

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.

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 8 caracteres.
O corpo da requisição deverá ter seguinte formato:
{
  "email": "email@email.com",
  "password": "12345678"
}
Validações:
  • 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@email.com\""
}
  • 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 8 caracteres"
}
  • O endpoint deverá retornar um código de status 401 com a mensagem "Email ou senha incorretos" caso o usuário não esteja nos registros ou infome email ou senha incorretos, retornando o seguinte corpo:
{
  "message": "Email ou senha incorretos"
}
  • O endpoint deverá retornar um código de status 200 com a mensagem "Login realizado com sucesso" e o seguinte corpo:
{
  "message": "Login realizado com sucesso"
}

4 - Crie o endpoint POST /users

Especificações:
O endpoint deve ser capaz de adicionar um novo usuário ao seu arquivo:
  • O corpo da requisição deverá ter o seguinte formato:

    {
      "name": "Josefa Bezerra",
      "email": "josefa.bezerra@example.com",
      "password": "12345678",
      "age": 62,
      "info": {
        "city": "Paulo Afonso",
        "phoneNumber": "(75) 7185-8565"
      },
    }
Validações:
  • 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 usuários 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 o usuário não tenha pelo menos 18 anos retorne status 400, com o seguinte corpo:

      {
        "message": "O usuário deve ser maior de idade"
      }
    • O campo info deverá ser um objeto com as chaves phoneNumber e city:

    • O campo info é obrigatório.

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

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

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

        {
          "message": "O campo \"phoneNumber\" é obrigatório"
        }
    • O campo city é obrigatório.

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

        {
          "message": "O campo \"city\" é obrigatório"
        }
  • Caso esteja tudo certo, retorne o `status 201` e o usuário cadastrado:
  • O endpoint deve retornar o status 201 e o usuário que foi cadastrado, Ex:

    {
      "id": 8,
      "name": "Josefa Bezerra",
      "email": "josefa.bezerra@example.com",
      "password": "12345678",
      "age": 62,
      "info": {
        "city": "Paulo Afonso",
        "phoneNumber": "(75) 7185-8565"
      },
    }
  • 5 - Crie o endpoint PUT /users/:id

    Especificações:
    O endpoint deve ser capaz de editar um usuário com base no id da rota, sem alterar o id registrado.:
    • O corpo da requisição deverá ter o seguinte formato:

      {
        "name": "Rebeca Maria",
        "email": "rebeca.maria@example.com",
        "password": "12345678",
        "age": 34,
        "info": {
          "city": "Salvador",
          "phoneNumber": "(75) 7185-8565"
        },
      }
    Validações:
  • 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 usuários 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 o usuário não tenha pelo menos 18 anos retorne status 400, com o seguinte corpo:

      {
        "message": "O usuário deve ser maior de idade"
      }
  • O campo info deverá ser um objeto com as chaves phoneNumber e city:

    • O campo info é obrigatório.

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

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

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

        {
          "message": "O campo \"phoneNumber\" é obrigatório"
        }
    • O campo city é obrigatório.

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

        {
          "message": "O campo \"city\" é obrigatório"
        }
  • Caso esteja tudo certo, retorne o usuário editada:
    • O endpoint deve retornar o status 200 e o usuário que foi editado, Ex:

      {
        "id": 1,
        "name": "Rebeca Maria",
        "email": "rebeca.maria@example.com",
        "password": "12345678",
        "age": 34,
        "info": {
          "city": "Salvador",
          "phoneNumber": "(75) 7185-8565"
        },
      }
    • Os dados atualizados por meio do endpoint deve ser persistidos no arquivo users.json.

    6 - Crie o endpoint DELETE /users/:id

    Especificações:
    • O endpoint deve deletar um usuário com base no id da rota. Devendo retornar o status 204, sem conteúdo na resposta.

    7 - Crie o endpoint GET /users/search?q=searchTerm

    Especificações:
    • O endpoint deve retornar um array de usuários que contenham em seu nome o termo pesquisado no queryParam da URL. Devendo retornar o status 200, com o seguinte corpo:

      /search?q=Jo
      
      [
        {
          "id": 5,
          "name": "João Carlos",
          "email": "joão.carlos@example.com",
          "password": "12345678",
          "age": 38,
          "info": {
            "city": "Salvador",
            "phoneNumber": "(71) 7548-9655"
          },
          "accessDate": {
            "registrationDate": "2024-01-12T12:50:36.665Z",
            "lastAccess": "2024-04-21T12:20:41.665Z"
          }
        }
      ]
    • Caso searchTerm não seja informado ou esteja vazio, o endpoint deverá retornar um array com todos os usuários cadastrados, assim como no endpoint GET /users, com um status 200.

    • Caso nenhum usuário 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