Sistema de Locação de Trajes a Rigor — Frontend Electron/Web.
- Funcionalidades
- Tecnologias
- Arquitetura
- Princípios Aplicados
- Como Executar
- Testes
- Qualidade de Código
- CI/CD
- Scripts Disponíveis
- Configuração da API
Três domínios principais, todos com CRUD completo, filtros e paginação:
- Clientes — cadastro, edição, listagem com busca, exclusão lógica e recuperação, busca de CEP via viaCEP, registro de medidas masculinas/femininas.
- Trajes — cadastro/edição com upload de imagem, listagem com filtros (tipo, cor, tamanho, status), calendário de disponibilidade.
- Aluguéis — criação com selecionador de trajes (foto + disponibilidade), listagem com filtros (status, cliente, datas, ocasião), edição, registro de devolução com condição por traje, geração de contrato em PDF (abre em nova aba) e exclusão.
- Electron 33+ — runtime desktop (também roda no navegador via Vite)
- React 18 + TypeScript 5
- Vite 6 — bundler e dev server
- React Router 6 — roteamento
- React Bootstrap + Bootstrap 5 — UI
- Axios — cliente HTTP
- Zod — validação de schemas
- lucide-react — ícones
- electron-log — logging
src/
├── domain/ # Camada interna (regras de negócio puras)
│ ├── entidades/ # Models (Cliente, Aluguel, Traje, etc.)
│ ├── interfaces/ # Contratos dos repositórios
│ └── erros/ # Erros de domínio (FalhaConexao, RecursoNaoEncontrado, …)
│
├── application/ # Casos de uso (orquestração)
│ ├── alugueis/ # Criar, Listar, Editar, Devolver, GerarContrato, …
│ ├── clientes/ # Cadastrar, Editar, Excluir, Recuperar, BuscarCep, …
│ └── trajes/ # CRUD + Disponibilidade
│
├── infrastructure/ # Implementações externas
│ └── api/ # Repositórios Axios (Aluguel, Cliente, Traje, Enum)
│
├── interfaces-graficas/ # Camada externa (UI)
│ ├── componentes/ # Botão, Card, Tabela, Modal, Calendário, Layout, …
│ ├── paginas/ # alugueis/, clientes/, trajes/, dashboard/
│ └── utils/ # Helpers de formatação, alias de enums
│
├── App.tsx # Setup das rotas
└── main.tsx # Entry point Vite/React
A regra é: dependências apontam de fora para dentro. interfaces-graficas depende de application, que depende de domain. infrastructure implementa interfaces de domain e é injetada pelas páginas.
- S — Single Responsibility (cada use case faz uma coisa só)
- O — Open/Closed (novos casos de uso sem alterar repositórios)
- L — Liskov Substitution (qualquer implementação de
IAluguelRepositoryfunciona nos use cases) - I — Interface Segregation (contratos focados por domínio)
- D — Dependency Inversion (use cases dependem de interfaces, não de Axios)
- Node.js 18+
- Backend TCC rodando em
http://localhost:8080
npm install# Web (Vite, abre em http://localhost:5173)
npm run dev
# Desktop (Electron)
npm run dev:electron# Build completo (Vite + Electron Builder)
npm run build
# Apenas Vite (web)
npm run build:viteO instalador desktop é gerado em release/.
Stack: Jest + React Testing Library + jest-environment-jsdom.
npm run test # roda todos
npm run test:watch # modo watch
npm run test:coverage # coverage em coverage/jest.config.cjs— configuração principal (transforms, moduleNameMapper, setup)src/setupTests.ts— extensões@testing-library/jest-domsrc/__mocks__/— mocks de assets estáticos (CSS, imagens)
Threshold mínimo de 50%. Casos de uso (application/) e repositórios (infrastructure/api/) têm cobertura próxima de 100%.
npm run lint # checagem
npm run lint:fix # autofixPlugins ativos: @typescript-eslint, react, react-hooks, react-refresh, jsx-a11y, prettier.
npm run prettier # formata src/**
npm run prettier:check # apenas verificanpm run typecheck # tsc --noEmitWorkflows do GitHub Actions em .github/workflows/:
| Workflow | Etapas |
|---|---|
ci.yml |
Lint → typecheck → testes com coverage → build Vite → build Electron |
code-quality.yml |
ESLint + TypeScript |
Executores: Ubuntu latest, Node 20, com cache de node_modules.
| Script | Descrição |
|---|---|
npm run dev |
Dev server Vite |
npm run dev:electron |
Dev server + Electron |
npm run build |
Build de produção (Vite + Electron Builder) |
npm run build:vite |
Apenas build web |
npm run preview |
Preview do build Vite |
npm run electron |
Roda Electron contra o build atual |
npm run lint / lint:fix |
ESLint |
npm run typecheck |
tsc --noEmit |
npm run test / test:watch / test:coverage |
Jest |
npm run prettier / prettier:check |
Prettier |
electron/
├── main.ts # Processo principal (main process)
└── preload.ts # Bridge IPC seguro (preload script)
contextIsolation: true— isolamento de contextonodeIntegration: false— sem acesso direto ao Node.jssandbox: true— renderer em sandboxcontextBridge— exposição segura de APIs
Por padrão, os repositórios apontam para http://localhost:8080. Os arquivos relevantes:
src/infrastructure/api/AluguelApiRepository.tssrc/infrastructure/api/ClienteApiRepository.tssrc/infrastructure/api/TrajeApiRepository.tssrc/infrastructure/api/EnumApiRepository.ts
GET/POST/PUT/DELETE /alugueis+/alugueis/{id}/devolucao+/alugueis/{id}/contrato(PDF)GET/POST/PUT/DELETE /clientes+/clientes/{id}/recuperarGET/POST/PUT/DELETE /trajes+/trajes/{id}/imagemGET /enums/...para selects