- Introdução a ORM(Object Relational Mapping), onde é possível alterar, realizar consultas, inserir e extrair dados do banco com foco na biblioteca do Sequelize.
- Importância sobre autenticação usando JSON Web Token(JWT).
Imagens da documentação swagger
- Desenvolvido uma API e um banco de dados para simular um blog. Usando a ORM sequelize para fazer o CRUD das postagem e autenticação usando JWT.
- Configuração inicial do sequelize definindo todos os arquivos iniciais necessários, começando pelas migrations que criam as tabelas no banco de dados, seguindo dos models, usados quando vamos usar alguma funcionalidade do sequelize e os seeders(já criados pela trybe), para "alimentar" o banco com informação e a association que define a relação entre uma tabela e outra, para facilitar a coleta mesclada de informações entre tabelas quando necessário.
- Usando JWT para autenticar o usuário que está acessando aquela determinada rota por meio de middlewares, checando se o usuário é valido e tem permissão para aquele dado.
- O uso de ORM é extenso no início da aplicação por falta de experiência com a ferramenta, e dependendo da dimensão da aplicação cai aquela pergunta, se realmente era necessário o uso dela, mas é algo prático na hora de apagar e reiniciar as informações do banco e consultá-las, talvez não da forma mais performática, e caso seja necessário a mudança de um banco, é ainda mais prático e rápido com alterações em seu documento de configurações, pode-se mudar de mysql para postgres instantaneamente sem nenhum trabalho adicional.
🗞️ Requisitos solicitados durante o desenvolvimento do projeto
Nome | Avaliação |
---|---|
1 - Crie migrations para as entidades User, Categories, BlogPosts e PostCategories | ✔️ |
2 - Crie o modelo 'User' em 'src/database/models/user.js' com as propriedades corretas | ✔️ |
3 - Sua aplicação deve ter o endpoint POST /login |
✔️ |
4 - Sua aplicação deve ter o endpoint POST /user |
✔️ |
5 - Sua aplicação deve ter o endpoint GET /user |
✔️ |
6 - Sua aplicação deve ter o endpoint GET /user/:id |
✔️ |
7 - Crie o modelo 'Category' em 'src/database/models/category.js' com as propriedades corretas | ✔️ |
8 - Sua aplicação deve ter o endpoint POST /categories |
✔️ |
9 - Sua aplicação deve ter o endpoint GET /categories |
✔️ |
10 - Crie o modelo 'BlogPost' em 'src/database/models/blogPost.js' com as propriedades e associações corretas | ✔️ |
11 - Crie o modelo 'PostCategory' em 'src/database/models/postCategory.js' com as propriedades e associações corretas | ✔️ |
12 - Sua aplicação deve ter o endpoint POST /post |
✔️ |
13 - Sua aplicação deve ter o endpoint GET /post |
✔️ |
14 - Sua aplicação deve ter o endpoint GET post/:id |
✔️ |
15 - Sua aplicação deve ter o endpoint PUT /post/:id |
✔️ |
16 - Sua aplicação deve ter o endpoint DELETE post/:id |
✔️ |
17 - Sua aplicação deve ter o endpoint DELETE /user/me |
✔️ |
18 - Sua aplicação deve ter o endpoint GET post/search?q=:searchTerm |
✔️ |
💻 Instruções do Projeto
⚠️ Configurações mínimas para execução do projeto
- Sistema Operacional Distribuição Unix
- Node versão >= 16
- Docker
- Docker-compose versão >=1.29.2
- API Client (Thunder Client, Insomnia, POSTMAN, ou algum outro de sua preferência)
⚙️ Variáveis de ambiente
Deve-se remover a extensão
sample
do arquivo .env na raiz do projeto com o seguinte conteúdo:#### SERVER VARS NODE_ENV=development API_PORT=3000 #### DATABASE VARS MYSQL_HOST=localhost MYSQL_PORT=3306 MYSQL_DB_NAME=blogs-api MYSQL_USER=root MYSQL_PASSWORD=password #### SECRECT VARS JWT_SECRET=suaSenhaSecreta
⚠️ Inicie o docker-compose
Após clonar o respositório para iniciar o docker compose, você deve dentro da pasta raiz do projeto usar o comando:
docker-compose up -d
Verifique os containers, usando o comandodocker ps
no terminal. Deve aparecer dois containers com o nome de blogs_api e blogs_api_db.
🗂 Acessando as Rotas
Para acessar e testar as rotas:
- Usando algum API Cliente, conforme citado nas configurações mínimas.
- Acessando a documentação gerada pelo swagger
localhost:3000/api-docs
.
Endpoint /login
- Rota responsável autenticar usuário e gerar um token de acesso.
- Para autenticar o usuário, é necessário realizar uma requisição POST para URL:
localhost:3000/login
contendo um corpo json com opassword
válidos. Usuário deve estar cadastrado para ser considerado válido os dados fornecidos no corpo.{ "email": "lewishamilton@gmail.com", "password": "123456" }
200
: Retorna um json com o token para acessar rotas que precisam de autenticação.400
: Retorna um json com a mensagemInvalid fields
(Quando o usuário não esta cadastrado ou com ausência de algum dos campos obrigatórios).
Endpoint /user
- Rota responsável cadastrar um novo usuário e gerar um token.
- Para cadastrar o usuário, é necessário realizar uma requisição POST para URL:
localhost:3000/user
contendo um corpo json válido e os campos(campos com * são obrigatórios):displayName
Deve ter no mínimo 8 caracteres.*password
Deve ter no mínimo 6 caracteres.*image
Link de uma imagem.{ "displayName": "Jonas Doe", "email": "jonas@doc.com", "password": "123456", "image": "None" }
201
: Retorna um json com o token para acessar rotas que precisam de autenticação.400
: Retorna um json com uma mensagem com o campo ausênte ou fora do padrão na requisição.409
: Retorna um json com uma mensagem "User already registered".
- Rota responsável mostrar todos usuários cadastrados.
- É necessário adicionar ao headers o token para executar esta requisição.
- Para buscar, é necessário realizar uma requisição GET.
localhost:3000/user
200
: Retorna um json com listagem de todos usuários.401
: Retorna um json com a mensagemToken not found
.
- Rota responsável por mostrar detalhes de um usuário por seu id.
- Para buscar o usuário, é necessário realizar uma requisição GET usando o parametro com o ID.
localhost:3000/user/1
200
: Retorna um json com detalhes do usuário.401
: Retorna um json com a mensagemToken not found
.404
: Retorna um json com a mensagemUser does not exist
.
- Rota responsável deletar o usuário logado.
- Para deletar o usuário, é necessário realizar uma requisição DELETE.
localhost:3000/user/me
204
: Retorna status 204(no content).401
: Retorna um json com a mensagemToken not found
.
Endpoint /categories
- Rota responsável por mostrar todas categorias cadastradas.
- É necessário adicionar ao headers o token para executar esta requisição.
- Para buscar as categorias, é necessário realizar uma requisição GET.
localhost:3000/categories
200
: Retorna um json com todas categorias.401
: Retorna um json com a mensagemToken not found
.
- Rota responsável cadastrar uma categoria.
- É necessário adicionar ao headers o token para executar esta requisição.
- Para cadastrar uma nova categoria, é necessário realizar uma requisição POST para URL:
localhost:3000/categories
contendo um corpo json válido com o campo:name
Deve ser uma string sem restrições.{ "name": "Jogos" }
201
: Retorna um json com os dados da nova categoria.400
: Retorna um json com uma mensagem com o campo ausênte na requisição.401
: Retorna um json com a mensagemToken not found
.
Endpoint /post
- Rota responsável buscar e filtrar postagens.
- É necessário adicionar ao headers o token para executar esta requisição.
- Para buscar a postagem, é necessário realizar uma requisição GET com um parametros
q
, contento a filtragem que deseja, seja em título ou conteudo da postagem.localhost:3000/post/search?q="ano"
200
: Retorna um json com todas postagens ou as postagens com filtro aplicado.401
: Retorna um json com a mensagemToken not found
.
- Rota responsável buscar detalhes de uma postagem por seu id.
- É necessário adicionar ao headers o token para executar esta requisição.
- Para buscar a postagem pelo id, é necessário realizar uma requisição GET com um parametros
id
.localhost:3000/post/1
200
: Retorna um json com os detalhes da postagem.401
: Retorna um json com a mensagemToken not found
.404
: Retorna um json com a mensagemPost does not exist
.
- Rota responsável atualizar uma postagem.
- É necessário adicionar ao headers o token para executar esta requisição.
- Para atualizar uma postagem, é necessário realizar uma requisição PUT para URL:
localhost:3000/post/:id
contendo um corpo json válido com os campos:title
Deve conter string sem restrições. -content
Deve conter string sem restrições.localhost:3000/post/1
{ "title": "Como criar uma API usando Sequelize", "content": "Acessando a página oficial do sequelize, temos acesso a documentação..." }
201
: Retorna um json com as atualizações realizadas.400
: Retorna um json com uma mensagem com o campo ausênte na requisição.401
: Retorna um json com a mensagemToken not found
.404
: Retorna um json com a mensagemPost does not exist
.
- Rota responsável deletar uma postagem por seu id.
- É necessário adicionar ao headers o token para executar esta requisição.
- Para deletar a postagem pelo id, é necessário realizar uma requisição DELETE com um parametros
id
.localhost:3000/post/1
200
: Retorna status 204(no content).400
: Retorna um json com uma mensagem com o campo ausênte na requisição.401
: Retorna um json com a mensagemToken not found
.404
: Retorna um json com a mensagemPost does not exist
.
- Rota responsável criar uma postagem.
- É necessário adicionar ao headers o token para executar esta requisição.
- Para criar uma postagem, é necessário realizar uma requisição POST com os campos:
title
Deve conter uma string sem restrições.content
Deve conter uma string sem restrições.categoryIds
Deve conter um array de números, referentes as categorias existentes.localhost:3000/post
{ "title": "Como criar uma API usando Sequelize", "content": "Acessando a página oficial do sequelize, temos acesso a documentação..." "categoryIds": [ 1 ] }
201
: Retorna um json os dados da nova postagem.400
: Retorna um json com uma mensagem com o campo ausênte ou fora do padrão obrigatório na requisição.401
: Retorna um json com a mensagemToken not found
.
- Rota responsável por mostrar todas postagens cadastradas.
- É necessário adicionar ao headers o token para executar esta requisição.
- Para buscar as postagens, é necessário realizar uma requisição GET.
localhost:3000/post
200
: Retorna um json com todas postagens.401
: Retorna um json com a mensagemToken not found
.