- remove backend-old (Medusa), saveinmed-frontend (Next.js/Appwrite) and marketplace dirs - split Go usecases by domain and move notifications/payments to infrastructure - reorganize frontend pages into auth, dashboard and marketplace modules - add Makefile, docker-compose.yml and architecture docs
5.6 KiB
5.6 KiB
Arquitetura SaveInMed
Visão geral
┌─────────────────────────────────────────────────────┐
│ Clientes HTTP │
│ Browser (frontend) Browser (admin panel) │
└──────────────┬──────────────────────┬───────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────────┐
│ backend (Go) │ │ backoffice (NestJS) │
│ :8214 │ │ :3001 │
└────────┬────────┘ └──────────┬──────────┘
│ │
└───────────┬────────────┘
▼
┌─────────────────────┐
│ PostgreSQL │
└─────────────────────┘
Decisões de design
Backend Go — Clean Architecture
A separação de camadas segue Uncle Bob's Clean Architecture:
cmd/api/
└── main.go → DI e wiring de dependências
internal/
├── domain/ → Entidades, value objects, interfaces de repositório
├── usecase/ → Regras de negócio (independentes de framework)
│ ├── usecase.go → Service struct + interfaces centrais
│ ├── auth_usecase.go → Autenticação, JWT, reset de senha
│ ├── company_usecase.go → Empresas e KYC
│ ├── product_usecase.go → Catálogo e inventário
│ ├── order_usecase.go → Ciclo de vida de pedidos (state machine)
│ ├── shipping_usecase.go → Cálculo de frete e configurações
│ ├── cart_usecase.go → Carrinho com descontos B2B
│ ├── payment_usecase.go → Pagamentos e webhooks
│ ├── review_usecase.go → Avaliações de vendedores
│ ├── user_usecase.go → CRUD de usuários
│ ├── address_usecase.go → Endereços
│ └── dashboard_usecase.go → KPIs de vendedor e admin
├── http/
│ ├── handler/ → Um arquivo por recurso REST
│ └── middleware/ → Auth JWT, CORS, rate-limit, logging
├── repository/postgres/ → Implementações de Repository + migrações
└── infrastructure/
├── mapbox/ → Cliente Mapbox (cálculo de distância de rota)
├── payments/ → Mercado Pago, Asaas, Stripe
└── notifications/ → Firebase Cloud Messaging (FCM)
Regra de dependência: camadas externas (HTTP, banco, infra) dependem das camadas internas (use case, domain). Nunca o contrário.
Frontend React — Organização por perfil
Páginas agrupadas em src/pages/<contexto>/<perfil>/, com alias @/ para importações absolutas:
pages/
auth/ → Login, registro (público)
marketplace/ → Search, Cart, Checkout, Orders (compradores)
dashboard/
admin/ → Painel admin (consome backoffice API)
seller/ → Seller Dashboard, Inventory, Products
employee/ → Colaborador
delivery/ → Entregador
Company.tsx → Perfil da empresa (compartilhado)
MyProfile.tsx → Perfil do usuário (compartilhado)
Backoffice NestJS — API para operações internas
O backoffice/ é uma API separada (não é front-end), organizada em módulos NestJS:
| Módulo | Responsabilidade |
|---|---|
auth |
Autenticação de operadores internos |
users |
Gestão de usuários da plataforma |
kyc |
Aprovação de empresas (KYC) |
inventory |
Gestão de estoque e compras (B2B interno) |
dashboard |
Métricas agregadas da plataforma |
reports |
Exportação de relatórios |
fraud |
Detecção de padrões suspeitos |
disputes |
Gestão de disputas entre partes |
audit |
Log de ações administrativas |
webhooks |
Recebimento de eventos externos |
performance |
Monitoramento de performance de sellers |
settings |
Configurações da plataforma |
Importante:
backofficee as páginas admin dofrontendformam um par API+UI. Não há duplicidade — um é o servidor, o outro é o cliente.
Integrações externas
| Serviço | Uso | Pacote |
|---|---|---|
| Mapbox API | Distância de rota para cálculo de frete | infrastructure/mapbox/ |
| Mercado Pago | Pagamentos B2C e B2B com split | infrastructure/payments/ |
| Asaas | Gateway alternativo / boleto | infrastructure/payments/ |
| Firebase FCM | Push notifications (mobile/PWA) | infrastructure/notifications/ |
State machine de pedidos
Pending → Paid → Invoiced → Shipped → Delivered → Completed
↓ ↓ ↓
Cancelled Cancelled Cancelled
Transições são validadas em order_usecase.go#UpdateOrderStatus. Cancelamentos restituem estoque automaticamente.
Segurança
- JWT HS256 com pepper no hash de senha (bcrypt)
- Rate limiting por IP no middleware
- CORS configurável por ambiente
- Company verification (KYC) antes de pedidos de produção
- Uploads validados por tipo MIME e tamanho