Este desafio faz parte da lista de desafios que compõem o curso de NodeJS.
Visite à Rockseat para saber mais sobre o curso.
Sobre o desafio | Instalação e Execução do Projeto | Template da aplicação | Rotas da aplicação | Específicação dos testes | Licença
Nesse desafio foi-se mais a fundo com middlewares no Express. Dessa foi capaz de fixar mais ainda os conhecimentos obtidos até agora.
Para facilitar um pouco mais do conhecimento da regra de negócio, foi usada a aplicação do desafio anterior: uma aplicação para gerenciar tarefas (ou todos) mas com algumas mudanças.
Será permitida a criação de um user com name e username,bem como fazer o CRUD de todos:
- Criar um novo todo;
- Listar todos os todos;
- Alterar o
titleedeadlinede um todo existente; - Marcar um todo como feito;
- Excluir um todo;
Tudo isso para cada user em específico.
Além disso, dessa vez teremos um plano grátis onde o user só pode criar até dez todos e um plano Pro que irá permitir criar todos ilimitados, isso tudo usando middlewares para fazer as validações necessárias.
A seguir veremos com mais detalhes o que e como precisa ser feito 🚀
- Clone o repositório
https://github.com/code36u4r60/ignite-desafio-trabalhando-com-middlewares.git
ou
git@github.com:code36u4r60/ignite-desafio-trabalhando-com-middlewares.git
ou
gh repo clone code36u4r60/ignite-desafio-trabalhando-com-middlewares
- Entrar na pasta do projeto
cd ignite-desafio-trabalhando-com-middlewares
- Instale as dependências com o Yarn
yarn
- Executar o projeto
yarn dev
- Para correr os testes
yarn test
Deve aparecer uma mensagem parecida com esta:
yarn run v1.22.5
$ jest
PASS src/__tests__/middlewares/findUserById.spec.js
PASS src/__tests__/users.spec.js
PASS src/__tests__/todos.spec.js
PASS src/__tests__/middlewares/checksTodoExists.spec.js
PASS src/__tests__/middlewares/checksExistsUserAccount.spec.js
PASS src/__tests__/middlewares/checksCreateTodosUserAvailability.spec.js
Test Suites: 6 passed, 6 total
Tests: 22 passed, 22 total
Snapshots: 0 total
Time: 1.47 s, estimated 2 s
Ran all test suites.
Done in 2.03s.
Foi utilizado um modelo de template que possui o esqueleto do projeto.
O template pode ser encontrado na seguinte url: Acessar Template
Dica: Caso não saiba utilizar repositórios do Github como template, utilize o guia em nosso FAQ.
Agora navegue até a pasta criada e abra no Visual Studio Code, lembre-se de executar o comando yarn no seu terminal para instalar todas as dependências, e você terá algo parecido com isso:
Documentação no Notion sobre as rotas e testes: Documentação API e Testes
Com o template já clonado e o arquivo index.js aberto, você deve completar onde não possui código com o código para atingir os objetivos de cada teste.
Nesse desafio não será necessário alterar o código de nenhuma rota, apenas dos middlewares. Os testes iram também testar o funcionamento das rotas mas o resultado depende apenas da dos middlewares.
Aqui teremos uma breve descrição do que cada middleware deve fazer e na seção Especificação dos testes você verá com mais detalhes o que precisa ser feito para satisfazer cada teste.
Esse middleware é responsável por receber o username do user pelo header e validar se existe ou não um user com o username passado. Caso exista, o user deve ser repassado para o request e a função next deve ser chamada.
Esse middleware deve receber o user já dentro do request e chamar a função next apenas se esse user ainda estiver no plano grátis e ainda não possuir 10 todos cadastrados ou se ele já estiver com o plano Pro ativado.
Esse middleware deve receber o username de dentro do header e o id de um todo de dentro de request.params. Você deve validar o user, validar que o id seja um uuid e também validar que esse id pertence a um todo do user informado.
Com todas as validações passando, o todo encontrado deve ser passado para o request assim como o user encontrado também e a função next deve ser chamada.
Esse middleware possui um funcionamento semelhante ao middleware checksExistsUserAccount mas a busca pelo user deve ser feita através do id de um user passado por parâmetro na rota. Caso o user tenha sido encontrado, o mesmo deve ser repassado para dentro do request.user e a função next deve ser chamada.
Em cada teste, tem uma breve descrição no que sua aplicação deve cumprir para que o teste passe.
Caso você tenha dúvidas quanto ao que são os testes, e como interpretá-los, dê uma olhada em nosso FAQ
Para esse desafio, temos os seguintes testes:
-
Should be able to find user by username in header and pass it to request.user
Para que esse teste passe, você deve permitir que o middleware checksExistsUserAccount receba um username pelo header do request e caso um
usercom o mesmo username exista, ele deve ser colocado dentro derequest.usere, ao final, retorne a chamada da funçãonext.Atente-se bem para o nome da propriedade que armazenará o objeto
userno request. -
Should not be able to find a non existing user by username in header
Para que esse teste passe, no middleware checksExistsUserAccount você deve retornar uma resposta com status
404caso o username passado pelo header da requisição não pertença a nenhumuser. Você pode também retornar uma mensagem de erro mas isso é opcional. -
Should be able to let user create a new todo when is in free plan and have less than ten todos
Para que esse teste passe, você deve permitir que o middleware checksCreateTodosUserAvailability receba o objeto
user(considere sempre que o objeto existe) darequeste chame a funçãonextsomente no caso douserestar no plano grátis e ainda não possuir 10 todos cadastrados ou se ele já estiver com o plano Pro ativado.Você pode verificar se o
userpossui um plano Pro ou não a partir da propriedadeuser.pro. Caso sejatruesignifica que o plano Pro está em uso. -
Should not be able to let user create a new todo when is not Pro and already have ten todos
Para que esse teste passe, no middleware checksCreateTodosUserAvailability você deve retornar uma resposta com status
403caso ouserrecebido pela requisição esteja no plano grátis e já tenha 10 todos cadastrados. Você pode também retornar uma mensagem de erro mas isso é opcional. -
Should be able to let user create infinite new todos when is in Pro plan
Para que esse teste passe, você deve permitir que o middleware checksCreateTodosUserAvailability receba o objeto
user(considere sempre que o objeto existe) darequeste chame a funçãonextcaso ouserjá esteja com o plano Pro.Se você satisfez os dois testes anteriores antes desse, ele já deve passar também.
-
Should be able to put user and todo in request when both exits
Para que esse teste passe, o middleware checksTodoExists deve receber o
usernamede dentro do header e oidde um todo de dentro derequest.params. Você deve validar que ouserexista, validar que oidseja um uuid e também validar que esseidpertence a um todo douserinformado.Com todas as validações passando, o todo encontrado deve ser passado para o
requestassim como ouserencontrado também e a função next deve ser chamada.É importante que você coloque dentro de
request.userouserencontrado e dentro derequest.todoo todo encontrado. -
Should not be able to put user and todo in request when user does not exists
Para que esse teste passe, no middleware checksTodoExists você deve retornar uma resposta com status
404caso não exista umusercom ousernamepassado pelo header da requisição. -
Should not be able to put user and todo in request when todo id is not uuid
Para que esse teste passe, no middleware checksTodoExists você deve retornar uma resposta com status
400caso oiddo todo passado pelos parâmetros da requisição não seja um UUID válido (por exemplo1234abcd). -
Should not be able to put user and todo in request when todo does not exists
Para que esse teste passe, no middleware checksTodoExists você deve retornar uma resposta com status
404caso oiddo todo passado pelos parâmetros da requisição não pertença a nenhum todo douserencontrado. -
Should be able to find user by id route param and pass it to request.user
Para que esse teste passe, o middleware findUserById deve receber o
idde umuserde dentro dorequest.params. Você deve validar que ouserexista, repassar ele pararequest.usere retornar a chamada da função next. -
Should not be able to pass user to request.user when it does not exists
Para que esse teste passe, no middleware findUserById você deve retornar uma resposta com status
404caso oiddouser**passado pelos parâmetros da requisição não pertença a nenhumusercadastrado.
Todos os demais testes são os mesmos testes encontrados no desafio 01 com algumas (ou nenhuma) mudanças.
Vale reforçar que esse desafio é focado apenas em middlewares e você não precisa modificar o conteúdo das rotas para que os testes passem 💜
Esse projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Created with 💜 by Eduardo Queirós 👋
