Para este projeto, foi criado uma loja de itens medievais, no formato de uma API, utilizando Typescript.
A aplicação possui alguns endpoints que irão ler e escrever em um banco de dados, utilizando o MySQL, nela será possível realizar as operações básicas que se pode fazer em um determinado banco de dados: Criação, Leitura, Atualização e Exclusão (CRUD - Create, Read, Update e Delete).
Alem disso foi utilizado para desenvolver todas as camadas da aplicação a arquitetura MSC (Models, Service e Controllers).
Foi utilizado:
- TypeScript,
- Node,
- Express,
- Docker,
- MySQL,
- Joi,
- JWT.
🐳 Rodando no Docker vs Localmente
Rode os serviços
node
edb
com o comandodocker-compose up -d
.
- 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
trybesmith
e outro chamadotrybesmith_db
. - A partir daqui você pode rodar o container
trybesmith
via CLI ou abri-lo no VS Code.
Use o comando
docker exec -it trybesmith 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
⚠ Atenção ⚠ Caso opte por utilizar o Docker, TODOS os comandos disponíveis no package.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 comando docker exec
citado acima.
⚠ Atenção ⚠ O git dentro do container não vem configurado com suas credenciais. Faça os commits fora do container, ou configure as suas credenciais do git dentro do container.
⚠ Atenção ⚠ Caso você esteja usando macOS e ao executar o docker-compose up -d
se depare com o seguinte erro:
The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services.db: 'platform'
Unsupported config option for services.node: 'platform'
Foram encontradas 2 possíveis soluções para este problema:
- Você pode adicionar manualmente a option
platform: linux/amd64
no service do banco de dados no arquivo docker-compose.yml do projeto, mas essa é uma solução local e você deverá reproduzir isso para os outros projetos.- Você pode adicionar manualmente nos arquivos .bashrc, .zshenv ou .zshrc do seu computador a linha
export DOCKER_DEFAULT_PLATFORM=linux/amd64
, essa é uma solução global. As soluções foram com base nesta fonte.
Instale as dependências [Caso existam] com
npm install
✨ Dica: Para rodar o projeto desta forma, obrigatoriamente você deve ter o node
instalado em seu computador.
🏦 Conexão com o Banco
A conexão do banco local deverá conter os seguintes parâmetros:
import dotenv from 'dotenv';
import mysql from 'mysql2/promise';
dotenv.config();
const connection = mysql.createPool({
host: process.env.MYSQL_HOST,
user: process.env.MYSQL_USER,
password: process.env.MYSQL_PASSWORD,
}); // sua conexão NÃO deve ter o database, este deve ser especificado em cada query
export default connection;
host: process.env.MYSQL_HOST
user: process.env.MYSQL_USER
password: process.env.MYSQL_PASSWORD
connection.ts
e esteja no diretório src/models
🪑 Tabelas
O banco terá três tabelas: pessoas usuárias, produtos e pedidos.
DROP SCHEMA IF EXISTS Trybesmith;
CREATE SCHEMA IF NOT EXISTS Trybesmith;
CREATE TABLE Trybesmith.users (
id INTEGER AUTO_INCREMENT PRIMARY KEY NOT NULL,
username TEXT NOT NULL,
vocation TEXT NOT NULL,
level INTEGER NOT NULL,
password TEXT NOT NULL
);
CREATE TABLE Trybesmith.orders (
id INTEGER AUTO_INCREMENT PRIMARY KEY NOT NULL,
user_id INTEGER,
FOREIGN KEY (user_id) REFERENCES Trybesmith.users (id)
);
CREATE TABLE Trybesmith.products (
id INTEGER AUTO_INCREMENT PRIMARY KEY NOT NULL,
name TEXT NOT NULL,
amount TEXT NOT NULL,
order_id INTEGER,
FOREIGN KEY (order_id) REFERENCES Trybesmith.orders (id)
);
O arquivo Trybesmith.sql
contém as queries que criam e populam o banco como o teste faz, e os testes restauram o banco de dados após sua execução.
Para que o avaliador funcione corretamente, tanto local quanto remoto, sua connection.ts
não deve conter o database e suas queries devem conter o banco de dados explicitamente como o exemplo abaixo:
SELECT * FROM Trybesmith.products;
🎛 Linter
Usaremos o ESLint para fazer a análise estática do seu código.
Este projeto já vem com as dependências relacionadas ao linter configuradas nos arquivos package.json
.
Para poder rodar o ESLint
em um projeto basta executar o comando npm install
dentro do projeto e depois npm run lint
. Se a análise do ESLint
encontrar problemas no seu código, tais problemas serão mostrados no seu terminal. Se não houver problema no seu código, nada será impresso no seu terminal.
Você pode também instalar o plugin do ESLint
no VSCode
. Para isso, basta fazer o download do plugin ESLint
e instalá-lo.
🍪 Informações sobre a API
-
O projeto deve rodar na porta 3000;
-
O arquivo
index.ts
existe para rodar corretamente os testes. Toda a chamada de rotas do projeto deverá ser feita dentro do arquivoapp.ts
;
-
Use os verbos
HTTP
adequados para cada operação; -
Agrupe e padronize suas URL em cada recurso;
-
Garanta que seus endpoints sempre retornem uma resposta, havendo sucesso nas operações ou não;
-
Retorne os códigos de status corretos (recurso criado, erro de validação, etc).