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á:
- Desenvolver uma API de um
CRUD
(Create, Read, Update e Delete); - Desenvolver alguns endpoints que irão ler e escrever em um arquivo utilizando o módulo
fs
.
Clonando o projeto e criando um PR
- 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
- Crie uma branch a partir da branch
master
- Verifique que você está na branch
master
- Exemplo:
git branch
- Exemplo:
- Se não estiver, mude para a branch
master
- Exemplo:
git checkout master
- Exemplo:
- 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
- Você deve criar uma branch no seguinte formato:
- 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)
- Exemplo:
- 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)
- Exemplo:
- 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 )
- Exemplo:
- Adicione a sua branch com o novo
commit
ao repositório remoto
- Usando o exemplo anterior:
git push -u origin maria-account-control
- 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 bibliotecafs
.
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 arquivosrc/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:
git status
(para verificar o que está em vermelho - fora do stage - e o que está em verde - no stage)git add
(para adicionar arquivos ao stage do Git)git commit
(para criar um commit com os arquivos que estão no stage do Git)git push -u nome-da-branch
(para enviar o commit para o repositório remoto na primeira vez que fizer opush
de uma nova branch)git push
(para enviar o commit para o repositório remoto após o passo anterior)
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.
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
.
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:
[]
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"
}
Especificações:
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 destatus 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 destatus 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"
}
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 chavesphoneNumber
ecity
: -
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"
},
}
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
.
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.
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 umstatus 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