Abaixo relato os desafios encontrados para realização do projeto, os motivos de certas escolhas, como você pode clonar o projeto, bem como as tecnologias que foram usadas.
Este projeto tem por objetivo simular as operações que são possíveis de serem realizadas por um cliente cadastrado numa corretora.
- Montar as tabelas(1:N ou N:N), de forma que ficassem enxutas e tivessem um bom relacionamento;
- Preparar o ambiente para os testes, pois era a primeira vez que fiz a instalação inicial em uma aplicação com testes;
- Simular as funções com o framework Sinon, devido a dificuldade de interpretar os erros de tipagem que ocorriam nos testes;
- Decisão de parar de usar os frameworks Sinon/Mocha/Chai e passar a usar o framework Jest.
- Optei por criar as 'queries' sem usar ORM(Object-Relational Mapping) para treinar a lógica de como os relacionamentos acontecem dentro do mysql;
- Escolhi typescript pois tem o benefício da tipagem dos retornos e assim acelera a identificação dos erros;
- Escolhi usar autenticação por JsonWebToken, pois já conhecia as tipagens necessárias para os parâmetros e retornos;
- Optei por iniciar os testes com Mocha/Chai/Sinon pois era o framework que da a opção de testar as chaves de um objeto em uma linha de código;
- Alterei a realização dos testes para usar o framework Jest, pois tive muita dificuldade para entender os erros retornados com o Sinon;
👨💻 Para executar o projeto
✨ Dica: Para um melhor aproveitamento é recomendável ter as ferramentas abaixo instaladas na sua máquina
- Clone o repositório, com o comando abaixo, no terminal:
git clone git@github.com:KerliS9/stock-market-api.git
- Entre na pasta do repositório que você acabou de clonar:
cd stock-market-api
- Instale as dependências
npm install
-
Configure as variáveis de ambiente no arquivo .env, conforme o exemplo informado no arquivo example.env
-
Se tiver o docker instalado e configurado na máquina: digite no terminal o comando abaixo
Caso contrário, vá para o passo 'Rodando sem o docker' e depois retorne ao passo 5
⚠ Atenção ⚠ Se atente para as portas que você está configurando no .env e/ou a porta padrão usada pelo mysql(3306)
docker-compose up -d
-
Copie o arquivo script 'StockMarketDB.sql' da pasta stock-market-api e cole na sua ferramenta visual de preferência, exemplo Mysql Workbench
-
Execute o script no Workbench
-
Volte ao seu terminal e digite
npm run dev
-
Acesse a sua ferramenta de API REST preferida, exemplo insomnia e simule o uso das rotas conforme o arquivo .src/routes/
⚠ Atenção ⚠ Todas as rotas que solicitem informação específica de um cliente possuem validação por token. -
Para rodar os testes unitários
npm run test
- Para verificar a cobertura dos testes
npm run test:cov
Rodando sem uso do Docker
- Passos 1 á 3, segue da mesma forma
Em substituição ao passo 5, será obrigatória a instalação dos pacotes Node v16 e MySql
🏦 Tabelas do banco
O banco tem 7 tabelas - direcionadas a 3 entidades.
Entidade Cliente
```sql
CREATE TABLE StockMarketDB.Customer (
id int AUTO_INCREMENT NOT NULL,
full_name varchar(100) NOT NULL,
password varchar(12) NOT NULL,
investor_profile varchar(50) NOT NULL,
account_balance decimal(19, 2) NOT NULL,
PRIMARY KEY (id)
)ENGINE=InnoDB;
CREATE TABLE StockMarketDB.Account_Statement (
id int AUTO_INCREMENT NOT NULL,
customer_id int NOT NULL,
account_input decimal(19, 2),
account_output decimal(19, 2),
date DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
FOREIGN KEY (customer_id) REFERENCES StockMarketDB.Customer (id) ON DELETE CASCADE
)ENGINE=InnoDB;
CREATE TABLE StockMarketDB.Customer_Custody (
customer_id int NOT NULL,
asset_id int NOT NULL,
amount_asset int NOT NULL,
sector varchar(100) NOT NULL
)ENGINE=InnoDB;
```
Entidade Ativos
```sql
CREATE TABLE StockMarketDB.Market_Assets (
id int AUTO_INCREMENT NOT NULL,
asset varchar(6) NOT NULL,
price decimal(19, 2) NOT NULL,
PRIMARY KEY (id)
)ENGINE=InnoDB;
CREATE TABLE StockMarketDB.Brokerage_Firms (
id int AUTO_INCREMENT NOT NULL,
broker varchar(100) NOT NULL,
asset_id int NOT NULL,
amount_asset int NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (asset_id) REFERENCES StockMarketDB.Market_Assets (id) ON DELETE CASCADE
)ENGINE=InnoDB;
CREATE TABLE StockMarketDB.Companies (
id int AUTO_INCREMENT NOT NULL,
asset_id int NOT NULL,
company varchar(250) NOT NULL,
sector varchar(100) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (asset_id) REFERENCES StockMarketDB.Market_Assets (id) ON DELETE CASCADE
)ENGINE=InnoDB;
```
Entidade Investimentos
```sql
CREATE TABLE StockMarketDB.Customer_Investments (
id int AUTO_INCREMENT NOT NULL,
customer_id int NOT NULL,
asset_id int NOT NULL,
amount_asset_take int,
amount_asset_sell int,
date DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
FOREIGN KEY (customer_id) REFERENCES StockMarketDB.Customer (id) ON DELETE CASCADE,
FOREIGN KEY (asset_id) REFERENCES StockMarketDB.Market_Assets (id) ON DELETE CASCADE
)ENGINE=InnoDB;
```
🛠 Linguagens e ferramentas usadas
Disponível na pasta ./src/documentation
Separada por subpastas, conforme a rota.
Projeto desenvolvido por Kerli Schroeder 🤗