Neste projeto foi desenvolvida uma API e um banco de dados para a produção de conteúdo para um blog!
- Node.js
- Sequelize
Você deverá desenvolver uma aplicação em Node.js
usando o pacote sequelize
para fazer um CRUD
de posts.
-
Você deverá desenvolver endpoints que estarão conectados ao seu banco de dados seguindo os princípios do REST;
-
Para fazer um post é necessário usuário e login, portanto será trabalhada a relação entre
user
epost
; -
Será necessária a utilização de categorias para os posts, trabalhando, assim, a relação de
posts
paracategories
e decategories
paraposts
.
👉 Como abrir a aplicação
- Clone o repositório
git clone git@github.com:tryber/sd-017-project-blogs-api.git
.- Entre na pasta do repositório que você acabou de clonar:
cd sd-017-project-blogs-api
- Instale as dependências
npm install
🐋 Rodando no Docker vs Localmente
1.26.0
por 1.29.2
.
ℹ️ Rode os serviços
node
edb
com o comandodocker-compose up -d --build
.
-
Lembre-se de parar o
mysql
se estiver usando localmente na porta padrão (3306
), ou adapte, caso queria fazer uso da aplicação em containers; -
Esses serviços irão inicializar um container chamado
blogs_api
e outro chamadoblogs_api_db
; -
A partir daqui você pode rodar o container
blogs_api
via CLI ou abri-lo no VS Code;
ℹ️ Use o comando
docker exec -it blogs_api bash
.
- Ele te dará acesso ao terminal interativo do container criado pelo compose, que está rodando em segundo plano.
ℹ️ Instale as dependências [Caso existam] com
npm install
. (Instale dentro do container)
-
⚠️ Atenção: Caso opte por utilizar o Docker, TODOS os comandos disponíveis nopackage.json
(npm start, npm test, npm run dev, ...) devem ser executados DENTRO do container, ou seja, no terminal que aparece após a execução do comandodocker exec
citado acima. -
⚠️ Atenção: O git dentro do container não vem configurado com suas credenciais. Ou faça os commits fora do container, ou configure as suas credenciais do git dentro do container. -
⚠️ Atenção: Não rode o comando npm audit fix! Ele atualiza várias dependências do projeto, e essa atualização gera conflitos com o avaliador. -
✨ Dica: A extensão
Remote - Containers
(que estará na seção de extensões recomendadas do VS Code) é indicada para que você possa desenvolver sua aplicação no container Docker direto no VS Code, como você faz com seus arquivos locais.
ℹ️ Instale as dependências [Caso existam] com
npm install
-
⚠️ Atenção: Não rode o comando npm audit fix! Ele atualiza várias dependências do projeto, e essa atualização gera conflitos com o avaliador. -
✨ Dica: Para rodar o projeto desta forma, obrigatoriamente você deve ter o
node
instalado em seu computador. -
✨ Dica: O avaliador espera que a versão do
node
utilizada seja a 16.
🎲 Diagrama ER e Entidades
A construção das tabelas foi feita através do ORM, utilizando o DER a seguir:
O projeto utiliza o ORM Sequelize
para criar e atualizar o banco de dados.
-
Uma tabela chamada Users, contendo dados com a seguinte estrutura:
{ "id": 1, "displayName": "Brett Wiltshire", "email": "brett@email.com", // tem quer ser único "password": "123456", "image": "http://4.bp.blogspot.com/_YA50adQ-7vQ/S1gfR_6ufpI/AAAAAAAAAAk/1ErJGgRWZDg/S45/brett.png" }
-
Uma tabela chamada Categories, contendo dados com a seguinte estrutura:
{ "id": 18, "name": "News" }
-
Uma tabela chamada BlogPosts, contendo dados com a seguinte estrutura:
{ "id": 21, "title": "Latest updates, August 1st", "content": "The whole text for the blog post goes here in this key", "userId": 14, // Chave estrangeira, referenciando o id de `Users` "published": "2011-08-01T19:58:00.000Z", "updated": "2011-08-01T19:58:51.947Z", }
-
Uma tabela chamada PostCategories, contendo uma chave primária composta utilizando os dois atributos da estrutura:
{ "postId": 50, // Chave primária e estrangeira, referenciando o id de `BlogPosts` "categoryId": 20 // Chave primária e estrangeira, referenciando o id de `Categories` }
Os dados acima são fictícios, e estão aqui apenas como exemplo
- O endpoint deve ser acessível através do URL
/login
; - O corpo da requisição deverá seguir o formato abaixo:
{ "email": "lewishamilton@gmail.com", "password": "123456" }
- O endpoint deve ser acessível através do URL
/user
; - O endpoint deve ser capaz de adicionar um novo
user
a sua tabela no banco de dados; - O corpo da requisição deverá seguir o formato abaixo:
{ "displayName": "Brett Wiltshire", "email": "brett@email.com", "password": "123456", "image": "http://4.bp.blogspot.com/_YA50adQ-7vQ/S1gfR_6ufpI/AAAAAAAAAAk/1ErJGgRWZDg/S45/brett.png" }
- ☝ Validar o
token
neste requisito - O endpoint deve ser acessível através do URL
/user
; - O endpoint deve ser capaz de trazer todos
users
do banco de dados;
- ☝ Validar o
token
neste requisito, - O endpoint deve ser acessível através do URL
/user/:id
; - O endpoint deve ser capaz de trazer o
user
baseado noid
do banco de dados se ele existir;
- ☝ Validar o
token
neste requisito - O endpoint deve ser acessível através do URL
/categories
; - O endpoint deve ser capaz de adicionar uma nova categoria a sua tabela no banco de dados;
- O corpo da requisição deverá seguir o formato abaixo:
{ "name": "Typescript" }
- ☝ Validar o
token
neste requisito - O endpoint deve ser acessível através do URL
/categories
; - O endpoint deve ser capaz de trazer todas categorias do banco de dados;
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
- ☝ Validar o
token
neste requisito - O endpoint deve ser acessível através do URL
/post
; - O endpoint deve ser capaz de adicionar um novo blog post e vinculá-lo as categorias em suas tabelas no banco de dados;
- O corpo da requisição deverá seguir o formato abaixo:
{ "title": "Latest updates, August 1st", "content": "The whole text for the blog post goes here in this key", "categoryIds": [1, 2] }
- ☝ Validar o
token
neste requisito - O endpoint deve ser acessível através do URL
/post
; - O endpoint deve ser capaz de trazer todos os bogs post, user dono dele e as categorias do banco de dados;