/trybe-project-blogs-api

Projeto de uma API seguindo arquitetura MSC, utilizando ORM sequelize para criação de um CRUD.

Primary LanguageJavaScript

Sobre

Seção: ORM e Autenticação

  • 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

Projeto: Blogs API

  • 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.

Tecnologias e ferramentas usadas 🛠

JavaScript Nodejs Docker Express Joi MySQL Sequelize JWToken Swagger

Desafios

  • 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.

Conclusão

  • 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

Requisitos

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 ✔️
📝 Todo list
  • - Criar aplicação com base nos requisitos da trybe. data
💻 Instruções do Projeto

Importante seguir a ordem apresentada a baixo, para o funcionamento.

⚠️ 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 comando docker 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:

  1. Usando algum API Cliente, conforme citado nas configurações mínimas.
  2. Acessando a documentação gerada pelo swagger localhost:3000/api-docs.
Endpoint /login

POST - localhost:3000/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 o email e password válidos. Usuário deve estar cadastrado para ser considerado válido os dados fornecidos no corpo.

Exemplo:

{
 "email": "lewishamilton@gmail.com",
 "password": "123456"
}

Status:

  • 200: Retorna um json com o token para acessar rotas que precisam de autenticação.
  • 400: Retorna um json com a mensagem Invalid fields(Quando o usuário não esta cadastrado ou com ausência de algum dos campos obrigatórios).
Endpoint /user

POST - localhost:3000/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.*
  • email Deve ser um email válido, contento caracteristicas de um email.*
  • password Deve ter no mínimo 6 caracteres.*
  • image Link de uma imagem.

Exemplo:

{
 "displayName": "Jonas Doe",
 "email": "jonas@doc.com",
 "password": "123456",
 "image": "None"
}

Status:

  • 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".

GET - localhost:3000/user

  • 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.

Exemplo:

localhost:3000/user

Status:

  • 200: Retorna um json com listagem de todos usuários.
  • 401: Retorna um json com a mensagem Token not found.

GET - localhost:3000/user/:id

  • 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.

Exemplo:

localhost:3000/user/1

Status:

  • 200: Retorna um json com detalhes do usuário.
  • 401: Retorna um json com a mensagem Token not found.
  • 404: Retorna um json com a mensagem User does not exist.

DELETE - localhost:3000/user/me

  • Rota responsável deletar o usuário logado.
  • Para deletar o usuário, é necessário realizar uma requisição DELETE.

Exemplo:

localhost:3000/user/me

Status:

  • 204: Retorna status 204(no content).
  • 401: Retorna um json com a mensagem Token not found.
Endpoint /categories

GET - localhost:3000/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.

Exemplo:

localhost:3000/categories

Status:

  • 200: Retorna um json com todas categorias.
  • 401: Retorna um json com a mensagem Token not found.

POST - localhost:3000/categories

  • 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.

Exemplo:

{
 "name": "Jogos"
}

Status:

  • 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 mensagem Token not found.
Endpoint /post

GET - localhost:3000/post/search

  • 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.

Exemplo:

localhost:3000/post/search?q="ano"

Status:

  • 200: Retorna um json com todas postagens ou as postagens com filtro aplicado.
  • 401: Retorna um json com a mensagem Token not found.

GET - localhost:3000/post/:id

  • 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.

Exemplo:

localhost:3000/post/1

Status:

  • 200: Retorna um json com os detalhes da postagem.
  • 401: Retorna um json com a mensagem Token not found.
  • 404: Retorna um json com a mensagem Post does not exist.

PUT - localhost:3000/post/:id

  • 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.

Exemplo:

localhost:3000/post/1

{
"title": "Como criar uma API usando Sequelize",
"content": "Acessando a página oficial do sequelize, temos acesso a documentação..."
}

Status:

  • 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 mensagem Token not found.
  • 404: Retorna um json com a mensagem Post does not exist.

DELETE - localhost:3000/post/:id

  • 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.

Exemplo:

localhost:3000/post/1

Status:

  • 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 mensagem Token not found.
  • 404: Retorna um json com a mensagem Post does not exist.

POST - localhost:3000/post

  • 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.

Exemplo:

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 ]
}

Status:

  • 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 mensagem Token not found.

GET - localhost:3000/post

  • 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.

Exemplo:

localhost:3000/post

Status:

  • 200: Retorna um json com todas postagens.
  • 401: Retorna um json com a mensagem Token not found.