🌐 Live: https://fastmeals.com.br | API: https://t2fwiydcrc.execute-api.us-east-1.amazonaws.com
Plataforma fullstack de gerenciamento de delivery com 6 microserviços, dashboard analítico, algoritmo de otimização Hungarian e AI Insights com AWS Bedrock.
- Demo
- Arquitetura
- Clean Architecture + SOLID
- Como Rodar
- Stack Tecnológica
- Microserviços
- Frontend
- Algoritmo de Otimização
- Infraestrutura AWS
- CI/CD Pipeline
- Testes
- Estrutura do Projeto
- Documentação
- Variáveis de Ambiente
- Autor
A plataforma segue uma arquitetura de microserviços com Clean Architecture e princípios SOLID, orquestrada por Docker Compose com Nginx como API Gateway.
Padrões implementados:
- Database per Service — cada serviço com seu PostgreSQL isolado
- CQRS — reports-service com read model dedicado
- Event-Driven — RabbitMQ (topic exchange) para comunicação assíncrona
- API Gateway — Nginx roteando requests para os serviços corretos
- Clean Architecture — Domain → Application → Infrastructure → Lambda
- Lambda per Use Case — cada operação é uma função independente (20 Lambda handlers)
Cada microserviço segue 4 camadas com a Dependency Rule: dependências apontam sempre para dentro — Domain nunca conhece Infrastructure.
Camadas por microserviço:
src/
├── domain/ → Entities, Value Objects, Repository Interfaces
├── application/ → Use Cases, DTOs, Service Interfaces
├── infrastructure/ → Prisma, HTTP Clients, Express Controllers, Config
└── lambda/ → AWS Lambda Handlers (1 per use case)
- Docker Desktop (>= 4.0)
- Node.js (>= 20) — apenas para desenvolvimento local
- Git
# 1. Clonar o repositório
git clone https://github.com/vynnydev/fastmeals.git
cd fastmeals
# 2. Subir todos os serviços (14 containers)
docker compose up --build -d
# 3. Preparar bancos de dados (migrations + seed)
./scripts/prepare-services-linux-mac.shAcesse:
| Aplicação | URL |
|---|---|
| Frontend | http://localhost:3000 |
| API Gateway (Nginx) | http://localhost |
| RabbitMQ Management | http://localhost:15672 (guest/guest) |
| Senha | Perfil | Permissões | |
|---|---|---|---|
| admin@fastmeals.com | Admin@123 | Administrador | Acesso total: CRUD de produtos, pedidos, entregadores |
| viewer@fastmeals.com | Viewer@123 | Visualizador | Somente leitura: visualizar pedidos, produtos e relatórios |
# Terminal 1 — Infraestrutura
docker compose up auth-db products-db orders-db delivery-db reports-db redis rabbitmq -d
# Terminal 2..7 — Cada serviço
cd backend/services/auth-service && npm install && npm run seed && npm run dev
cd backend/services/products-service && npm install && npm run seed && npm run dev
cd backend/services/orders-service && npm install && npm run seed && npm run dev
cd backend/services/delivery-service && npm install && npm run seed && npm run dev
cd backend/services/optimization-service && npm install && npm run dev
cd backend/services/reports-service && npm install && npm run seed && npm run dev
# Terminal 8 — Frontend
cd frontend && npm install && npm run dev# Backend (em cada serviço)
cd backend/services/auth-service && npm test # 19 testes
cd backend/services/products-service && npm test # 24 testes
cd backend/services/orders-service && npm test # 43 testes
cd backend/services/delivery-service && npm test # 20 testes
cd backend/services/optimization-service && npm test # 29 testes
cd backend/services/reports-service && npm test # 18 testes
# Frontend
cd frontend && npm test -- --run # 27 testes
# Teste de fluxo completo (requer Docker rodando)
./scripts/test-flow.sh # 52 assertions| Tecnologia | Versão | Uso |
|---|---|---|
| Node.js | 20 LTS | Runtime |
| TypeScript | 5.7 | Tipagem estrita (strict: true, zero any) |
| Express | 4.21 | HTTP server |
| Prisma | 6.19 | ORM com PostgreSQL |
| PostgreSQL | 16 | Banco relacional (5 instâncias) |
| Redis | 7 | Token store para JWT refresh tokens |
| RabbitMQ | 3.13 | Mensageria assíncrona (topic exchange) |
| Zod | 3.24 | Validação de entrada |
| Pino | 10 | Logs estruturados (JSON) |
| Swagger | 5.0 | Documentação OpenAPI (/docs) |
| bcrypt | — | Hash de senhas (10 salt rounds) |
| JWT | — | Access token (15min) + Refresh token (7d) |
| AWS Bedrock | Claude | AI Insights no reports-service |
| Vitest | 3.0 | Framework de testes |
| Nginx | Alpine | API Gateway / reverse proxy |
| Tecnologia | Versão | Uso |
|---|---|---|
| Next.js | 15.3 | Framework React com App Router |
| React | 19 | UI library |
| TypeScript | 5.7 | Tipagem estrita |
| Tailwind CSS | 4 | Estilização utility-first |
| shadcn/ui | — | Componentes acessíveis (Radix UI) |
| Zustand | 5 | Gerenciamento de estado |
| React Hook Form | 7 | Formulários com validação |
| Zod | 3.24 | Schema validation |
| Recharts | 2.15 | Gráficos e visualizações |
| Axios | 1.7 | HTTP client com interceptors |
| next-themes | 0.4 | Dark/Light mode |
| Vitest + RTL | — | Testes unitários e integração |
| Serviço | Porta | Banco | Testes | Responsabilidade |
|---|---|---|---|---|
| auth-service | 3001 | auth_db + Redis | 19 | JWT login, refresh token, bcrypt |
| products-service | 3002 | products_db | 24 | CRUD produtos, paginação, busca |
| orders-service | 3003 | orders_db | 43 | Pedidos, máquina de estados, inter-service |
| delivery-service | 3004 | delivery_db | 20 | CRUD entregadores, disponibilidade |
| optimization-service | 3005 | — (stateless) | 29 | Hungarian Algorithm + Haversine |
| reports-service | 3006 | reports_db (CQRS) | 18 | Analytics, AI Insights (Bedrock) |
orders-service ──HTTP──▶ products-service (validar produtos + snapshot preço)
orders-service ──HTTP──▶ delivery-service (validar entregador + disponibilidade)
orders-service ──AMQP──▶ RabbitMQ (order.created, order.status.changed)
delivery-service ◀──AMQP── RabbitMQ (atualizar status do entregador)
optimization-service ──HTTP──▶ orders-service (buscar pedidos ready)
optimization-service ──HTTP──▶ delivery-service (buscar entregadores disponíveis)
reports-service ──SQL──▶ reports_db (CQRS read model cross-domain)
| De | Para | Condição |
|---|---|---|
| pending | preparing, cancelled | — |
| preparing | ready, cancelled | — |
| ready | delivering | Requer deliveryPersonId atribuído |
| ready | cancelled | — |
| delivering | delivered | — |
delivering → cancellednão é permitido.deliveredecancelledsão estados finais.
Visão geral com stat cards animados (receita, pedidos, entregas, tempo médio), gráficos de pedidos por status, top produtos e últimos pedidos em tabela.
Três visualizações (Tabela/Cards/Kanban), criação de pedido com carrinho de produtos, transição de status, atribuição manual de entregador e cancelamento.
Grid e tabela com filtros por categoria (Refeições/Bebidas/Sobremesas/Acompanhamentos), busca por nome, CRUD completo com modal de detalhes e imagem.
Cards e Kanban de entregadores (Disponíveis/Em Entrega/Inativos), CRUD completo, e aba de Otimização com algoritmo Hungarian mostrando atribuições sugeridas, distâncias calculadas e comparação antes/depois.
Receita diária, pedidos por status, top produtos, tempo de entrega por veículo (Motocicleta/Bicicleta/Carro), filtro por período, e Insights com IA via AWS Bedrock (Claude) gerando resumo, recomendações e destaques.
| Feature | Descrição |
|---|---|
| Números animados | Contagem progressiva com easing nos stat cards |
| Skeleton loading | Feedback visual durante carregamento |
| Empty states | Mensagens descritivas quando não há dados |
| Error states | Tratamento de erros com botão retry |
| Dark/Light mode | Toggle no header com next-themes |
| Responsividade | Sidebar mobile com hambúrguer menu |
| Permissões | Viewer não vê botões de escrita (CRUD) |
| Kanban drivers | Visualização por status com detalhes do pedido atual |
| Máscara de telefone | Formatação automática (XX) XXXXX-XXXX |
| Atribuição manual | Select com entregadores ocupados desabilitados |
Resolve o Problema de Atribuição: dado N entregadores e M pedidos com status ready, encontra a atribuição que minimiza a distância total percorrida.
Pedido 1 Pedido 2
Pessoa A: 1 km 2 km
Pessoa B: 3 km 10 km
Greedy: A→1 (1km) + B→2 (10km) = 11 km
Hungarian: A→2 (2km) + B→1 (3km) = 5 km ← 54% melhor
Calcula a distância geodésica (curvatura da Terra) entre dois pontos:
a = sin²((lat2 - lat1) / 2) + cos(lat1) · cos(lat2) · sin²((lon2 - lon1) / 2)
c = 2 · atan2(√a, √(1-a))
d = R · c (R = 6371 km)
| Cenário | Tempo | Requisito |
|---|---|---|
| 30 entregadores × 50 pedidos | 87ms | < 2.000ms |
| 10 × 10 | < 5ms | — |
| 1 × 1 | < 1ms | — |
POST /api/orders/optimize-assignment
Retorna assignments (pedido → entregador com distância), unassigned (pedidos sem entregador disponível) e totalDistanceKm.
Toda a infraestrutura é gerenciada por Terraform com 8 módulos, estado remoto no S3 e locking com DynamoDB.
| Recurso | Serviço AWS | Especificação |
|---|---|---|
| Banco de dados | RDS PostgreSQL 16 | db.t3.micro, 5 databases, encrypted |
| Cache | ElastiCache Redis 7.1 | cache.t3.micro, token store |
| Mensageria | Amazon MQ RabbitMQ 3.13 | mq.t3.micro, AMQPS |
| Backend | 20 Lambda Functions | Node.js 20, 256MB, VPC |
| API | API Gateway HTTP | 23 routes, CORS, logs |
| Frontend | ECS Fargate | 0.25 vCPU, 512MB, ALB |
| DNS | Route53 + ACM | fastmeals.com.br, HTTPS |
| Secrets | Secrets Manager | 9 secrets (DB, JWT, MQ, Bedrock) |
| Logs | CloudWatch | 14 dias retention |
| Registry | ECR | Docker images |
| State | S3 + DynamoDB | Terraform remote state |
5 workflows no GitHub Actions com deploy automático.
| Pipeline | Trigger | O que faz |
|---|---|---|
| CI Backend | push development/main | Testa 6 serviços em paralelo (153+ testes) |
| CI Frontend | push development/main | Type check + 27 testes + build |
| Deploy Lambdas | merge to main | Build + zip + upload 20 Lambda functions |
| Deploy Frontend | merge to main | Docker build (amd64) + ECR push + ECS deploy |
| Terraform | PR (plan) / merge (apply) | Infra as Code com review |
| Camada | Framework | Quantidade | Cobertura |
|---|---|---|---|
| Backend (unit) | Vitest | 80+ | Use cases, algoritmos, value objects |
| Backend (integration) | Vitest + Supertest | 73+ | Controllers HTTP, auth, validation |
| Backend (flow) | Shell script | 52 | Fluxo real entre todos os serviços |
| Frontend (unit/integration) | Vitest + RTL | 27 | Componentes, hooks, interações, login |
| Total | — | 180+ testes | — |
| Serviço | Testes | Destaques |
|---|---|---|
| auth-service | 19 | Login, refresh token, bcrypt, rate limiting |
| products-service | 24 | CRUD, paginação, busca, delete protection |
| orders-service | 43 | Status machine (todas as transições), inter-service, price snapshot |
| delivery-service | 20 | CRUD, available filter, delete protection |
| optimization-service | 29 | Hungarian correctness, Haversine accuracy, performance 30×50 |
| reports-service | 18 | Revenue, orders-by-status, top-products, AI insights |
| frontend | 27 | EmptyState, StatCard, StatusBadge, ProductFilter, login flow, hooks |
fastmeals/
├── DECISIONS.md # 16 Architecture Decision Records
├── README.md # Este arquivo
├── docker-compose.yml # Orquestração (14 containers)
├── .github/workflows/ # 5 CI/CD pipelines
├── nginx/
│ └── nginx.conf # API Gateway routing
├── scripts/
│ ├── prepare-services-linux-mac.sh # Setup automático (migrations + seed)
│ ├── prepare-services-win.bat # Versão Windows
│ └── test-flow.sh # 52 assertions de fluxo
├── backend/
│ └── services/
│ ├── auth-service/ # 🔐 JWT + Redis (19 testes)
│ ├── products-service/ # 📦 CRUD produtos (24 testes)
│ ├── orders-service/ # 📋 Pedidos + state machine (43 testes)
│ ├── delivery-service/ # 🚴 Entregadores (20 testes)
│ ├── optimization-service/ # 🧠 Hungarian + Haversine (29 testes)
│ └── reports-service/ # 📊 Analytics + AI (18 testes)
├── frontend/ # 🖥 Next.js 15 (27 testes)
│ ├── app/(dashboard)/ # Rotas: /, /orders, /products, /delivery, /reports
│ ├── components/ # shadcn/ui + custom components
│ ├── hooks/ # useAnimatedCounter, useRole, useAuth
│ ├── stores/ # Zustand (auth, ui, orders, delivery)
│ ├── lib/ # API client (Axios), utils
│ ├── types/ # TypeScript interfaces
│ └── tests/ # 27 testes (Vitest + RTL)
├── infrastructure/
│ └── terraform/ # ☁️ 8 módulos Terraform
│ ├── bootstrap/ # S3 + DynamoDB (state)
│ ├── modules/ # networking, database, cache, messaging, lambda, api-gateway, frontend, dns
│ └── environments/production/ # Entry point
├── docs/
│ ├── api-spec.md # Especificação completa da API
│ ├── database-schema.md # Schema do banco de dados
│ ├── evaluation-criteria.md # Critérios de avaliação
│ ├── evidences/ # Screenshots (frontend, backend, general)
│ └── diagrams/ # 7 diagramas draw.io
│ ├── images/ # PNGs exportados
│ └── xml/ # Arquivos .drawio editáveis
└── seed/
└── data.json # Dados de exemplo
| Documento | Descrição |
|---|---|
| DECISIONS.md | 16 ADRs — decisões arquiteturais com trade-offs |
| API Spec | Especificação completa de todos os endpoints |
| Database Schema | Esquema do banco de dados |
| Auth Service | JWT, Redis, bcrypt |
| Products Service | CRUD com paginação e busca |
| Orders Service | State machine, inter-service, RabbitMQ |
| Delivery Service | CRUD, disponibilidade, RabbitMQ |
| Optimization Service | Hungarian O(n³), Haversine |
| Reports Service | Analytics, CQRS, AI Insights |
Cada serviço possui documentação interativa acessível em /docs:
| Serviço | URL |
|---|---|
| Auth | http://localhost:3001/docs |
| Products | http://localhost:3002/docs |
| Orders | http://localhost:3003/docs |
| Delivery | http://localhost:3004/docs |
| Optimization | http://localhost:3005/docs |
| Reports | http://localhost:3006/docs |
Todas as variáveis estão definidas no docker-compose.yml. Para desenvolvimento local, copie .env.example para .env em cada serviço.
| Variável | Serviços | Descrição |
|---|---|---|
DATABASE_URL |
auth, products, orders, delivery, reports | Connection string PostgreSQL |
JWT_ACCESS_SECRET |
Todos | Secret compartilhado para validação JWT |
REDIS_URL |
auth | URL do Redis para token store |
RABBITMQ_URL |
orders, delivery | URL do RabbitMQ |
PRODUCTS_SERVICE_URL |
orders, optimization | HTTP client para products-service |
DELIVERY_SERVICE_URL |
orders, optimization | HTTP client para delivery-service |
ORDERS_SERVICE_URL |
optimization | HTTP client para orders-service |
AWS_REGION |
reports | Região AWS para Bedrock |
AWS_ACCESS_KEY_ID |
reports | Credencial AWS (opcional — fallback local) |
CORS_ORIGIN |
Todos | Origem permitida (http://localhost:3000) |
NEXT_PUBLIC_API_URL |
frontend | URL do API Gateway (Nginx) |
O docker-compose.yml orquestra 14 containers:
| Container | Imagem | Porta | Função |
|---|---|---|---|
| auth-db | postgres:16-alpine | 5433 | Banco auth |
| products-db | postgres:16-alpine | 5434 | Banco products |
| orders-db | postgres:16-alpine | 5435 | Banco orders |
| delivery-db | postgres:16-alpine | 5436 | Banco delivery |
| reports-db | postgres:16-alpine | 5437 | Banco reports (CQRS) |
| redis | redis:7-alpine | 6379 | Token store |
| rabbitmq | rabbitmq:3.13-management | 5672 / 15672 | Mensageria + UI |
| auth-service | node:20-alpine | 3001 | Microserviço |
| products-service | node:20-alpine | 3002 | Microserviço |
| orders-service | node:20-alpine | 3003 | Microserviço |
| delivery-service | node:20-alpine | 3004 | Microserviço |
| optimization-service | node:20-alpine | 3005 | Microserviço |
| reports-service | node:20-alpine | 3006 | Microserviço |
| nginx | nginx:alpine | 80 | API Gateway |
| frontend | node:20-alpine | 3000 | Dashboard |
Vinicius Prudencio — VynnyTech
Desenvolvido como teste técnico para Eyecare Health — Março 2026







