Compare commits

...

3 Commits

3 changed files with 42 additions and 31 deletions

View File

@@ -9,14 +9,14 @@ import (
"sync"
"time"
"golang.org/x/crypto/bcrypt"
"goyco/internal/database"
"goyco/internal/repositories"
)
type ParallelProcessor struct {
maxWorkers int
timeout time.Duration
maxWorkers int
timeout time.Duration
passwordHash string
}
func NewParallelProcessor() *ParallelProcessor {
@@ -28,6 +28,10 @@ func NewParallelProcessor() *ParallelProcessor {
}
}
func (p *ParallelProcessor) SetPasswordHash(hash string) {
p.passwordHash = hash
}
func (p *ParallelProcessor) CreateUsersInParallel(userRepo repositories.UserRepository, count int, progress *ProgressIndicator) ([]database.User, error) {
ctx, cancel := context.WithTimeout(context.Background(), p.timeout)
defer cancel()
@@ -292,18 +296,12 @@ func generateRandomIdentifier() string {
}
func (p *ParallelProcessor) createSingleUser(userRepo repositories.UserRepository, index int) (database.User, error) {
password := "password123"
randomID := generateRandomIdentifier()
username := fmt.Sprintf("user_%s", randomID)
email := fmt.Sprintf("user_%s@goyco.local", randomID)
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
return database.User{}, fmt.Errorf("hash password: %w", err)
}
const maxRetries = 10
for attempt := 0; attempt < maxRetries; attempt++ {
for range maxRetries {
user, err := userRepo.GetByEmail(email)
if err == nil {
return *user, nil
@@ -312,7 +310,7 @@ func (p *ParallelProcessor) createSingleUser(userRepo repositories.UserRepositor
user = &database.User{
Username: username,
Email: email,
Password: string(hashedPassword),
Password: p.passwordHash,
EmailVerified: true,
}
@@ -379,7 +377,7 @@ func (p *ParallelProcessor) createSinglePost(postRepo repositories.PostRepositor
content := fmt.Sprintf("Autogenerated seed post #%d\n\nThis is sample content for testing purposes. The post discusses %s and provides valuable insights.", index, title)
const maxRetries = 10
for attempt := 0; attempt < maxRetries; attempt++ {
for range maxRetries {
post := &database.Post{
Title: title,
URL: url,

View File

@@ -104,12 +104,25 @@ func seedDatabase(userRepo repositories.UserRepository, postRepo repositories.Po
fmt.Println("Starting database seeding...")
}
seedPassword := "seed-password"
userPassword := "password123"
seedPasswordHash, err := bcrypt.GenerateFromPassword([]byte(seedPassword), bcrypt.DefaultCost)
if err != nil {
return fmt.Errorf("precompute seed password hash: %w", err)
}
userPasswordHash, err := bcrypt.GenerateFromPassword([]byte(userPassword), bcrypt.DefaultCost)
if err != nil {
return fmt.Errorf("precompute user password hash: %w", err)
}
spinner := NewSpinner("Creating seed user")
if !IsJSONOutput() {
spinner.Spin()
}
seedUser, err := ensureSeedUser(userRepo)
seedUser, err := ensureSeedUser(userRepo, string(seedPasswordHash))
if err != nil {
if !IsJSONOutput() {
spinner.Complete()
@@ -122,6 +135,7 @@ func seedDatabase(userRepo repositories.UserRepository, postRepo repositories.Po
}
processor := NewParallelProcessor()
processor.SetPasswordHash(string(userPasswordHash))
var progress *ProgressIndicator
if !IsJSONOutput() && *numUsers > 0 {
@@ -213,22 +227,16 @@ func findExistingSeedUser(userRepo repositories.UserRepository) (*database.User,
return nil, fmt.Errorf("no existing seed user found")
}
func ensureSeedUser(userRepo repositories.UserRepository) (*database.User, error) {
func ensureSeedUser(userRepo repositories.UserRepository, passwordHash string) (*database.User, error) {
existingUser, err := findExistingSeedUser(userRepo)
if err == nil && existingUser != nil {
return existingUser, nil
}
seedPassword := "seed-password"
randomID := generateRandomIdentifier()
seedUsername := fmt.Sprintf("seed_admin_%s", randomID)
seedEmail := fmt.Sprintf("seed_admin_%s@goyco.local", randomID)
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(seedPassword), bcrypt.DefaultCost)
if err != nil {
return nil, fmt.Errorf("hash password: %w", err)
}
const maxRetries = 10
for range maxRetries {
user, err := userRepo.GetByEmail(seedEmail)
@@ -239,7 +247,7 @@ func ensureSeedUser(userRepo repositories.UserRepository) (*database.User, error
user = &database.User{
Username: seedUsername,
Email: seedEmail,
Password: string(hashedPassword),
Password: passwordHash,
EmailVerified: true,
}
@@ -256,23 +264,17 @@ func ensureSeedUser(userRepo repositories.UserRepository) (*database.User, error
return nil, fmt.Errorf("failed to create seed user after %d attempts", maxRetries)
}
func createRandomUsers(userRepo repositories.UserRepository, count int) ([]database.User, error) {
func createRandomUsers(userRepo repositories.UserRepository, count int, passwordHash string) ([]database.User, error) {
var users []database.User
for i := range count {
username := fmt.Sprintf("user_%d", i+1)
email := fmt.Sprintf("user_%d@goyco.local", i+1)
password := "password123"
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
return nil, fmt.Errorf("hash password for user %d: %w", i+1, err)
}
user := &database.User{
Username: username,
Email: email,
Password: string(hashedPassword),
Password: passwordHash,
EmailVerified: true,
}

View File

@@ -9,6 +9,7 @@ import (
"goyco/internal/repositories"
"goyco/internal/testutils"
"golang.org/x/crypto/bcrypt"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
@@ -28,7 +29,12 @@ func TestSeedCommand(t *testing.T) {
postRepo := repositories.NewPostRepository(db)
voteRepo := repositories.NewVoteRepository(db)
seedUser, err := ensureSeedUser(userRepo)
seedPasswordHash, err := bcrypt.GenerateFromPassword([]byte("seed-password"), bcrypt.DefaultCost)
if err != nil {
t.Fatalf("Failed to hash seed password: %v", err)
}
seedUser, err := ensureSeedUser(userRepo, string(seedPasswordHash))
if err != nil {
t.Fatalf("Failed to ensure seed user: %v", err)
}
@@ -45,7 +51,12 @@ func TestSeedCommand(t *testing.T) {
t.Error("Expected seed user to be email verified")
}
users, err := createRandomUsers(userRepo, 2)
userPasswordHash, err := bcrypt.GenerateFromPassword([]byte("password123"), bcrypt.DefaultCost)
if err != nil {
t.Fatalf("Failed to hash user password: %v", err)
}
users, err := createRandomUsers(userRepo, 2, string(userPasswordHash))
if err != nil {
t.Fatalf("Failed to create random users: %v", err)
}