Neste projeto, verificamos se você é capaz de:
- 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.
-
Com exceção do requisito 3, todos os outros requisitos deverão ser feitos utilizando o módulo
fs
. -
O arquivo
crush.json
será utilizado como base para fazer as requisições da API. As operações de leitura e escrita dos requisitos deve ser feito nesse arquivo usando os métodos da bibliotecafs
. -
Há um arquivo
index.js
no repositório. Não remova, nele, o seguinte trecho de código:
app.get('/', (_request, response) => {
response.status(SUCCESS).send();
});
Isso está configurado para o avaliador funcionar.
-
Ao realizar testes locais com
npm run test
, o servidor deverá ser iniciado comnpm run debug
para evitar possíveis erros. -
Após o teste local seu arquivo
crush.json
ficará vazio. Para que ele retorne à configuração inicial utilizenpm run restore
. -
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 terminalkillall node
isso finaliza todas as execuções do node.
- O endpoint deve retornar um array com todos os crushs cadastrados. Devendo retornar o
status 200
, com o seguinte corpo:
[
{
"name": "Madonna",
"age": 62,
"id": 1,
"date": { "datedAt": "23/10/2020", "rate": 5 }
},
{
"name": "Cyndi Lauper",
"age": 67,
"id": 2,
"date": { "datedAt": "23/10/2020", "rate": 5 }
},
{
"name": "Kendrick Lamar",
"age": 33,
"id": 3,
"date": { "datedAt": "23/10/2020", "rate": 5 }
},
{
"name": "Tom Holland",
"age": 24,
"id": 4,
"date": { "datedAt": "23/10/2020", "rate": 5 }
}
]
- Caso não exista nenhum crush cadastrado o endpoint deve retornar um array vazio e o
status 200
.
-
O endpoint deve retornar um crush baseado no id da rota. Devendo retornar o
status 200
ao fazer uma requisição/crush/1
, com o seguinte corpo:{ "name": "Madonna", "age": 62, "id": 1, "date": { "datedAt": "23/10/2020", "rate": 5 } }
-
Caso não seja encontrado um crush baseado no id da rota, o endpoint deve retornar o
status 404
com o seguinte corpo:{ "message": "Crush não encontrado" }
-
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á o retornar o token gerado, da seguinte forma:
{ "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": "A \"senha\" deve ter pelo menos 6 caracteres" }
-
-
O endpoint deve ser capaz de adicionar um novo crush ao seu arquivo;
-
O corpo da requisição deverá ter o seguinte formato:
{ "name": "Keanu Reeves", "age": 56, "date": { "datedAt": "22/10/2019", "rate": 5 } }
-
A requisição deve ter o token de autenticação no header
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 menos18 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 crush não tenha pelo menos 18 anos retorne
status 400
, com o seguinte corpo:{ "message": "O crush deve ser maior de idade" }
-
-
O campo
date
deverá ser um objeto com as seguintes chaves:-
A chave
datedAt
deve ser uma data no formatodd/mm/aaaa
.- Caso a data não respeito o formato
dd/mm/aaaa
retornestatus 400
, com o seguinte corpo:
{ "message": "O campo \"datedAt\" deve ter o formato \"dd/mm/aaaa\"" }
- Caso a data não respeito o formato
-
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
date
é obrigatório e nenhuma das chaves citadas anteriormente podem ser vazias.-
Caso o campo não seja informa, esteja vazio ou então alguma de suas chaves não tenham sido informadas retorne
status 400
, com o seguinte corpo:{ "message": "O campo \"date\" é obrigatório e \"datedAt\" e \"rate\" não podem ser vazios" }
-
-
-
O endpoint deve retornar o
status 201
e o crush que foi cadastrado, dá seguinte forma:{ "id": 1, "name": "Keanu Reeves", "age": 56, "date": { "datedAt": "22/10/2019", "rate": 5 } }
-
O endpoint deve ser capaz de editar um crush baseado no id da rota, sem alterar o id registrado.
-
O corpo da requisição deverá ter o seguinte formato:
{ "name": "Keanu Reeves", "age": 56, "date": { "datedAt": "22/10/2019", "rate": 5 } }
-
A requisição deve ter o token de autenticação no header
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 menos18 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 crush não tenha pelo menos 18 anos retorne
status 400
, com o seguinte corpo:{ "message": "O crush deve ser maior de idade" }
-
-
O campo
date
deverá ser um objeto com as seguintes chaves:-
A chave
datedAt
deve ser uma data no formatodd/mm/aaaa
.- Caso a data não respeito o formato
dd/mm/aaaa
retornestatus 400
, com o seguinte corpo:
{ "message": "O campo \"datedAt\" deve ter o formato \"dd/mm/aaaa\"" }
- Caso a data não respeito o formato
-
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
date
é obrigatório e nenhuma das chaves citadas anteriormente podem ser vazias.-
Caso o campo não seja informa, esteja vazio ou então alguma de suas chaves não tenham sido informadas retorne
status 400
, com o seguinte corpo:{ "message": "O campo \"date\" é obrigatório e \"datedAt\" e \"rate\" não podem ser vazios" }
-
-
-
O endpoint deve retornar o
status 200
e o crush que foi editado, dá seguinte forma:{ "id": 1, "name": "Keanu Reeves", "age": 56, "date": { "datedAt": "22/10/2019", "rate": 4 } }
-
A requisição deve ter o token de autenticação no header
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 um crush baseado no id da rota. Devendo retornar o
status 200
, com o seguinte corpo:{ "message": "Crush deletado com sucesso" }
-
O endpoint deve retornar um array de crushs que contenham em seu nome o termo pesquisado no queryParam da URL. Devendo retornar o
status 200
, com o seguinte corpo:/search?q=Ke
[ { id: 1, name: "Keanu Reeves", age: 56, date: { datedAt: "22/10/2019", rate: 5, }, } ];
-
A requisição deve ter o token de autenticação no header
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 devera retornar um array com todos os crushs cadastrados, assim como no endpoint GET/crush
, com umstatus 200
. -
Caso nenhum crush 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