diff --git a/seeder-api/.gitignore b/seeder-api/.gitignore new file mode 100644 index 0000000..913c5fd --- /dev/null +++ b/seeder-api/.gitignore @@ -0,0 +1,10 @@ +# Binaries +seeder-api +*.exe +*.test + +# Environment +.env + +# OS +.DS_Store diff --git a/seeder-api/README.md b/seeder-api/README.md index c71bbfa..958483c 100644 --- a/seeder-api/README.md +++ b/seeder-api/README.md @@ -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 diff --git a/seeder-api/go.mod b/seeder-api/go.mod index 6b0cc40..7e4e712 100644 --- a/seeder-api/go.mod +++ b/seeder-api/go.mod @@ -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 ) diff --git a/seeder-api/pkg/seeder/seeder.go b/seeder-api/pkg/seeder/seeder.go index 2fe9a92..6666a02 100644 --- a/seeder-api/pkg/seeder/seeder.go +++ b/seeder-api/pkg/seeder/seeder.go @@ -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) { diff --git a/seeder-api/seeder-api b/seeder-api/seeder-api deleted file mode 100755 index c33fd5f..0000000 Binary files a/seeder-api/seeder-api and /dev/null differ