Contexto
Simulação de uma API dockerizada para um site interno de transações financeiras, no qual é possível realizar transferências e consultar seus dados, além de poder filtrar as transações realizadas em cash-in e cash-out.
A api foi construída utilizando PostgreSQL, TypeScript e Node.js, no modelo MSC (model, service e controller). Sendo TypeORM responsável pela conexão com o banco de dados, service pelas regras de negócio, e controller por lidar com as requisições e respostas.
A partir da rota de login, todas as rotas são autenticadas utilizando JWT.
Para uma boa estruturação do código foi configurado o ESLint.
Você pode testar a aplicação através do docker seguindo a explicação em "Como rodar o projeto na sua máquina".
Habilidades desenvolvidas durante o desenvolvimento do projeto:
- 🔥 Organizar uma aplicação completa desde o primeiro passo; 🔥
- Criar e modelar um banco de dados utilizando TypeORM;
- Estruturar uma aplicação em camadas;
- Delegar responsabilidades específicas para cada camada;
- Entender e aplicar os padrões REST;
- 🔥 Criar aplicação dockerizada; 🔥
- Utilizar Dotenv para as variáveis de ambiente secretas.
Tecnologias utilizadas:
- Typescript,
- Node.js,
- Nodemon,
- Express.js,
- Dotenv,
- PostgreSQL,
- TypeORM,
- JWT,
- Joi,
- Eslint,
- Express-async-errors,
- Bcrypt,
- Joi-password-complexity.
Como rodar o projeto na sua máquina:
✨ Rodando com Docker
Clone o projeto em uma pasta/repositório git com o comando
git clone
-
Caso não tenha o git instalado em sua máquina, você pode realizar a instalação através da documentação
-
Entre na pasta do projeto clonado
Instale as dependências com
npm install
- Para a aplicação funcionar corretamente você precisa editar o arquivo .env.example:
-
alterar as variáveis de ambiente com o seu nome de usuário e senha de conexão com o banco de dados.
-
mudar o nome do aquivo para .env, caso contrário a aplicação não encontrará o arquivo.
-
Você consegue encontrar mais informações aqui
-
Rode os containers com o comando
docker-compose up -d
-
Esse serviço irá inicializar dois containers chamados postgres(port: 5432) e ng-finance(port: 3000)
-
✨E pronto!! O projeto está rodando na sua máquina✨
👀 De olho nas dicas:
- Para rodar o projeto desta forma, obrigatóriamente você deve ter o
Git
, oDocker
e oDocker-compose
instalados em seu computador.
Informações sobre o banco de dados:
A imagem acima exemplifica o banco de dados e as relações entre as tabelas
- A tabela users possui informações sobre os usuários;
- A tabela transactions possui informações das transações feita por cada usuário;
- A tabela accounts possui informações da conta de cada usuário: Essa tabela possui um relacionamento N:1 com a tabela transactions e 1:1 com a tabela users. Sendo assim, uma conta pode possuir várias transações, mas uma transação só pode ser feita por uma conta e uma conta só pode pertencer a um usuário assim como um usuário só pode ter uma conta.
Regras de negócio:
- Qualquer pessoa deverá poder utilizar a aplicação. Para isso, basta realizar o cadastro informando username e password.
- Deve-se garantir que cada username seja único e composto por, pelo menos, 3 caracteres.
- Deve-se garantir que a password seja composta por pelo menos 8 caracteres, um número e uma letra maiúscula. Lembre-se que ela deverá ser hashada ao ser armazenada no banco.
- Durante o processo de cadastro de um novo usuário, sua respectiva conta deverá ser criada automaticamente na tabela Accounts com um balance de R$ 100,00. É importante ressaltar que caso ocorra algum problema e o usuário não seja criado, a tabela Accounts não deverá ser afetada.
- Todo usuário deverá conseguir logar na aplicação informando username e password. Caso o login seja bem-sucedido, um token JWT (com 24h de validade) deverá ser fornecido.
- Todo usuário logado (ou seja, que apresente um token válido) deverá ser capaz de visualizar seu próprio balance atual. Um usuário A não pode visualizar o balance de um usuário B, por exemplo.
- Todo usuário logado (ou seja, que apresente um token válido) deverá ser capaz de realizar um cash-out informando o username do usuário que sofrerá o cash-in), caso apresente balance suficiente para isso. Atente-se ao fato de que um usuário não deverá ter a possibilidade de realizar uma transferência para si mesmo.
- Toda nova transação bem-sucedida deverá ser registrada na tabela Transactions. Em casos de falhas transacionais, a tabela Transactions não deverá ser afetada.
- Todo usuário logado (ou seja, que apresente um token válido) deverá ser capaz de visualizar as transações financeiras (cash-out e cash-in) que participou. Caso o usuário não tenha participado de uma determinada transação, ele nunca poderá ter acesso à ela.
- Todo usuário logado (ou seja, que apresente um token válido) deverá ser capaz de filtrar as transações financeiras que participou por:
Transações de cash-out;
Transações de cash-in.