docs(seeder): update documentation, fix go.mod and ignore binary

This commit is contained in:
Tiago Yamamoto 2025-12-22 01:38:41 -03:00
parent e624d642aa
commit d44a8873b9
5 changed files with 54 additions and 71 deletions

10
seeder-api/.gitignore vendored Normal file
View file

@ -0,0 +1,10 @@
# Binaries
seeder-api
*.exe
*.test
# Environment
.env
# OS
.DS_Store

View file

@ -6,15 +6,25 @@ Microserviço utilitário para popular o banco de dados com dados de teste para
**Este serviço é DESTRUTIVO!** Ele:
1. **REMOVE** todas as tabelas existentes (`companies`, `products`, `users`, etc.)
2. **RECRIA** apenas as tabelas `companies` e `products`
3. **NÃO RECRIA** a tabela `users` - você precisa reiniciar o backend após usar o seeder
2. **RECRIA** as tabelas.
3. **MODO FULL**: Gera volume, mas **NÃO** cria usuários padrão (apenas estrutura).
4. **MODO LEAN**: Gera dados mínimos e **CRIA** usuários padrão (admin, dono, etc.).
## 🎯 Propósito
## 🎯 Modos de Operação
Gerar dados de teste para o marketplace SaveInMed, criando:
- **400 farmácias** na região de Anápolis/GO
- **20-500 produtos** por farmácia
- Dados variados de medicamentos com preços e validades realistas
### 1. `mode=lean` (Recomendado para Dev)
Gera um ambiente funcional mínimo:
- **1 Farmácia** (Farmácia Modelo)
- **4 Usuários** (Admin, Dono, Colaborador, Entregador)
- **15 Produtos**
- Ideal para testar fluxos de login, carrinho, checkout.
### 2. `mode=full` (Padrão/Load Test)
Gera volume de dados:
- **400 Farmácias**
- **~85.000 Produtos**
- **SEM USUÁRIOS** (Tabela criada, mas vazia)
- Ideal para testar performance, busca geografia, clusterização no mapa.
## 🏗️ Arquitetura
@ -22,35 +32,17 @@ Gerar dados de teste para o marketplace SaveInMed, criando:
seeder-api/
├── main.go # Entry point HTTP (POST /seed)
├── pkg/
│ └── seeder/
└── seeder.go # Lógica de geração de dados
── seeder/
│ └── seeder.go # Lógica de geração de dados
├── go.mod
└── go.sum
```
## 📍 Dados Gerados
### Localização
- Centro em **Anápolis, GO** (Lat: -16.3281, Lng: -48.9530)
- Variação de ~5km para cada farmácia
### Farmácias
- **Quantidade**: 400 empresas
- **Categoria**: `farmacia`
- **70%** verificadas (`is_verified = true`)
- CNPJs gerados automaticamente
### Produtos (Medicamentos)
- **20-500 produtos** por farmácia
- **Categorias**: Analgésicos, Antibióticos, Anti-inflamatórios, Cardiovasculares, Dermatológicos, Vitaminas, Oftálmicos, Respiratórios, etc.
- **Validade**: 30 dias a 2 anos
- **Variação de preço**: -20% a +30% do preço base
## 🔧 Variáveis de Ambiente
## Variáveis de Ambiente
```bash
DATABASE_URL=postgres://user:password@host:port/dbname?sslmode=disable
PORT=8216 # Porta padrão do seeder
PORT=8080 # Porta padrão (pode ser alterada)
```
## 🚀 Uso
@ -60,18 +52,27 @@ PORT=8216 # Porta padrão do seeder
```bash
# Configurar DATABASE_URL
export DATABASE_URL=postgres://postgres:postgres@localhost:5432/saveinmed?sslmode=disable
export PORT=8216
# Executar
go run main.go
```
### Endpoint
### Endpoints
#### 1. Seeder Rápido (Lean) - Cria Usuários!
```bash
POST http://localhost:8216/seed?mode=lean
# Resposta
"Lean seed completed. Users: admin, dono, colaborador, entregador (Pass: 123456/admin123)"
```
#### 2. Seeder Completo (Full)
```bash
# Iniciar seeding
POST http://localhost:8216/seed
# Resposta de sucesso
# Resposta
{
"tenants": 400,
"products": 85432,
@ -81,10 +82,11 @@ POST http://localhost:8216/seed
## ⚡ Fluxo de Uso Recomendado
1. **Parar o backend principal** (para evitar conflitos de conexão)
2. **Executar o seeder**: `curl -X POST http://localhost:8216/seed`
3. **Reiniciar o backend** (para aplicar migrations e recriar tabela `users`)
4. A API estará pronta com dados de teste
1. **Parar o backend principal** (para evitar conflitos de conexão/locks)
2. **Executar o seeder**:
- `curl -X POST "http://localhost:8216/seed?mode=lean"`
3. **Reiniciar o backend**
4. A API estará pronta com dados de teste e usuários para login.
## 🐳 Docker
@ -95,16 +97,16 @@ docker build -t saveinmed-seeder:latest .
# Run
docker run -p 8216:8216 \
-e DATABASE_URL=postgres://user:password@host:5432/saveinmed \
-e PORT=8216 \
saveinmed-seeder:latest
# Seed
curl -X POST http://localhost:8216/seed
# Seed (Lean)
curl -X POST "http://localhost:8216/seed?mode=lean"
```
## 📝 Notas
- Os dados são **regeneráveis** - execute novamente para limpar e recriar
- Ideal para ambientes de **desenvolvimento** e **staging**
- Os dados são **regeneráveis** - execute novamente para limpar e recriar.
- **NÃO USE EM PRODUÇÃO** - vai apagar todos os dados reais!
## 📝 Licença

View file

@ -7,13 +7,13 @@ require (
github.com/jackc/pgx/v5 v5.7.6
github.com/jmoiron/sqlx v1.4.0
github.com/joho/godotenv v1.5.1
golang.org/x/crypto v0.37.0
)
require (
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/puddle/v2 v2.2.2 // indirect
golang.org/x/crypto v0.37.0 // indirect
golang.org/x/sync v0.13.0 // indirect
golang.org/x/text v0.24.0 // indirect
)

View file

@ -155,35 +155,6 @@ func SeedLean(dsn string) (string, error) {
return "", fmt.Errorf("create pharmacy: %v", err)
}
// Create standard password hash (e.g. "123456")
// Using a fixed hash for speed/reproducibility. hash("$2a$10$3Y... for '123456'")
// Or generating one? Let's use a known hash from backend or generate one locally if possible.
// To avoid dep on bcrypt, I will assume one.
// But `users` table needs it.
// "123456" bcrypt hash (cost 10): $2a$10$Vj.uOq/e/3.t/2.r/1.s/e
// "admin123" bcrypt hash: $2y$10$vI8aWBdWs/.r/2/.r.. (Let's stick to "123456" for simplicity or use one from backend?)
// User requested "dono/123456".
pwdHash123456 := "$2a$10$x86K.S/3/1./2./3./4./5./6./" // PLACHOLDER? No, I should generate or use a real one.
// Real hash for "123456" generated previously or online: $2a$10$2.1.1.1.1.1.1.1.1.1.1.
// Actually, I'll use a mocked valid hash.
// $2a$10$2.1.1.1.1.1.1.1.1.1.1 is not valid.
// I'll leave a TODO or use a hardcoded one if I can.
// Better: use the same one as Admin ("admin123" -> "$2a$10$...")
// Let's use a valid hash for '123456'.
// Generated: $2a$10$4.1.1.1.1.1.1.1.1.1.1. (Fake)
// I will use a known one. From previous logs?
// In `server.go`, admin password is env var.
// I'll grab a valid hash for "123456" -> `$2a$10$6.1.1.1.1.1.1.1.1.1.1` (Just kidding).
// I'll use a placeholder that works.
validHash123456 := "$2a$10$e.g.e.g.e.g.e.g.e.g.e.g." // Requires real generation.
// I'll import bcrypt?
// `seeder-api` doesn't have bcrypt in imports?
// It has `math/rand`, `time`.
// I should add `golang.org/x/crypto/bcrypt` if needed or use raw SQL pgcrypto if available.
// I'll add bcrypt to imports in a separate step or just assume the hash.
// Let's assume the hash for "123456" is: $2a$10$N.z.y.x...
// I'll proceed with creating users:
// Helper for hashing
@ -240,7 +211,7 @@ func SeedLean(dsn string) (string, error) {
}
log.Println("✅ [Lean] Created 15 products")
return fmt.Sprintf("Lean seed completed. Users: admin, dono, colaborador, entregador (Pass: 123456/admin123)"), nil
return "Lean seed completed. Users: admin, dono, colaborador, entregador (Pass: 123456/admin123)", nil
}
func SeedFull(dsn string) (string, error) {

Binary file not shown.