docs(seeder): update documentation, fix go.mod and ignore binary
This commit is contained in:
parent
e624d642aa
commit
d44a8873b9
5 changed files with 54 additions and 71 deletions
10
seeder-api/.gitignore
vendored
Normal file
10
seeder-api/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
# Binaries
|
||||||
|
seeder-api
|
||||||
|
*.exe
|
||||||
|
*.test
|
||||||
|
|
||||||
|
# Environment
|
||||||
|
.env
|
||||||
|
|
||||||
|
# OS
|
||||||
|
.DS_Store
|
||||||
|
|
@ -6,15 +6,25 @@ Microserviço utilitário para popular o banco de dados com dados de teste para
|
||||||
|
|
||||||
**Este serviço é DESTRUTIVO!** Ele:
|
**Este serviço é DESTRUTIVO!** Ele:
|
||||||
1. **REMOVE** todas as tabelas existentes (`companies`, `products`, `users`, etc.)
|
1. **REMOVE** todas as tabelas existentes (`companies`, `products`, `users`, etc.)
|
||||||
2. **RECRIA** apenas as tabelas `companies` e `products`
|
2. **RECRIA** as tabelas.
|
||||||
3. **NÃO RECRIA** a tabela `users` - você precisa reiniciar o backend após usar o seeder
|
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:
|
### 1. `mode=lean` (Recomendado para Dev)
|
||||||
- **400 farmácias** na região de Anápolis/GO
|
Gera um ambiente funcional mínimo:
|
||||||
- **20-500 produtos** por farmácia
|
- **1 Farmácia** (Farmácia Modelo)
|
||||||
- Dados variados de medicamentos com preços e validades realistas
|
- **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
|
## 🏗️ Arquitetura
|
||||||
|
|
||||||
|
|
@ -22,35 +32,17 @@ Gerar dados de teste para o marketplace SaveInMed, criando:
|
||||||
seeder-api/
|
seeder-api/
|
||||||
├── main.go # Entry point HTTP (POST /seed)
|
├── main.go # Entry point HTTP (POST /seed)
|
||||||
├── pkg/
|
├── pkg/
|
||||||
│ └── seeder/
|
├── seeder/
|
||||||
│ └── seeder.go # Lógica de geração de dados
|
│ └── seeder.go # Lógica de geração de dados
|
||||||
├── go.mod
|
├── go.mod
|
||||||
└── go.sum
|
└── go.sum
|
||||||
```
|
```
|
||||||
|
|
||||||
## 📍 Dados Gerados
|
## Variáveis de Ambiente
|
||||||
|
|
||||||
### 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
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
DATABASE_URL=postgres://user:password@host:port/dbname?sslmode=disable
|
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
|
## 🚀 Uso
|
||||||
|
|
@ -60,18 +52,27 @@ PORT=8216 # Porta padrão do seeder
|
||||||
```bash
|
```bash
|
||||||
# Configurar DATABASE_URL
|
# Configurar DATABASE_URL
|
||||||
export DATABASE_URL=postgres://postgres:postgres@localhost:5432/saveinmed?sslmode=disable
|
export DATABASE_URL=postgres://postgres:postgres@localhost:5432/saveinmed?sslmode=disable
|
||||||
|
export PORT=8216
|
||||||
|
|
||||||
# Executar
|
# Executar
|
||||||
go run main.go
|
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
|
```bash
|
||||||
# Iniciar seeding
|
|
||||||
POST http://localhost:8216/seed
|
POST http://localhost:8216/seed
|
||||||
|
|
||||||
# Resposta de sucesso
|
# Resposta
|
||||||
{
|
{
|
||||||
"tenants": 400,
|
"tenants": 400,
|
||||||
"products": 85432,
|
"products": 85432,
|
||||||
|
|
@ -81,10 +82,11 @@ POST http://localhost:8216/seed
|
||||||
|
|
||||||
## ⚡ Fluxo de Uso Recomendado
|
## ⚡ Fluxo de Uso Recomendado
|
||||||
|
|
||||||
1. **Parar o backend principal** (para evitar conflitos de conexão)
|
1. **Parar o backend principal** (para evitar conflitos de conexão/locks)
|
||||||
2. **Executar o seeder**: `curl -X POST http://localhost:8216/seed`
|
2. **Executar o seeder**:
|
||||||
3. **Reiniciar o backend** (para aplicar migrations e recriar tabela `users`)
|
- `curl -X POST "http://localhost:8216/seed?mode=lean"`
|
||||||
4. A API estará pronta com dados de teste
|
3. **Reiniciar o backend**
|
||||||
|
4. A API estará pronta com dados de teste e usuários para login.
|
||||||
|
|
||||||
## 🐳 Docker
|
## 🐳 Docker
|
||||||
|
|
||||||
|
|
@ -95,16 +97,16 @@ docker build -t saveinmed-seeder:latest .
|
||||||
# Run
|
# Run
|
||||||
docker run -p 8216:8216 \
|
docker run -p 8216:8216 \
|
||||||
-e DATABASE_URL=postgres://user:password@host:5432/saveinmed \
|
-e DATABASE_URL=postgres://user:password@host:5432/saveinmed \
|
||||||
|
-e PORT=8216 \
|
||||||
saveinmed-seeder:latest
|
saveinmed-seeder:latest
|
||||||
|
|
||||||
# Seed
|
# Seed (Lean)
|
||||||
curl -X POST http://localhost:8216/seed
|
curl -X POST "http://localhost:8216/seed?mode=lean"
|
||||||
```
|
```
|
||||||
|
|
||||||
## 📝 Notas
|
## 📝 Notas
|
||||||
|
|
||||||
- Os dados são **regeneráveis** - execute novamente para limpar e recriar
|
- Os dados são **regeneráveis** - execute novamente para limpar e recriar.
|
||||||
- Ideal para ambientes de **desenvolvimento** e **staging**
|
|
||||||
- **NÃO USE EM PRODUÇÃO** - vai apagar todos os dados reais!
|
- **NÃO USE EM PRODUÇÃO** - vai apagar todos os dados reais!
|
||||||
|
|
||||||
## 📝 Licença
|
## 📝 Licença
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,13 @@ require (
|
||||||
github.com/jackc/pgx/v5 v5.7.6
|
github.com/jackc/pgx/v5 v5.7.6
|
||||||
github.com/jmoiron/sqlx v1.4.0
|
github.com/jmoiron/sqlx v1.4.0
|
||||||
github.com/joho/godotenv v1.5.1
|
github.com/joho/godotenv v1.5.1
|
||||||
|
golang.org/x/crypto v0.37.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
||||||
github.com/jackc/puddle/v2 v2.2.2 // 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/sync v0.13.0 // indirect
|
||||||
golang.org/x/text v0.24.0 // indirect
|
golang.org/x/text v0.24.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -155,35 +155,6 @@ func SeedLean(dsn string) (string, error) {
|
||||||
return "", fmt.Errorf("create pharmacy: %v", err)
|
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:
|
// I'll proceed with creating users:
|
||||||
|
|
||||||
// Helper for hashing
|
// Helper for hashing
|
||||||
|
|
@ -240,7 +211,7 @@ func SeedLean(dsn string) (string, error) {
|
||||||
}
|
}
|
||||||
log.Println("✅ [Lean] Created 15 products")
|
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) {
|
func SeedFull(dsn string) (string, error) {
|
||||||
|
|
|
||||||
Binary file not shown.
Loading…
Reference in a new issue