Skip to content

Um estudo sobre raspagem de dados em back-end, simulando uma corretora que realiza ações de compra e venda de ativos e fluxo de caixa de clientes em tempo real.

Notifications You must be signed in to change notification settings

rafaelPermec/live-broker-api

Repository files navigation

Bem-vindos ao Broker Simulator!

Desenvolvido Usando

Node.js Express.js TypeScript MySQL

✔️ Como rodar o projeto?

Localmente

1 - Dê o fork no projeto e clone-o para sua maquina com o comando git clone [email protected]:rafaelPermec/live-broker-api.git em seu terminal.

2 - Entre com o comando cd live-broker-api && cd xp-inc && npm install para entrar no diretorio principal e instalar as dependencias do projeto.

3 - Crie um arquivo .env e configure as variáveis de ambiente

MYSQL_HOST=localhost
MYSQL_USER='seu usuário'
MYSQL_PASSWORD='sua senha'
PORT=3800
TOKEN_SECRET='seu token secreto'

4 - Digite npm start ou npm run dev para começar a rodar o servidor. Ele estará na porta 3800.

5 - Abra seu GUI preferido (Postman, Insomnia ou Thunder Cliente) para fazer as requisições à minha API! 😃

6 - Não se esqueça de direcionar sua GUI de requisições ou Browser para http://localhost:3800.

7 - Para visualizar a documentação, basta acessar http://localhost:3800/api-doc

URL

1 - O deploy do projeto foi realizado pelo heroku, utilizando db4free como fonte do MySQL;

2 - Durante o processo, o código foi transpilado para javascript;

3 - Você pode visualiza-lo clicando aqui.

4 - Ou copiando e colando a URL em seu browser: https://xp-rafael-permec.herokuapp.com/api-doc/.

5 - Lembrando que começamos sempre pela documentação! =)

6 - Faça sua primeira requisição pelo endpoint /conta/cadastro e depois faça requisição em /login, para coletar seu token JWT e receber autorização de entrada para o restante da API.

⚙️ O que foi implementado no projeto?

📓 Backlog

1- Introdução de Github Actions para Continous Integration, nesse Pull Request ;

2 - Web-scrapping para banco de dados de Ativos em tempo real, nesse Pull Request;

3 - Criação e normalização de Entidades do SQL necessárias para o projeto, nesse Pull Request;

4 - Disponibilizando Seeds para teste de desenvolvimento e Imagem da Normalização do Banco de Dados, nesse Pull Request;

5 - Estruturei o endpoint /logindo projeto, respeitando a finalidade que é a construção de um front-end, desenvolvendo um espaço para que o cliente possa logar na aplicação e ser autenticado, conforme token gerado pelo jsonwebtoken, nesse Pull Request;

6 - Criação e Autenticação de Token do JWT, nesse Pull Request;

7 - Implementei Middlewares de Erros na aplicação, para blindar de possíveis anomalias, nesse Pull Request;

8 - Estruturei o endpoint /contasdo projeto, respeitando a finalidade que é a construção de um front-end, assim, não desenvolvendo meios para que houvessem requisições maliciosas (como um PUT na rota que contem o saldo final do cliente, por exemplo!), nesse Pull Request;

9 - Estruturei o endpoint /logindo projeto, aonde o usuário deve passar, após cadastro inicial, para se autenticar na plataforma através de token JWT e ter acesso aos endpoints específicos de sua conta, nesse Pull Request;

10 - Estruturei o endpoint /ativosdo projeto, respeitando a finalidade que é a construção de um front-end. Sendo assim, optei por fazer as buscas de ativos por /ativos/corretora, para listar todos os ativos e sua quantidade em posse da corretora, ativos/cliente/:id para a busca de ativos por CodCliente, /ativos/codigo/:id para que possamos fazer uma busca individual do ativo, se ele constar na corretora, e /ativos/sigla/:sigla que faz a busca conforme o nome do papel cadastrado na Bovespa, nesse Pull Request;

11 - Estruturei o endpoint /investimentos do projeto, criando conexão de backlog de transações de Compra e Venda entre ativos, limites de saldos e quantidades de disponibilidade dos mesmos. Através da rota POST /investimentos/compra || /investimentos/venda, o cliente consegue realizar transações, desde que esteja devidamente registrado e logado na aplicação. Um cliente não pode comprar ou vender ativos de/para outros clientes da aplicação, nesse Pull Request;

12 - Estruturei Middlewares contra ataques de identidade para a aplicação, definindo que só os devidos donos das contas podem manipular ou verificar as mesmas, evitando assim ataques maliciosos, nesse Pull Request;

🏃‍♂️ Github Actions
  • Realizei uma integração de Actions, para facilitar o desenvolvimento do projeto utilizando o EsLint padronizado pelo Airbnb, com tipagem própria para Typescript.
🎲 Normalização do Banco de Dados SQL
DB Normalizado =)
📚 Bibliotecas e Frameworks
  • eslint
  • express
  • mysql2
  • express-async-errors
  • dotenv
  • axios
  • cheerio
  • helmet
  • joi
  • jsontwebtoken (JWT)
  • bcript-nodejs
  • supertest
  • nodemon
  • swagger-ui-express
