- Resumo do projeto
- Passo a passo
- Explicando decisões do projeto
- Explicando funcionalidades da API
- Próximos passos
Essa é uma API RESTful que tem como objetivo simular o funcionamento de uma corretora e banco digital, foi desenvolvida com algumas funcionalidades simples de gerenciamento de clientes, contas, investimentos e ativos.
Como executar o projeto
🐋 Docker e docker-compose (recomendado)
# Faça o clone do repositório e entre na pasta do projeto:
$ git clone git@github.com:leonardoVogel/desafio-xpi-backend.git && cd desafio-xpi-backend
# Renomeie o arquivo .env.example para .env (não é necessário alterar as variáveis, apenas se deseja executar a aplicação em outra porta):
$ mv .env.example .env
# Suba os containers com o docker-compose:
$ docker-compose up -d
# Acesso o container para rodar a aplicação:
$ docker exec -it xpi_backend bash
# Instale as dependências:
$ yarn install
# Por fim, rode a aplicação (esse comando já irá gerar o banco de dados e popular com alguns dados, sempre que ele for executado o banco será restaurado):
$ yarn dev
# Após isso, você pode abrir um novo terminar e entrar novamente no container para executar o seguinte comando e iniciar um processo de atualização aleatória dos preços dos ativos:
$ yarn openmarket
Rodando local
- É necessário ter um banco de dados PostgreSQL, node 16+ e yarn instalados;
# Faça o clone do repositório e entre na pasta do projeto:
$ git clone git@github.com:leonardoVogel/desafio-xpi-backend.git && cd desafio-xpi-backend
# Renomeie o arquivo .env.example para .env (não é necessário alterar as variáveis, apenas se deseja executar a aplicação em outra porta):
$ mv .env.example .env
# Instale as dependências:
$ yarn install
# Configure a url do seu banco de dados no arquivo .env;
# Por fim, rode a aplicação (esse comando já irá gerar o banco de dados e popular com alguns dados, sempre que ele for executado o banco será restaurado):
$ yarn dev
Como interagir com o projeto
Utilizando VSCode + postman ou insomnia
-
Importe o arquivo
/support/desafio-xpi-requests.json
com as requests no postman ou insomnia; -
Configure as variáveis
base_url
(exemplo:http://localhost:3000
) eauth
com o token, depois que já tiver um. -
Execute o comando
yarn openmarket
para iniciar o processo de atualização aleatória dos preços dos ativos. -
Por fim, depois de interagir com a aplicação, execute o comando
yarn test
para executar os testes unitários.
Utilizando a documentação do swagger
-
Acesse o deploy da API, no endpoint
/api-docs
: https://desafio-xpinc.herokuapp.com/api-docs/; -
Registre uma conta no endpoint
/register
e depois faça o login com esses mesmos dados no endpoint/login
; -
Copie o token retornado na resposta do login e cole ele no campo
Value
ao clicar no botãoAuthorize 🔓
; -
Após isso, todas as rotas estarão liberadas para interagir.
Ferramentas Utilizadas
- Prisma
- Apesar de ter mais familiaridade com o sequelize, a própria documentação informa que existem lacunas no uso com o TypeScript (fonte), então optei por utilizar o prisma, que ao contrário do sequelize é mais compatível com o TypeScript, tornando inclusive o processo de escrever o código mais rápido por conta do auto-complete do VSCode.
- TypeScript
- Decidi usar o TypeScript pois logo no inicio já imaginei que a aplicação teria várias integrações entre diferentes entidades do banco de dados e juntando isso com a escolha do prisma como ORM, eu poderia economizar muito tempo com bugs e erros que só seriam descobertos mais tarde. Com o TypeScript, eu consigo fazer o código ficar mais legível, organizado e com menos bugs.
- joi
- A escolha do joi se deu principalmente por já ter usado em diversos projetos na Trybe, já estava familiarizado e sabia que iria me atender bem.
- Além disso, torna o processo muito mais rápido, já tendo ferramentas prontas para validações padrão como email por exemplo.
- jsonwebtoken
- Assim como o joi, a escolha do jsonwebtoken se deu por já ter usado em diversos projetos na Trybe, além de ser muito usada pela comunidade pela sua facilidade e confiabilidade.
- bcrypt
- Decidi usar o bcrypt pois precisava armazenar a senha dos clientes de uma forma segura no banco de dados, por se tratar de uma informação sensível.
- jest
- Escolhi o jest por achar uma ferramenta bem completa para meus objetivos e também já ter usado em outros projetos
- eslint
- Achei necessário o uso do eslint para manter um padrão e organização no projeto, acabei editando varias regras por já estar adaptado a um padrão proximo ao dos projetos da trybe.
Decisões durante o desenvolvimento do projeto
No inicio do projeto, passei bastante tempo planejando o que eu queria fazer e tentando deixar bem nítido na minha cabeça o passo a passo que deveria seguir, mas acabei me prendendo muito a modelagem do banco de dados. Passei por várias modelagens diferentes (algumas pode ser encontradas na pasta support) e sempre que eu terminava a modelagem para começar a escrever o código, me deparava com algum empecilho que me impediria de continuar daquela maneira.
Durante o desenvolvimento, optei por criar uma branch separada e fazer tudo através de pull requests documentados, adicionando ci (continuous integration) que só me deixava fazer o merge com todos os testes passando. Essa decisão me salvou em várias vezes onde dei push no código sem perceber que havia quebrado alguns testes.
Organizei os pull requests em features principais, e após acabar as implementações já fazia os testes unitários referentes aquela lógica, tentando manter sempre uma média acima de 80% de cobertura.
Tive apenas uma dificuldade com os testes unitários, que foi testar uma preview feature do prisma, não encontrei solução para isso e inclusive abri uma discussão no github (aqui) para tentar resolver o problema, mas não tive resposta até agora.
Algo interessante que me orgulho de ter feito, foi criar um script responsável por atualizar randomicamente o preço das ações do banco de dados a cada 5 segundos por padrão. Fiz isso pois construi boa parte da lógica de negócio durante o final de semana e pela madrugada, quando o mercado não estava aberto e com isso, não conseguiria ver o funcionamento da lógica. Com esse script eu pude simular a variação de preço de um ativo enquanto o mercado está aberto, em qualquer horário e qualquer dia.
Endpoint | Descrição |
---|---|
/register | Registra um cliente no banco de dados |
/login | Usado para logar um usuário, retorna um token |
Endpoint | Descrição |
---|---|
/investments/buy | Registra a compra de um ativo, diminuindo o saldo disponível |
/investments/sell | Registra a venda de um ativo, aumentando o saldo disponível |
Endpoint | Descrição |
---|---|
/account/deposit | Realiza um depósito na conta |
/account/withdrawal | Realiza um saque da conta |
/account/balance | Retorna o saldo disponível e investido da conta |
/account/assets | Retorna uma lista com as ações no portfolio do cliente |
/account/transactions-statement | Retorna um extrato das transações efetuadas pela conta, recebe page e type no query param |
/account/investments-statement | Retorna um extrato dos investimentos efetuados pela conta, recebe page e type no query param |
Endpoint | Descrição |
---|---|
/assets/:id | Retorna as informações sobre um ativo |
/assets | Retorna uma lista com todos os ativos |
- Transportar a lógica para uma aplicação em Nest.js;
- Criar testes de integração e E2E;
- Adicionar tabela intermediária, guardando as ordens de compra e venda;
- Adicionar lógica para calcular corretamente o preço médio;
- Adicionar lógica para calcular a variação patrimonial e de um ativo, dado um período;
- .....
Projeto desenvolvido por Leonardo Vogel