- Remove backend Medusa.js (TypeScript) e substitui pelo backend Go (saveinmed-performance-core) - Corrige testes auth.test.ts: alinha paths de API (v1/ sem barra inicial) e campo access_token - Corrige GroupedProductCard.test.tsx: ajusta distância formatada (toFixed) e troca userEvent por fireEvent com fakeTimers - Corrige AuthContext.test.tsx: usa vi.hoisted() para mocks e corrige parênteses no waitFor Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
149 lines
4.7 KiB
Go
149 lines
4.7 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/gofrs/uuid/v5"
|
|
_ "github.com/jackc/pgx/v5/stdlib"
|
|
"github.com/jmoiron/sqlx"
|
|
"golang.org/x/crypto/bcrypt"
|
|
|
|
"github.com/saveinmed/backend-go/internal/config"
|
|
"github.com/saveinmed/backend-go/internal/domain"
|
|
)
|
|
|
|
func main() {
|
|
cfg, err := config.Load()
|
|
if err != nil {
|
|
log.Fatalf("failed to load config: %v", err)
|
|
}
|
|
|
|
db, err := sqlx.Open("pgx", cfg.DatabaseURL)
|
|
if err != nil {
|
|
log.Fatalf("Failed to connect to DB: %v", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
if err := db.Ping(); err != nil {
|
|
log.Fatalf("Failed to ping DB: %v", err)
|
|
}
|
|
|
|
ctx := context.Background()
|
|
|
|
log.Println("🌱 Restoring Admin and creating new Lojista...")
|
|
|
|
// 1. Create/Update Admin
|
|
adminUser := &domain.User{
|
|
Role: "Admin",
|
|
Name: "Administrador",
|
|
Username: "admin_master",
|
|
Email: "admin@saveinmed.com",
|
|
EmailVerified: true,
|
|
}
|
|
createUserWithEmail(ctx, db, adminUser, "teste123", cfg.PasswordPepper)
|
|
log.Println("✅ Admin account restored (admin@saveinmed.com / teste123)")
|
|
|
|
// 2. Create Second Lojista (Company + User)
|
|
companyID := uuid.Must(uuid.NewV7())
|
|
company := &domain.Company{
|
|
ID: companyID,
|
|
CNPJ: "98765432000188",
|
|
CorporateName: "Farma Central Distribuidora",
|
|
Category: "distribuidora",
|
|
LicenseNumber: "LIC-987654",
|
|
IsVerified: true,
|
|
Latitude: -23.5611,
|
|
Longitude: -46.6559,
|
|
City: "São Paulo",
|
|
State: "SP",
|
|
}
|
|
actualCompanyID := createCompany(ctx, db, company)
|
|
|
|
lojista2User := &domain.User{
|
|
CompanyID: actualCompanyID,
|
|
Role: "Dono",
|
|
Name: "Ricardo Lojista",
|
|
Username: "ricardo_farma",
|
|
Email: "ricardo@farmacentral.com",
|
|
EmailVerified: true,
|
|
}
|
|
createUserWithEmail(ctx, db, lojista2User, "password123", cfg.PasswordPepper)
|
|
log.Println("✅ Ricardo Lojista created (ricardo@farmacentral.com / password123)")
|
|
|
|
// 3. Create Pharmacy (Buyer)
|
|
pharmacyCompID := uuid.Must(uuid.NewV7())
|
|
pharmacyCompany := &domain.Company{
|
|
ID: pharmacyCompID,
|
|
CNPJ: "12345678000199",
|
|
CorporateName: "Farmácia de Teste",
|
|
Category: "farmacia",
|
|
LicenseNumber: "LIC-123456",
|
|
IsVerified: true,
|
|
City: "São Paulo",
|
|
State: "SP",
|
|
}
|
|
actualPharmacyID := createCompany(ctx, db, pharmacyCompany)
|
|
|
|
pharmacyUser := &domain.User{
|
|
CompanyID: actualPharmacyID,
|
|
Role: "Dono",
|
|
Name: "Dono da Farmácia",
|
|
Username: "farmacia_user_new",
|
|
Email: "farmacia@saveinmed.com",
|
|
EmailVerified: true,
|
|
}
|
|
createUserWithEmail(ctx, db, pharmacyUser, "123456", cfg.PasswordPepper)
|
|
log.Println("✅ Pharmacy Buyer created (farmacia@saveinmed.com / 123456)")
|
|
|
|
log.Println("✅ Seeding complete!")
|
|
}
|
|
|
|
func createCompany(ctx context.Context, db *sqlx.DB, c *domain.Company) uuid.UUID {
|
|
c.CreatedAt = time.Now().UTC()
|
|
c.UpdatedAt = time.Now().UTC()
|
|
|
|
var id uuid.UUID
|
|
err := db.QueryRowContext(ctx, `
|
|
INSERT INTO companies (id, cnpj, corporate_name, category, license_number, is_verified, latitude, longitude, city, state, created_at, updated_at)
|
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
|
|
ON CONFLICT (cnpj) DO UPDATE SET
|
|
corporate_name = EXCLUDED.corporate_name,
|
|
updated_at = EXCLUDED.updated_at
|
|
RETURNING id
|
|
`, c.ID, c.CNPJ, c.CorporateName, c.Category, c.LicenseNumber, c.IsVerified, c.Latitude, c.Longitude, c.City, c.State, c.CreatedAt, c.UpdatedAt).Scan(&id)
|
|
|
|
if err != nil {
|
|
log.Printf("Error creating company %s: %v", c.CNPJ, err)
|
|
// Fallback: try to get the ID if insert failed but company exists
|
|
_ = db.GetContext(ctx, &id, "SELECT id FROM companies WHERE cnpj = $1", c.CNPJ)
|
|
} else {
|
|
log.Printf("Company %s created/updated successfully with ID %s", c.CNPJ, id)
|
|
}
|
|
return id
|
|
}
|
|
|
|
func createUserWithEmail(ctx context.Context, db *sqlx.DB, u *domain.User, password, pepper string) {
|
|
hashed, _ := bcrypt.GenerateFromPassword([]byte(password+pepper), bcrypt.DefaultCost)
|
|
u.ID = uuid.Must(uuid.NewV7())
|
|
u.PasswordHash = string(hashed)
|
|
u.CreatedAt = time.Now().UTC()
|
|
u.UpdatedAt = time.Now().UTC()
|
|
|
|
_, err := db.NamedExecContext(ctx, `
|
|
INSERT INTO users (id, company_id, role, name, username, email, password_hash, email_verified, created_at, updated_at)
|
|
VALUES (:id, :company_id, :role, :name, :username, :email, :password_hash, :email_verified, :created_at, :updated_at)
|
|
ON CONFLICT (email) DO UPDATE SET
|
|
password_hash = EXCLUDED.password_hash,
|
|
company_id = COALESCE(EXCLUDED.company_id, users.company_id),
|
|
role = EXCLUDED.role,
|
|
username = EXCLUDED.username,
|
|
updated_at = EXCLUDED.updated_at
|
|
`, u)
|
|
if err != nil {
|
|
log.Printf("Error creating user %s: %v", u.Email, err)
|
|
} else {
|
|
log.Printf("User %s created/updated successfully", u.Email)
|
|
}
|
|
}
|