Skip to content

Este projeto é uma de API seguindo princípios REST para um blog, onde o usuário pode criar, ler, atualizar e deletar posts, fazer login, criar cadastro, categorias e consulta-los.

Notifications You must be signed in to change notification settings

vitorbss12/API-for-Blogs-with-Express-Sequelize-MySQL

Repository files navigation

Blogs Api - Node.js, Express, JWT, Sequelize e MySQL

Quality Gate Status Reliability Rating Security Rating Maintainability Rating

Este projeto é uma de API seguindo princípios REST para um blog, onde o usuário pode criar, ler, atualizar e deletar posts, fazer login, criar cadastro, categorias e consulta-los. O projeto foi desenvolvido em Node.js, Express, JWT, Sequelize, MySQL, além de outras ferramentas. Consiste em um CRUD de postagens com arquitetura MSC (Model, Service, Controller) e rotas bem definidas. O projeto foi desenvolvido em ambiente de desenvolvimento utilizando containers Docker, onde o banco de dados MySQL é criado e populado utilizando Sequelize.

Conteúdo

Arquitetura

Arquitetura de Camadas MSC

O projeto possui arquitetura de camadas MSC (Model, Service, Controller), onde cada camada é responsável por uma única funcionalidade.

Estrutura do Diretório

src
  ├── api.js            definições de middlewares e rotas da API
  ├── server.js         inicialização da API
  ├── /controllers      camada de controller - requisição do cliente para a API
  ├── /database         conexão com o banco de dados
    ├── /config         config sequelize
    ├── /migrations     migrations do banco de dados
    ├── /models         camada de model - conexão com o banco de dados
    ├── /seeders        população do banco de dados
  ├── /middlewares      Validação e autenticação de dados
    ├── /schemas        esquemas de validação para o JOI
  ├── /routes           rotas para cada endpoint
  ├── /services         camada de service - regras de negócio

API Endpoints

Login

POST /api/login

Body:

{
  "email": "exemplo@gmail.com",
  "password": "123456"
}
  • Só é possível fazer login com email e senha válidos. Caso login seja feito com sucesso um token é gerado utilizando o JWT.

Users

GET /api/users

  • Retorna todos os usuários cadastrados.
  • Necessita do Authorization header com o token gerado pelo login/sign-up.

GET /api/users/:id

  • Retorna um usuário específico pelo id.
  • Necessita do Authorization header com o token gerado pelo login/sign-up.

POST /api/users

Body:

{
  "displayName": "Exemplo",
  "email": "exemplo@email.com",
  "password": "123456",
  "image": "exemplo.png"
}
  • Só é possível criar usuários com email que não estejam cadastrados no banco de dados e os demais dados válidos.
  • Esse endpoint não necessita do Authorization header.
  • Caso usuário seja criado com sucesso, um token é gerado utilizando o JWT.

DELETE /api/users/me

  • Deleta um usuário com base no token.
  • Necessita do Authorization header com o token gerado pelo login/sign-up.

Categories

GET /api/categories

  • Retorna todas as categorias cadastradas.
  • Necessita do Authorization header com o token gerado pelo login/sign-up.

POST /api/categories

Body:

{
  "name": "Exemplo"
}
  • Só é possível criar categorias com nome que não estejam cadastradas no banco de dados.
  • Necessita do Authorization header com o token gerado pelo login/sign-up.

Posts

GET /api/posts

  • Retorna todos os posts cadastrados.
  • Necessita do Authorization header com o token gerado pelo login/sign-up.

GET /api/posts/:id

  • Retorna um post específico pelo id.
  • Necessita do Authorization header com o token gerado pelo login/sign-up.

GET /api/posts/search?q=searchTerm

  • Retorna todos os posts que contenham o termo de busca no titulo ou no conteúdo.
  • Necessita do Authorization header com o token gerado pelo login/sign-up.

POST /api/posts

Body:

{
  "title": "Exemplo",
  "content": "Exemplo",
  "categoryIds": [1, 2],
}
  • Só é possível criar posts com título, conteúdo e categorias válidos.
  • Necessita do Authorization header com o token gerado pelo login/sign-up.
  • O cadastro de posts no banco de dados é feito através de Managed Transactions no Sequelize.

PUT /api/posts/:id

Body:

{
  "title": "Exemplo",
  "content": "Exemplo",
}
  • Só é possível atualizar posts com título e conteúdo válidos.
  • Só é possível atualizar posts do usuário que o criou.
  • Necessita do Authorization header com o token gerado pelo login/sign-up.

DELETE /api/posts/:id

  • Deleta um post com base no id.
  • Só é possível deletar posts do usuário que o criou.
  • Necessita do Authorization header com o token gerado pelo login/sign-up.

Instruções

Instalação e Execução

A instalação e execução vai depender do ambiente (Local ou Docker) que você está utilizando. É necessário ter o Node.js instalado na máquina. Cada particularidade será explicada a seguir.

Scrips de instalação e execução:

Instalar dependências:

npm install

Criar o banco de dados:

npm run prestart

População do banco de dados:

npm run seed

Excluir o banco de dados:

npm run drop

Executar o servidor:

npm start

Executar o servidor com Nodemon:

npm run debug

Local

Para execução do ambiente local é necessário ter o MySQL instalado e rodar o scripts anteriores.

Docker

Para execução do ambiente docker é necessário ter o Docker e docker-compose instalado.

Iniciar os containers:

docker-compose up -d

Esse comando inicia os containers do node e do mysql.

Acessar CLI do Container:

docker exec -it blogs_api bash

Caso opte por usar o Docker os scripts de instalação e execução DEVERÃO ser executados dentro do container.

Ferramentas

Linter

Este projeto foi desenvolvido utilizando o linter ESLint seguindo as boas práticas definidas na Trybe.

  • Para executar o linter, basta executar o comando:
npm run lint

Node

Para executar as funções deste projeto, é necessário ter o Node instalado.

Express

Express é uma biblioteca para criação de aplicações web.

Docker

Docker é um ambiente de execução de aplicações que permite a criação de containers para execução de aplicações.

Nodemon

Nodemon é um serviço que monitora alterações no código e reinicia o servidor automaticamente.

MySQL

MySQL é um banco de dados relacional, e foi utilizado para a criação do banco de dados deste projeto.

Sequelize

Sequelize é uma biblioteca ORM para o banco de dados. É utilizado para a criação do banco de dados deste projeto, populando o banco e utilizado para o desenvolvimento das funções da camada Model. A estrutura do Sequelize pode ser encontrada na pasta /database.

JWT

JWT é uma biblioteca para criação de tokens. É utilizado para geração de tokens para autenticação de usuários da api. Foi utilização na maior parte das requisição, sua configuração está na pasta /middlewares.

Joi

Joi é uma biblioteca para validação de dados. É utilizado para validação de dados de entrada da api. Seu uso pode ser encontrado nos middlewares de validação e schemas em /middlewares.

dotenv

dotenv é uma biblioteca para leitura de arquivos de configuração. É utilizado para leitura de variáveis de ambiente.

Observações

  • Este é um projeto de estudo desenvolvido durante minha formação na Trybe. 🚀

  • Este repositório está sendo monitorado pelo SonarCloud para avaliação de qualidade.

  • Quer saber mais sobre mim? Veja o meu LinkedIn.

About

Este projeto é uma de API seguindo princípios REST para um blog, onde o usuário pode criar, ler, atualizar e deletar posts, fazer login, criar cadastro, categorias e consulta-los.

Topics

Resources

Stars

Watchers

Forks