Olá Bem vindo ao repositório do desafio técnico de back-end da Xp!
🤔 O que esse projeto faz?
O desafio técnico se baseia em uma API de investimentos onde temos que desenvolver um back-end que possibilite o usuário realizar as seguintes operações dentro do banco de dados:
-
- Nessa rota será possível que o usuário se cadastre na plataforma, gerando o nosso hash/token JWT.
- Para o funcionamento padrão é necessário fazer uma requisição post passando os dados em JSON, com a seguinte estrutura:
{ "fullName": "Nome do usuário", "email": "teste@teste.com", "password": "senha" }
Se tudo estiver ok, será retornado um token;
-
- Nessa rota será possível que o usuário se cadastre na plataforma, gerando o nosso hash/token JWT.
- Para o funcionamento padrão é necessário fazer uma requisição post passando os dados em JSON, com a seguinte estrutura:
{ "email": "teste@teste.com", "password": "senha" }
Se tudo estiver ok, será retornado um token;
-
- Com esse método, será retornado todas os ativos existentes no nosso banco de dados de simulação. Lembre-se de estar com o token na aplicação
- Virá algo parecido com isso:
[ { "codAtivo": 11, "NomeAtivo": "XP", "QtdeAtivo": 280, "Valor": "104.74" }, { "codAtivo": 7, "NomeAtivo": "MRVE3", "QtdeAtivo": 200, "Valor": "87.33" }, { "codAtivo": 5, "NomeAtivo": "SULA11", "QtdeAtivo": 160, "Valor": "66.14" }, { "codAtivo": 12, "NomeAtivo": "HAPV3", "QtdeAtivo": 200, "Valor": "80.8" }, { "codAtivo": 10, "NomeAtivo": "RADL3", "QtdeAtivo": 200, "Valor": "64.29" }, { "codAtivo": 1, "NomeAtivo": "ABEV3", "QtdeAtivo": 200, "Valor": "54.68" }, { "codAtivo": 4, "NomeAtivo": "AMER3", "QtdeAtivo": 200, "Valor": "83.74" }, { "codAtivo": 9, "NomeAtivo": "BRKM5", "QtdeAtivo": 200, "Valor": "154.45" }, { "codAtivo": 14, "NomeAtivo": "BBDC4", "QtdeAtivo": 200, "Valor": "63.59" }, { "codAtivo": 2, "NomeAtivo": "GOLL4", "QtdeAtivo": 200, "Valor": "84.19" }, { "codAtivo": 15, "NomeAtivo": "PETR4", "QtdeAtivo": 200, "Valor": "54.64" }, { "codAtivo": 13, "NomeAtivo": "MGLU3", "QtdeAtivo": 200, "Valor": "185.67" }, { "codAtivo": 8, "NomeAtivo": "NTCO3", "QtdeAtivo": 200, "Valor": "124.41" }, { "codAtivo": 3, "NomeAtivo": "BIDI11", "QtdeAtivo": 200, "Valor": "159.38" }, { "codAtivo": 6, "NomeAtivo": "CIELO", "QtdeAtivo": 200, "Valor": "81.33" } ]
-
- Com esse método será retornado apenas a ação específica pedida, algo como:
{ "codAtivo": 11, "NomeAtivo": "XP", "QtdeAtivo": 280, "Valor": "100.44" }
Lembre-se de estar com o token na aplicação!
-
- Com esse método iremos adicionar dinheiro na conta do cliente, para isso, passaremos apenas o valor que queremos adicionar:
{ "valor": 120000 }
Lembre-se de estar com o token na aplicação!
-
- Com esse método iremos sacar dinheiro na conta do cliente, para isso, passaremos apenas o valor que queremos sacar:
{ "valor": 6000 }
Lembre-se de estar com o token na aplicação!
-
- Com esse método iremos receber um saldo da conta do cliente, não passamos nada, apenas faremos a requisição na rota:
{ "saldo": 6000 }
Lembre-se de estar com o token na aplicação!
-
- Com esse método iremos receber um saldo do valor, não passamos nada, apenas faremos a requisição na rota:
[ { "CodAtivo": 5, "QtdeAtivo": 20, "Valor": "75.47" } ]
Lembre-se de estar com o token na aplicação!
-
- Com esse método iremos comprar uma quantidade de ações, para isso, precisamos adicionar os seguintes dados para a compra:
{ "codAtivo": 5, "qtdeAtivo": 10 }
Lembre-se de estar com o token na aplicação!
-
- Com esse método iremos vender uma quantidade de ações, para isso, precisamos adicionar os seguintes dados para a venda:
{ "codAtivo": 5, "qtdeAtivo": 10 }
Lembre-se de estar com o token na aplicação!
🔧 Quais ferramentas foram utilizadas?
-
Linguagens:
Typescript
-
Ambiente de execução:
node.js, nodemon
-
Frameworks:
Express, Express-async-errors
-
Banco de dados:
Postgres
-
ORM:
TypeORM
-
Criptografia:
JsonWebToken, Bcrypt
-
Requisições HTTP:
Axios, cors
-
Validações:
JOI
-
Esteira de atividades:
Cron
-
Variáveis de ambiente:
Dotenv
⚙️ O que precisamos para que tudo funcione bem?
-
Para clonar a nossa aplicação utilizaremos o método SSH, e caso não tenha entre neste link de chave ssh para aprender como criar e configurar. Caso queira fazer uma forma alternativa utilize o método https mas a forma de clonagem utilizada não aborda esse método.
-
Para rodar a aplicação, teremos a forma de rodar o mesmo localmente na sua máquina, ou utilizando um container do docker, e para isso é necessário ter o mesmo instalado e configurado. Aqui esta um link, onde você pode fazer essas configurações
🚨 O que fazer quando encontrar erros?
Caso encontre algum erro referente a sintaxe ou funcionamento do mesmo, abra uma Issue
-
Para iniciarmos, clique em issues como na foto abaixo:
-
Após isso, clique em new issue:
-
Agora adicione um título sobre problema encontrado e adicione uma descrição mostrando como ocorreu o erro. Por fim clique no botão submit new issue:
-
E pronto, o problema já foi documentado e será resolvido o mais rápido possível.
💌 O que fazer após o code-review?
Após o seu review sobre tudo o que foi abordado, deixo como sugestão responder este [formulário de feedback](https://forms.gle/UtHgnNkQ3gDZPyzi8), desenvolvido por mim para auxiliar na melhoria desse e de outros projetos.
Para que essa aplicação funcione na sua máquina, será necessário seguir os seguintes passos:
- Abra o CMD/terminal de comando do seu sistema através da pesquisa e faça os seguintes passo:
- Se você utiliza
linux
em português, digitecd Área\ de\ Trabalho
- Caso utilize o
windows
ou linux em inglês, digitecd desktop
- Se você utiliza
- Agora que estamos área de trabalho, no terminal utilize o comando
git clone git@github.com:PedrHenrick/challenge_investment_xp.git
para clonar a pasta do repositório - Logo depois entre na pasta clonada utilizando o comando
cd challenge_investment_xp
- Dentro da pasta, execute o comando
npm install
para instalar todas as dependências do projeto - Para rodar a aplicação no terminal digite o comando
npm start
. Caso prefira, você também pode rodar a aplicação utilizando o docker, basta rodar o comandodocker-compose-up -d --build
, mas nesse caso rode também o comandodocker exec -it investiment_api bash
e digitenpm start
.
E pronto! Já temos nossa aplicação na sua máquina e rodando. Agora você já pode fechar o terminal!
- Para esse projeto, inicialmente achei de extrema importância decidir qual seria o ecossistema de tecnologias que eu poderia usar com as ferramentas que tinha em mãos, ferramentas essas listada na aba ferramentas utilizadas.
- Após essa definição, tive que definir como ficaria o banco de dados que eu iria utilizar, uma vez que o mesmo deveria ser construído para o encaminhamento e conclusão do projeto. Trago um exemplo final dele com o DER - diagrama de entidade e relacionamento
- Já com as ferramentas separadas e com o diagrama montado, separei um tempo para:
- Definir o modelo de organização de pastas que eu iria utilizar, sendo o MSC o escolhido
- Definir quais seriam as regras de negócio para as rotas
- Verificar como iriam ficar as estruturas das rotas,
- Como seria a estruturação dos retornos, uma vez que seria necessário a serialização dos dados que chegam do banco
- Definir possíveis features novas, onde algumas, vieram a ser implementadas durante o desenvolvimento.
- Tentei seguir em todo o momento durante o desenvolvimento da aplicação, algo que fosse mais próximo do que foi pedido também no front-end, facilitando as informações passadas, teve alguns momentos onde as informações do diagrama que foi apresentado não se encaixariam, então decidir realizar algumas mudanças para o melhor funcionamento da aplicação.
Para a verificação das rotas, é necessário o uso de algum programa que consiga fazer essas requisições nas rotas. Para facilitar isso, trago algumas opções:
- Postman - O postman foi usado em toda a nossa aplicação, onde no mesmo também foi criado uma estrutura de pastas já com as requisições definidas, segue estrutura neste link
- Swagger - Também é possivel utilizar a nossa documentação detalhada do swagger, facilitando o uso das rotas, basta entrar na rota
/docs
da aplicação
Para a evolução o projeto, fica claro algumas modificações que devem serem feitas. São elas:
- Adicionar testes unitários
- Adicionar testes de integração
- Melhorar lógica de recompra de ativos, ou seja, quando um cliente compra um ativo mais de uma vez, pois que os valores se modificam aleatóriamente e a primeira compra pode não ter o mesmo valor da segunda, gerando uma compra extra de ações, com dois valores. Na aplicação aleta somente a quantidade, nas vendas é pego o valor atual, mas na tabela que mostra as compras consta somente o primeiro valor.
- Aplicar o SOLID
- Sempre verifique se você está com o seu token nas rotas, é a partir dele que você conseguirá executar as requisições sem o menor problema.
- Foi usado na construção da aplicação um método de atualização automática dos valores do banco de dados, não é nenhum bug da API a cada 5 segundos os valores podem diminuir e aumentar aleatoriamente