Você vai desenvolver uma API de um CRUD (Create, Read, Update e Delete) de palestrantes. Você vai desenvolver alguns endpoints que irão ler e escrever em um arquivo, isso utilizando o módulo fs
.
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.
- Clone o repositório
git clone git@github.com:tryber/sd-011-project-talker-manager.git
.- Entre na pasta do repositório que você acabou de clonar:
cd sd-011-project-talker-manager
- Instale as dependências [Caso existam]
npm install
- 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 joaozinho-sd-011-project-talker-manager
- Você deve criar uma branch no seguinte formato:
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
, bastar ir em extensions e baixar o plugin ESLint
.
-
Com exceção do requisito 3, todos os outros requisitos deverão ser feitos utilizando o módulo
fs
. -
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 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(HTTP_OK_STATUS).send();
});
Isso está configurado para o avaliador funcionar.
-
Caso os testes falhem seu arquivo
talker.json
não será restaurado, para isso 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 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
.
-
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" }
-
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 endpoint deverá retornar um código de
-
O corpo da requisição deverá ter o seguinte formato:
{ "email": "email@email.com", "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@email.com\"" }
-
-
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" }
-
-
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.
-
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 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 formatodd/mm/aaaa
.- Caso a data não respeito o formato
dd/mm/aaaa
retornestatus 400
, com o seguinte corpo:
{ "message": "O campo \"watchedAt\" 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
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 } }
-
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.
-
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 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 formatodd/mm/aaaa
.- Caso a data não respeito o formato
dd/mm/aaaa
retornestatus 400
, com o seguinte corpo:
{ "message": "O campo \"watchedAt\" 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
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 } }
-
A requisição deve ter o token de autenticação nos headers.
-
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 200
, com o seguinte corpo:{ "message": "Pessoa palestrante deletada com sucesso" }
-
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.
-
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 umstatus 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