♻️ Principais Funções
  • apiBovespa() : É uma função de Web-Scrapping criada à partir do site da Fundamentus que lista e cria um arquivo .json com toda a lista de ações da Bovespa e seu preço, em tempo real, ordenadas por ordem alfabética.

  • apiBovespaSegmentada() : É uma função de Web-Scrapping criada à partir do site da Fundamentus que lista e cria um arquivo separado do citado acima, em .json, com toda a lista de ações da Bovespa e seu preço, em tempo real, filtrando e segmentando as ações listadas pela apiBovespa() de acordo com suas negociações adequadas.

  • generateJWTToken({ user }: ICliente) : Gera um Token JWT à partir das informações do cliente que passamos como parâmetro.

  • authToken(token: string | undefined) : Autentica o Token JWT que passamos para a função.

  • authenticateMiddleware() : É utilizado para verificar se a autorização esta presente no Header da aplicação.

  • HttpException(status: Number, message: string) : É uma classe que estende a superclasse Error e consegue capturar qualquer qualquer erro que esteja envolvida, alterando a propriedade status e mensagem do erro capturado.

Funções dos endpoint:

Principais funções que utilizei na API da Aplicação:

/login
  • POST '/login' authenticate(user: req.body) : É responsável por gerar o JWT Token que utilizamos na autenticação do usuário no ato do Login em nosso site, e é utilizado para todo o projeto. É a primeira barreira de segurança da aplicação.
/conta
/ativos
  • GET '/ativos/corretora' ativosCorretora() : Realiza a busca e mostra, conforme requisição, as ações listadas e em posse da corretora de valores. O seu preço é alterado dinamicamente, conforme a realidade.

  • GET '/ativos/cliente/:id' ativosCliente(id: number) : Mostra todos os ativos em posse do cliente, cujo CodCliente é apresentado na URL em forma de id (identificador unico).

  • GET '/ativos/codigo/:id' ativosPorId(id: number) :Mostra um único ativo, fazendo a busca através do seu CodAtivo (apresentado na URL em forma de id - identificador único), e nele esta incluso o valor da ação individual, sendo o preço real e mostrado conforme o índice de preços do pregão da Bovespa do momento.

  • GET '/ativos/sigla/:id' ativosPorSigla(sigla: string) : Mostra um único ativo, fazendo a busca através do seu SiglaAtivo (apresentado na URL em forma de sigla - nome registrado do papel na Bovespa, sendo uma sigla unica para cada empresa), e nele esta incluso o valor da ação individual, sendo o preço real e mostrado conforme o índice de preços do pregão da Bovespa do momento.

/investimentos
  • POST '/investimentos/compra' vendeAtivo(asset: IInvenstimentos) : Compra um ativo cadastrado na entidade responsável pela transação (corretora) e tem seu valor (em tempo real) creditado de sua conta, ficando registrado na entidade responsável pelo backlog (trade) o código e a data da transação, com o valor fixo pago no momento.

  • POST '/investimentos/venda' compraAtivo(asset: IInvenstimentos) : Vende um ativo cadastrado na entidade que armazena os investimentos do cliente (portifolio) e tem seu valor (em tempo real) debitado de sua conta, ficando registrado na entidade responsável pelo backlog (trade) o código e a data da transação, com o valor fixo pago no momento.

Funções de Middleware:

Responsáveis por capturar possíveis erros abstraídos e atribuir fatores de segurança nas transações.

Typo Errors
  • LoginTypoMiddleware() : Impede que o cliente cometa qualquer erro de digitação ou confusão no tipo de dado disposto no corpo da requisição no momento em que vai logar na aplicação, verificando também se ele já consta no banco de dados.

  • ContasTypoMiddleware() : Impede que o cliente cometa qualquer erro de digitação ou confusão no tipo de dado disposto no corpo da requisição no momento de seu cadastro no banco de dados de clientes da aplicação.

  • ContasFinanceiroTypoMiddleware() : Impede que o cliente cometa qualquer erro de digitação, confusão no tipo de dado disposto no corpo da requisição ou ataques maliciosos (como depósitos negativos) no momento em que fará transações financeiras de Deposito e Saque na aplicação.

  • InvestimentosTypoMiddleware() : Impede que o cliente cometa qualquer erro de digitação, confusão no tipo de dado disposto no corpo da requisição ou ataques maliciosos (como compras negativas) no momento em que fará transações financeiras de Compra e Venda de Ativos na aplicação.

Database Middlewares
  • LoginNotFoundMiddleware() : Busca por cliente em entidade que armazena todos os clientes da aplicação e retorna erro se não for encontrado ou devidamente cadastrado.

  • ContasAlreadyExistMiddleware() : Busca por cliente em entidade que armazena todos os clientes da aplicação e retorna erro se já o e-mail já tiver sido cadastrado no sistema.

  • ContasFinanceiroMiddleware() : Busca por saldo do cliente no sistema e verifica se ele tem saldo para fazer transação.

  • InvestimentosCompraMiddleware() : Busca por saldo do cliente no sistema e verifica se o ativo existe na corretora, se ele tem saldo para fazer transação e se corretora tem quantidade de ativos para fazer a transação.

  • InvestimentosVendaMiddleware() : Busca por saldo do cliente no sistema e verifica se ele tem o ativo em posse, em seu portfolio, para fazer transação.

Error Middleware
  • ErrorMiddleware() : É um middleware que captura qualquer erro que podemos ter na aplicação e retorna uma resposta para o servidor.
Security
  • antiMiddleManById() : Realiza a busca do cliente em banco de dados e verifica se quem está realizando a operação é realmente o cliente que realizou o login e possui o token JWT em seu header, através do id passado por parâmetro na URL.

  • antiMiddleManByBody() : Realiza a busca do cliente em banco de dados e verifica se quem está realizando a operação é realmente o cliente que realizou o login e possui o token JWT em seu header, através do CodCliente passado por corpo da requisição


About

Um estudo sobre raspagem de dados em back-end, simulando uma corretora que realiza ações de compra e venda de ativos e fluxo de caixa de clientes em tempo real.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages