Para realizar o projeto, atente-se a cada passo descrito a seguir, e se tiver qualquer dúvida, nos envie por Slack! #vqv 🚀
Aqui você vai encontrar os detalhes de como estruturar o desenvolvimento do seu projeto a partir deste repositório, utilizando uma branch específica e um Pull Request para colocar seus códigos.
Ao iniciar este projeto, você concorda com as diretrizes do Código de Conduta e do Manual da Pessoa Estudante da Trybe.
🤷🏽♀️ Como entregar
Para entregar o seu projeto você deverá criar um Pull Request neste repositório.
Lembre-se que você pode consultar nosso conteúdo sobre Git & GitHub e nosso Blog - Git & GitHub sempre que precisar!
👨💻 O que deverá ser desenvolvido
Você irá construir uma aplicação de cadastro de talkers (palestrantes) 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) de palestrantes (talkers) e; - Desenvolver alguns endpoints que irão ler e escrever em um arquivo utilizando o módulo
fs
.
🗓 Data de Entrega
- Este projeto é individual
- São
3
dias de projeto - Data para entrega final do projeto:
29/06/2022 14:00
🐳 Rodando no Docker vs Localmente
Rode o serviço
node
com o comandodocker-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.
Instale as dependências [Caso existam] com
npm install
👀 De olho nas dicas:
- Para rodar o projeto desta forma, obrigatoriamente você deve ter o
node
instalado em seu computador. - O avaliador espera que a versão do
node
utilizada seja a 16.
‼️ Antes de começar a desenvolver
- Clone o repositório
git clone git@github.com:tryber/sd-019-c-project-talker-manager.git
.- Entre na pasta do repositório que você acabou de clonar:
cd sd-019-c-project-talker-manager
- 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-019-c-project-talker-manager
- Você deve criar uma branch no seguinte formato:
- 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 joaozinho 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 joaozinho/README.md em verde)
- Exemplo:
- Faça o
commit
inicial- Exemplo:
git commit -m 'iniciando o projeto x'
(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 joaozinho-sd-019-c-project-talker-manager
- 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"
- Não se preocupe em preencher mais nada por enquanto!
- Volte até a página de Pull Requests do repositório e confira que o seu Pull Request está criado
⌨️ Durante o desenvolvimento
-
Faça
commits
das alterações que você fizer no código regularmente -
Lembre-se de sempre após um (ou alguns)
commits
atualizar o repositório remoto -
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)
🤝 Depois de terminar o desenvolvimento (opcional)
Para sinalizar que o seu projeto está pronto para o "Code Review" de seus colegas, faça o seguinte:
-
Vá até a página DO SEU Pull Request, adicione a label de "code-review" e marque seus colegas:
-
No menu à direita, clique no link "Labels" e escolha a label code-review;
-
No menu à direita, clique no link "Assignees" e escolha o seu usuário;
-
No menu à direita, clique no link "Reviewers" e digite
students
, selecione o timetryber/students-sd-019-c
.
-
Caso tenha alguma dúvida, aqui tem um video explicativo.
🕵🏿 Revisando um pull request
Use o conteúdo sobre Code Review para te ajudar a revisar os Pull Requests.
🎛 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
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 login, basta digitar npm test login
.
🗣 Nos dê feedbacks sobre o projeto!
Ao finalizar e submeter o projeto, não se esqueça de avaliar sua experiência preenchendo o formulário. Leva menos de 3 minutos!
FORMULÁRIO DE AVALIAÇÃO DE PROJETO
🗂 Compartilhe seu portfólio!
Você sabia que o LinkedIn é a principal rede social profissional e compartilhar o seu aprendizado lá é muito importante para quem deseja construir uma carreira de sucesso? Compartilhe esse projeto no seu LinkedIn, marque o perfil da Trybe (@trybe) e mostre para a sua rede toda a sua evolução.
⚠️ Observações importantes!
-
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. 😅
-
Você pode usar o comando
npm run restore
para restaurar o arquivotalker.json
para seu estado inicial. -
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 -9 node
isso finalizá todas as execuções do node.
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:
[]
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"
}
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@email.com",
"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.
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 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 6 caracteres"
}
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 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 chaveswatchedAt
erate
: -
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 formatodd/mm/aaaa
.-
Caso a data não respeite o formato
dd/mm/aaaa
retornestatus 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 } }
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 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 chaveswatchedAt
erate
:-
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 formatodd/mm/aaaa
.-
Caso a data não respeite o formato
dd/mm/aaaa
retornestatus 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 } }
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.
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 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