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
.
- Blogs Api - Node.js, Express, JWT, Sequelize e MySQL
- Arquitetura
- API Endpoints
- Instruções
- Ferramentas
- Observações
O projeto possui arquitetura de camadas MSC (Model
, Service
, Controller
), onde cada camada é responsável por uma única funcionalidade.
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
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
- Retorna todos os usuários cadastrados.
- Necessita do Authorization header com o token gerado pelo login/sign-up.
- Retorna um usuário específico pelo id.
- Necessita do Authorization header com o token gerado pelo login/sign-up.
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.
- Deleta um usuário com base no token.
- Necessita do Authorization header com o token gerado pelo login/sign-up.
Categories
- Retorna todas as categorias cadastradas.
- Necessita do Authorization header com o token gerado pelo login/sign-up.
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
- Retorna todos os posts cadastrados.
- Necessita do Authorization header com o token gerado pelo login/sign-up.
- Retorna um post específico pelo id.
- Necessita do Authorization header com o token gerado pelo login/sign-up.
- 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.
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.
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.
- 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.
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
Para execução do ambiente local é necessário ter o MySQL
instalado e rodar o scripts
anteriores.
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.
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.
-
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.