Aplicação fullstack para transferências internas entre usuários, composta por:
- backend
NestJS - frontend
Vue 3 PostgreSQLRedis- autenticação JWT
- proteção de repetição para
POST /wallet/transfercomIdempotency-Key
Com docker compose, o backend executa migrations e seed automaticamente antes de iniciar a API.
cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.env
docker compose up --build- frontend:
http://localhost:5173 - backend:
http://localhost:3000 - swagger:
http://localhost:3000/api/docs
- Acesse
http://localhost:5173/login. - Informe
usernameepassword. - Ao autenticar, o frontend salva
tokeneusernamenolocalStorage. - O usuário é redirecionado para
/dashboard.
- Acesse
http://localhost:5173/register. - Informe um
usernamecom pelo menos 3 caracteres. - Informe uma senha com pelo menos 8 caracteres, contendo uma letra maiúscula e um número.
- Após sucesso, o frontend redireciona para a tela de login.
Regra de negócio implementada:
- todo novo usuário é criado com saldo inicial fixo de
100.0000 - essa regra é tratada como política obrigatória do domínio no fluxo de criação de conta
- o cadastro não aceita nem propaga
initialBalancecomo entrada - essa regra não depende de variável de ambiente
- Entre no dashboard autenticado.
- Preencha o
usernamedo destinatário. - Informe o valor.
- O frontend envia
POST /wallet/transfercomAuthorization: Bearer <token>eIdempotency-Key.
Observações reais do código:
- o backend aceita até 4 casas decimais;
- o frontend valida e envia no máximo 2 casas decimais;
- o backend bloqueia transferências para o próprio usuário;
- a proteção de idempotência usa Redis e impede repetir a mesma chave dentro do TTL configurado.
- Entre no dashboard.
- A tabela de histórico é carregada automaticamente.
- O frontend consulta
GET /wallet/transactionscom paginação. - A interface mostra 5 registros por página.
Os filtros disponíveis na interface são:
- data inicial
- data final
- tipo:
cash-inoucash-out - ordem:
DESCouASC
A API também aceita:
pagelimit
- Clique em
Sairno dashboard. - O frontend chama
POST /auth/logout. - Em seguida, remove
tokeneusernamedolocalStorage. - O usuário volta para
/login.
Importante: o endpoint /auth/logout apenas retorna uma mensagem informativa. O JWT não é invalidado no servidor.
Todos usam a senha Senha123:
Todos também começam com saldo inicial fixo de 100.0000, aplicado pela mesma regra obrigatória usada no cadastro.
janedoejohndoealice_smithbob_jonescharlie_browndiana_princeedward_elricfiona_gallaghergeorge_costanzahannah_montana
Pré-requisitos:
- PostgreSQL disponível e configurado via
.env - Redis disponível e configurado via
.env
cd backend
cp .env.example .env
npm install
npm run migration:run
npm run seed
npm run start:devcd frontend
cp .env.example .env
npm install
npm run devcd backend
npm testcd frontend
npm test