Sistema completo de controle de patrimônio e inventário com backend NestJS e frontend React. API RESTful com autenticação, validação, documentação automática e interface moderna.
├── backend/ # API NestJS
│ ├── src/ # Código fonte do backend
│ ├── test/ # Testes
│ ├── scripts/ # Scripts de setup
│ ├── docker-compose.yml # Orquestração Docker
│ └── package.json # Dependências do backend
├── frontend/ # Interface React
│ ├── src/ # Código fonte do frontend
│ ├── public/ # Arquivos estáticos
│ └── package.json # Dependências do frontend
├── docs/ # Documentação
└── README.md # Este arquivo
- API RESTful completa
- Autenticação JWT
- CRUD de usuários e patrimônio
- Validação e serialização
- Documentação Swagger
- Testes unitários e E2E
- Containerização Docker
- Interface moderna com Tailwind CSS
- Dashboard interativo
- Autenticação e autorização
- Gerenciamento de patrimônio
- Sistema de notificações
- Relatórios e métricas
- Cache e performance
# 1. Configurar ambiente completo
./scripts/setup-dev.sh
# 2. Iniciar desenvolvimento
./scripts/start-dev.sh# Iniciar tudo automaticamente
./scripts/start-dev.sh# 1. Iniciar banco de dados
docker-compose up db -d
# 2. Backend (terminal 1)
cd backend
npm run start:dev
# 3. Frontend (terminal 2)
cd frontend
npm run devO sistema está organizado em microserviços, cada um em seu próprio container dentro do grupo "backend". Todos compartilham o mesmo PostgreSQL com schemas separados.
- Docker e Docker Compose instalados
- Arquivo
.envconfigurado (veja seção Configuração)
# 1. Construir todas as imagens dos microserviços
docker-compose build auth-service users-service events-service audit-service categorias-service patrimonio-service
# 2. Iniciar banco de dados e Redis
docker-compose up -d db redis
# 3. Aguardar banco estar pronto (alguns segundos)
# Os schemas serão criados automaticamente na primeira inicialização
# 4. Iniciar todos os microserviços
docker-compose up -d auth-service users-service events-service audit-service categorias-service patrimonio-service
# Ou iniciar tudo de uma vez:
docker-compose up -d# Ver status de todos os containers
docker-compose ps
# Ver apenas os microserviços do backend (usando labels)
docker ps --filter "label=com.patrimonio.group=backend"
# Ver logs de um serviço específico
docker-compose logs -f auth-service
# Ver logs de todos os microserviços
docker-compose logs -f auth-service users-service events-service audit-service categorias-service patrimonio-service# Auth Service (Porta 3001)
curl http://localhost:3001/health
# Users Service (Porta 3002)
curl http://localhost:3002/health
# Events Service (Porta 3003)
curl http://localhost:3003/health
# Audit Service (Porta 3004)
curl http://localhost:3004/health
# Categorias Service (Porta 3005)
curl http://localhost:3005/health
# Patrimonio Service (Porta 3006)
curl http://localhost:3006/health| Serviço | Porta | Container | Schema PostgreSQL |
|---|---|---|---|
| auth-service | 3001 | patrimonio_backend_auth_service |
auth |
| users-service | 3002 | patrimonio_backend_users_service |
users |
| events-service | 3003 | patrimonio_backend_events_service |
events |
| audit-service | 3004 | patrimonio_backend_audit_service |
audit |
| categorias-service | 3005 | patrimonio_backend_categorias_service |
categorias |
| patrimonio-service | 3006 | patrimonio_backend_patrimonio_service |
patrimonio |
# Parar todos os serviços
docker-compose down
# Parar e remover volumes (CUIDADO: apaga dados)
docker-compose down -v
# Reiniciar um serviço específico
docker-compose restart auth-service
# Reconstruir e reiniciar um serviço
docker-compose up -d --build auth-service
# Ver logs em tempo real
docker-compose logs -f
# Acessar container de um serviço
docker exec -it patrimonio_backend_auth_service shOs schemas são criados automaticamente na primeira inicialização do PostgreSQL. O script está em:
./backend/scripts/database/init/create-schemas.sql
Para verificar os schemas criados:
docker exec patrimonio_inventario_db psql -U postgres -d patrimonio_inventario -c "\dn"Para mais detalhes sobre a estrutura dos containers, veja:
$response = Invoke-RestMethod -Uri "http://localhost:3101/v1/auth/dev-token" -Method POST -Headers @{"Content-Type"="application/json"} -ErrorAction Stop; Write-Host "✅ Novo token obtido:" -ForegroundColor Green; Write-Host "Token: $($response.accessToken)" -ForegroundColor Yellow; Write-Host "User: $($response.user.email)" -ForegroundColor Blue; Write-Host "Role: $($response.user.role)" -ForegroundColor Blue; $response.accessToken$userId = (Invoke-RestMethod -Uri "http://localhost:3101/v1/auth/dev-token" -Method POST -Headers @{"Content-Type"="application/json"}).user.id; Write-Host "✅ ID do usuário: $userId" -ForegroundColor Green; $userId$token = (Invoke-RestMethod -Uri "http://localhost:3101/v1/auth/dev-token" -Method POST -Headers @{"Content-Type"="application/json"}).accessToken; $headers = @{"Authorization"="Bearer $token"; "Accept"="application/json"}; $requests = Invoke-RestMethod -Uri "http://localhost:3101/v1/reports/requests" -Method GET -Headers $headers; $requests | ForEach-Object { Write-Host "ID: $($_.id) | Status: $($_.status) | Tipo: $($_.type)" -ForegroundColor Cyan }$token = (Invoke-RestMethod -Uri "http://localhost:3101/v1/auth/dev-token" -Method POST -Headers @{"Content-Type"="application/json"}).accessToken; $headers = @{"Authorization"="Bearer $token"; "Accept"="application/json"}; $completed = Invoke-RestMethod -Uri "http://localhost:3101/v1/reports/requests?status=completed" -Method GET -Headers $headers; if ($completed.Count -gt 0) { Write-Host "✅ ID válido para download: $($completed[0].id)" -ForegroundColor Green; $completed[0].id } else { Write-Host "❌ Nenhum relatório com status 'completed' encontrado" -ForegroundColor Red; Write-Host "💡 Crie uma nova solicitação de relatório primeiro" -ForegroundColor Yellow }$token = (Invoke-RestMethod -Uri "http://localhost:3101/v1/auth/dev-token" -Method POST -Headers @{"Content-Type"="application/json"}).accessToken; $headers = @{"Authorization"="Bearer $token"; "Content-Type"="application/json"}; $body = @{ type = "csv"; model = "patrimonio"; filters = @{} } | ConvertTo-Json; $response = Invoke-RestMethod -Uri "http://localhost:3101/v1/reports/requests" -Method POST -Headers $headers -Body $body; Write-Host "✅ Solicitação criada: $($response.id)" -ForegroundColor Green; Write-Host "Status: $($response.status)" -ForegroundColor Yellow; $response.id# Banco de dados
DB_HOST=localhost
DB_PORT=5432
DB_USER=postgres
DB_PASS=postgres
DB_NAME=patrimonio_inventario
# Backend
BACKEND_PORT=3101
NODE_ENV=development
# Frontend
FRONTEND_PORT=5173
VITE_API_BASE_URL=http://localhost:3101
VITE_APP_NAME=Patrimônio Inventário
# Segurança
HASH_PEPPER=your-pepper-here
HASH_SALT_ROUNDS=12- Frontend: http://localhost:5173
- Backend: http://localhost:3101
- Swagger: http://localhost:3101/docs
- Auth Service: http://localhost:3001 (Swagger: http://localhost:3001/api)
- Users Service: http://localhost:3002 (Swagger: http://localhost:3002/api)
- Events Service: http://localhost:3003 (Swagger: http://localhost:3003/api)
- Audit Service: http://localhost:3004 (Swagger: http://localhost:3004/api)
- Categorias Service: http://localhost:3005 (Swagger: http://localhost:3005/api)
- Patrimonio Service: http://localhost:3006 (Swagger: http://localhost:3006/api)
- Database: localhost:5432
- Redis: localhost:6379
- Estrutura dos Containers do Backend - Como os microserviços estão organizados
- Status Final dos Containers - Status atual e verificação
- Setup Docker
- Branch Protection
- Definition of Done
- Governance Audit
# Testes do Backend
cd backend
npm test
npm run test:e2e
# Testes do Frontend
cd frontend
npm test
# Testes completos (raiz do projeto)
./scripts/setup-dev.sh # Inclui testes- ✅ Backend NestJS completo
- ✅ Frontend React moderno
- ✅ Autenticação e autorização
- ✅ CRUD completo
- ✅ Containerização Docker
- ✅ Testes automatizados
- ✅ Documentação Swagger
- 🔄 Testes E2E completos
- 🔄 Métricas avançadas
- 🔄 Performance testing
- 🔄 Deploy automatizado
- Fork o projeto
- Crie uma branch (
git checkout -b feat/nova-funcionalidade) - Commit suas mudanças (
git commit -m 'feat: adiciona nova funcionalidade') - Push para a branch (
git push origin feat/nova-funcionalidade) - Abra um Pull Request
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Desenvolvido com ❤️ usando NestJS e React