Compare commits
3 Commits
ff471cd5dd
...
a5b4e9bf25
| Author | SHA1 | Date | |
|---|---|---|---|
| a5b4e9bf25 | |||
| c020517ccf | |||
| 4cdda3f944 |
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user