ng-cash.mp4
Esta aplicação, denominada NG.CASH, é uma plataforma de gerenciamento financeiro que permite aos usuários realizar operações como cadastro, login, visualização de saldo, transferências e consulta de transações.
Desenvolvida como parte de um teste para a vaga de Junior Full Stack (que recebi quando ainda estava iniciando e não sabia como fazer), a aplicação é composta por um backend construído em Node.js com Typescript, utilizando o Prisma ORM e persistindo dados em um banco PostgreSQL (Utilizando Docker).
O frontend é implementado Next.js, Typescript, e utiliza CSS3 com uma biblioteca de estilização (Ant Design).
- Precisa usar Docker;
- Um servidor em Node.js utilizando Typescript;
- Prisma ORM (poderia escolher qualquer um);
- Os dados da aplicação precisam estar persistidos em um banco PostgreSQL;
- React ou Next utilizando Typescript;
- CSS3 ou uma biblioteca de estilização de sua preferência (estou usando Ant Desing para testar);
- Página para realizar o cadastro na NG informando username e password;
- Página para realizar o login informando username e password;
- Balance atual do usuário;
- Seção voltada à realização de transferências para outros usuários NG a partir do username de quem sofrerá o cash-in;
- Tabela com os detalhes de todas as transações que o usuário participou;
- Mecanismo para filtrar a tabela por tipo de transação cash-in/cash-out;
- Botão para realizar o log-out;
- Deve ser possível se cadastrar um User (informe username, password para cadastrar);
- (depois cadastro), automaticamente cria 1 account, na tabela account com R$100 de balance;
- Deve ser possível logar um User (informe username, password para cadastrar);
- (depois de logado) Deve ser possível ver balance do User
- (depois de logado) Deve ser possível ver Tabela com os detalhes de todas as transações que o usuário participou
- (depois de logado) Deve ser possível transferir para outros usuários NG a partir do username de quem sofrerá o cash-in
- (depois de logado) Deve ser possível filtrar a tabela por tipo de transação cash-in/cash-out; (fiz o filtro adicionando na tabela transactions, o filtro será feito no front end)
- (depois de logado) Deve ser possível realizar logOut (vou fazer no front retirando o cookie JWT)
- Deve ser possível se cadastrar um User (informe username, password para cadastrar);
- (depois cadastro), automaticamente cria 1 account, na tabela account com R$100 de balance;
- Deve ser possível logar um User (informe username, password para cadastrar);
- (depois de logado) Deve ser possível ver balance do User
- (depois de logado) Deve ser possível ver Tabela com os detalhes de todas as transações que o usuário participou
- (depois de logado) Deve ser possível transferir para outros usuários NG a partir do username de quem sofrerá o cash-in
- (depois de logado) Deve ser possível filtrar a tabela por tipo de transação cash-in/cash-out;
- (depois de logado) Deve ser possível realizar logOut
- username tem que ser único;
- username composto por, pelo menos, 3 caracteres;
- password composta por pelo menos 8 caracteres, um número e uma letra maiúscula;
- (depois cadastro), automaticamente cria 1 account, na tabela account com R$100 de balance;
- (depois de logado) pode fazer cash-out informando o username do usuário que sofrerá o cash-in;
- (depois de logado) 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 deverá ser capaz de filtrar as transações financeiras que participou por: (será feito no front end) Transações de cash-out; Transações de cash-in;
- Só pode cash-out se tiver balance suficiente para isso;
- 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;
- username tem que ser único;
- username composto por, pelo menos, 3 caracteres;
- password composta por pelo menos 8 caracteres, um número e uma letra maiúscula;
- (depois cadastro), automaticamente cria 1 account, na tabela account com R$100 de balance;
- (depois de logado) pode fazer cash-out informando o username do usuário que sofrerá o cash-in;
- (depois de logado) 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 deverá ser capaz de filtrar as transações financeiras que participou por: Transações de cash-out; Transações de cash-in;
- Só pode cash-out se tiver balance suficiente para isso;
- 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;
- A senha do usuário precisa estar criptografada ao armazenar no Banco de Dados;
- O usuário deve ser identificado por um JWT depois de se logar (JSON Web Token) (com 24h de validade);
- A senha do usuário precisa estar criptografada ao armazenar no Banco de Dados;
- O usuário deve ser identificado por um JWT depois de se logar (JSON Web Token) (com 24h de validade);
- Node.js
- Typescript
- Prisma ORM
- PostgreSQL
- Docker
- Next.js
- Typescript
- CSS3, Ant Design
- Clonar o repositorio ou baixar e descompactar
- Criar um arquivo ".env" na pasta "Backend" seguindo os moldes do ".env.example"
- Dentro da pasta "Backend" rodar o comando "docker compose up -d" para ler o arquivo "docker-compose.yml"
- Instalar as dependencias:
- Entrar na pasta "Backend" e rodar "npm install"
- Dentro da pasta "Backend" rodar "npm run dev"
- Dentro da pasta "Frontend" rodar "npm install"
- Dentro da pasta "Frontend" rodar "npm run dev"
- A aplicação estará rodando em http://localhost:3000
Este projeto foi desenvolvido como resposta ao teste para a vaga de Junior Full Stack que recebi a muito tempo atrás, demonstrando habilidades tanto no desenvolvimento do backend quanto do frontend, além de boas práticas de segurança e organização de código.
Se tiver alguma dúvida ou sugestão, sinta-se à vontade para entrar em contato!