Projeto desenvolvido no módulo de Desenvolvimento Back-end da Trybe, no bloco de Autenticação e Upload de Arquivos, onde estudamos JWT (Json Web Token), Upload de arquivos com multer
e testamos APIs com Testes de Integração.
Foi desenvolvido um app utilizando a arquitetura MSC, onde é possível fazer o cadastro e login de pessoas usuárias, onde apenas essas pessoas poderão acessar, modificar e deletar as receitas que foram cadastradas.
Com o desenvolvimento deste projeto, foram colocadas em prática as seguintes habilidades:
- Entender o que há por dentro de um token de autenticação;
- Gerar tokens a partir de informações como login e senha;
- Autenticar rotas do Express, usando o token JWT;
- Fazer upload de arquivos em APIs REST;
- Salvar arquivos no servidor através de uma API REST;
- Consultar arquivos do servidor através de uma api REST.
- Realizar testes de integração
API URL: https://rafaelgeronimo-cookmaster.herokuapp.com/
Utilize o Insomnia, Postman ou outro de sua preferência para realizar as requisições na rotas pelos métodos disponíveis.
Métodos e rotas:
Método | Rota | Descrição |
---|---|---|
POST |
/users |
Endpoint para cadastro de usuários |
POST |
/login |
Endpoint para login de usuário cadastrado |
POST |
/recipes |
Realiza o cadastro de uma nova receita |
GET |
/recipes |
Retorna todas as receitas cadastradas |
GET |
/recipes/:id |
Retorna dados de receita específica pelo seu ID |
PUT |
recipes/:id |
Permite editar uma receita já cadastrada |
DELETE |
recipes/:id |
Endpoint para excluir receita específica pelo seu ID |
PUT |
recipes/:id/image |
Endpoint para adicionar uma imagem a uma receita |
GET |
recipes/:id/*.jpeg |
Permite acessar a imagem de uma receita |
- Realize o clone do projeto com o comando:
git clone git@github.com:rafaelgeronimo/trybe-project-cookmaster.git
- Instale o projeto com
npm
ouyarn
:
cd trybe-project-cookmaster
## npm
npm install
## yarn
yarn install
- Configure as variáveis de ambiente:
- Para que essa api funcione corretamente no seu ambiente local, será necessário criar o arquivo
.env
na raíz do projeto, contendo os dados de acesso ao banco de dadosMongoDB
. - Também é possível escolher a porta em que a aplicação irá rodar. Se não for configurada, o padrão será a porta 3000.
- Para que essa api funcione corretamente no seu ambiente local, será necessário criar o arquivo
MONGO_DB_URL=mongodb://localhost:27017/Cookmaster
PORT=3000
- Após a instalação das dependências e configuração das variáveis de ambiente, é possível executar com o comando para iniciar a API:
## npm
npm start
## yarn
yarn start
1 - Crie um endpoint para o cadastro de usuários
- A rota deve ser (/users).
- No banco um usuário precisa ter os campos Email, Senha, Nome e Role.
- Para criar um usuário através da API, todos os campos são obrigatórios, com exceção do Role.
- O campo Email deve ser único.
- Usuários criados através desse endpoint devem ter seu campo Role com o atributo _user_, ou seja, devem ser usuários comuns, e não admins.
-
O body da requisição deve conter o seguinte formato:
{ "name": "string", "email": "string", "password": "string" }
- Não use bcrypt ou outra biblioteca para encriptar a senha, para que o avaliador funcione corretamente.
2 - Crie um endpoint para o login de usuários
- A rota deve ser (/login).
- A rota deve receber os campos Email e Senha e esses campos devem ser validados no banco de dados.
- Na configuração do JWT **não use variáveis de ambientes** para não ter conflito com o avaliador.
- Um token JWT deve ser gerado e retornado caso haja sucesso no login. No seu payload deve estar presente o id, email e role do usuário.
-
O body da requisição deve conter o seguinte formato:
{ "email": "string", "password": "string" }
3 - Crie um endpoint para o cadastro de receitas
- A rota deve ser (/recipes).
- A receita só pode ser criada caso o usuário esteja logado e o token JWT validado.
- No banco, a receita deve ter os campos Nome, Ingredientes, Modo de preparo, URL da imagem e Id do Autor.
-
Nome, ingredientes e modo de preparo devem ser recebidos no corpo da requisição, com o seguinte formato:
{ "name": "string", "ingredients": "string", "preparation": "string" }
- O campo dos ingredientes pode ser um campo de texto aberto.
- O campo ID do autor, deve ser preenchido automaticamente com o ID do usuário logado, que deve ser extraído do token JWT.
- A URL da imagem será preenchida através de outro endpoint
4 - Crie um endpoint para a listagem de receitas
- A rota deve ser (/recipes).
- A rota pode ser acessada por usuários logados ou não
5 - Crie um endpoint para visualizar uma receita específica
- A rota deve ser (/recipes/:id).
- A rota pode ser acessada por usuários logados ou não
6 - Crie uma query em mongo que insira uma pessoa usuária com permissões de admin
-
Crie um arquivo seed.js na raiz do projeto com uma query do Mongo DB capaz de inserir um usuário na coleção _users_ com os seguintes valores:
{ name: 'admin', email: 'root@email.com', password: 'admin', role: 'admin' }
Obs.: Esse usuário tem o poder de criar, deletar, atualizar ou remover qualquer receita, independente de quem a cadastrou. Isso será solicitado ao longo dos próximos requisitos.
7 - Crie um endpoint para a edição de uma receita
- A rota deve ser (/recipes/:id).
- A receita só pode ser atualizada caso o usuário esteja logado e o token JWT validado.
- A receita só pode ser atualizada caso pertença ao usuário logado, ou caso esse usuário seja um admin.
-
O corpo da requisição deve receber o seguinte formato:
{ "name": "string", "ingredients": "string", "preparation": "string" }
8 - Crie um endpoint para a exclusão de uma receita
- A rota deve ser (/recipes/:id).
- A receita só pode ser excluída caso o usuário esteja logado e o token JWT validado.
- A receita só pode ser excluída caso pertença ao usuário logado, ou caso o usuário logado seja um admin.
9 - Crie um endpoint para a adição de uma imagem a uma receita
- A rota deve ser (/recipes/:id/image/).
- A imagem deve ser lida do campo image.
- O endpoint deve aceitar requisições no formato multipart/form-data.
- A receita só pode ser atualizada caso o usuário esteja logado e o token JWT validado.
- A receita só pode ser atualizada caso pertença ao usuário logado ou caso o usuário logado seja admin.
- O upload da imagem deverá ser feito utilizando o Multer.
- O nome do arquivo deve ser o ID da receita, e sua extensão .jpeg.
- A URL completa para acessar a imagem através da API deve ser gravada no banco de dados, junto com os dados da receita.
10 - Crie um endpoint para acessar a imagem de uma receita
- As imagens devem estar disponíveis através da rota /images/.jpeg na API.
11 - Crie testes de integração que cubram no mínimo 30% dos arquivos em src, com um mínimo de 50 linhas cobertas
- Os testes de integração devem ser criados na pasta ./src/integration-tests, essa pasta **não pode ser renomeada ou removida**;
- O arquivo change.me.test.js pode ser alterado, renomeado ou removido;
- Os testes devem ser criados usando o instrumental e boas práticas apresentado nos conteúdos de testes do course;
- Para rodar os testes, utilize o comando npm run dev:test;
- Para visualizar a cobertura, utilize o comando npm run dev:test:coverage;
12 - Crie um endpoint para cadastro de pessoas administradoras
- A rota deve ser (/users/admin).
- Só será possível adicionar um admin caso esta ação esteja sendo feita por outro admin, portanto, deve ser validado se há um admin logado.
- Por padrão, as requisições pra esse endpoint devem adicionar um usuário com a role _admin_.
-
O corpo da requisição deve ter o seguinte formato:
{ "name": "string", "email": "string", "password": "string" }
13 - Crie testes de integração que cubram no mínimo 60% dos arquivos em src, com um mínimo de 100 linhas cobertas
- Os testes de integração devem ser criados na pasta ./src/integration-tests, essa pasta **não pode ser renomeada ou removida**;
- O arquivo change.me.test.js pode ser alterado, renomeado ou removido;
- Os testes devem ser criados usando o instrumental e boas práticas apresentado nos conteúdos de testes do course;
- Para rodar os testes, utilize o comando npm run dev:test;
- Para visualizar a cobertura, utilize o comando npm run dev:test:coverage;
14 - Crie testes de integração que cubram no mínimo 90% dos arquivos em src, com um mínimo de 150 linhas cobertas
- Os testes de integração devem ser criados na pasta ./src/integration-tests, essa pasta **não pode ser renomeada ou removida**;
- O arquivo change.me.test.js pode ser alterado, renomeado ou removido;
- Os testes devem ser criados usando o instrumental e boas práticas apresentado nos conteúdos de testes do course;
- Para rodar os testes, utilize o comando npm run dev:test;
- Para visualizar a cobertura, utilize o comando npm run dev:test:coverage;