// cmd/run-server/seed/seed_base.go package seed import ( "fmt" "log" "math/rand" "clapclap/internal/models" "clapclap/internal/uuid" "golang.org/x/crypto/bcrypt" "gorm.io/gorm" "gorm.io/gorm/clause" ) func seedGenres(db *gorm.DB) error { log.Println("↳ Seeding structural production genres mapping tree...") type genreData struct { Subs []string } data := map[string]genreData{ "Pop": {[]string{"Synth-pop", "Indie Pop", "Hyperpop", "Electropop", "K-Pop Style"}}, "Hip Hop": {[]string{"Trap", "Boom Bap", "Drill", "Old School", "Conscious Rap"}}, "Rock": {[]string{"Metal", "Punk", "Alternative", "Psychedelic", "Grunge", "Hard Rock"}}, "Electronic": {[]string{"Techno", "House", "Dubstep", "Trance", "Drum & Bass", "Phonk", "Hardstyle"}}, "R&B": {[]string{"Neo-Soul", "Contemporary R&B", "Soul", "Funk", "Quiet Storm"}}, "Latino": {[]string{"Reggaeton", "Bachata", "Salsa", "Trap Latino", "Merengue"}}, "Afrobeats": {[]string{"Amapiano", "Azonto", "Afro-Pop", "Kwaito"}}, "Reggae": {[]string{"Dub", "Roots Reggae", "Ska", "Dancehall", "Rocksteady"}}, "K-Pop": {[]string{"Idol Pop", "K-HipHop", "K-Rock", "Bubblegum Pop"}}, "Jazz": {[]string{"Bebop", "Fusion", "Swing", "Nu-Jazz", "Cool Jazz"}}, "Blues": {[]string{"Delta Blues", "Chicago Blues", "Rock Blues", "Soul Blues"}}, "Country": {[]string{"Bluegrass", "Outlaw Country", "Honky Tonk", "Country Pop"}}, "Folk": {[]string{"Indie Folk", "Acoustic", "Americana", "Contemporary Folk"}}, "Ambient": {[]string{"Drone", "Dark Ambient", "New Age", "Space Music"}}, "Lo-fi": {[]string{"Chillhop", "Jazzhop", "Lofi Beats"}}, "Chill": {[]string{"Downtempo", "Tropical House", "Chillout", "Liquid Funk"}}, } for parentName, info := range data { parent := models.Genre{Name: parentName} db.Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "name"}}, DoNothing: true}).Create(&parent) if parent.ID == uuid.Nil { db.Where("name = ?", parentName).First(&parent) } var subsBatch []models.Genre for _, subName := range info.Subs { subsBatch = append(subsBatch, models.Genre{Name: subName, ParentID: &parent.ID}) } if len(subsBatch) > 0 { db.Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "name"}}, DoNothing: true}).Create(&subsBatch) } } return nil } func seedUsers(db *gorm.DB, count int) error { log.Printf("↳ Generating %d dynamic random user profiles...", count) hasher, _ := bcrypt.GenerateFromPassword([]byte("password123"), bcrypt.DefaultCost) sharedHash := string(hasher) firstNames := []string{"James", "Alex", "Jordan", "Taylor", "Morgan", "Skyler", "Dwayne", "Kai", "Robin", "Drew"} lastNames := []string{"Smith", "Jones", "Miller", "Davis", "Gomez", "Malone", "Hendrix", "Vance", "Baker"} usersBatch := make([]models.User, 0, count) for i := range count { username := fmt.Sprintf("%s%s_%d", firstNames[rand.Intn(len(firstNames))], lastNames[rand.Intn(len(lastNames))], i) usersBatch = append(usersBatch, models.User{ Username: username, Email: fmt.Sprintf("%s@transcendence-audio.io", username), HashedPassword: sharedHash, Avatar: fmt.Sprintf("https://api.dicebear.com/7.x/bottts/svg?seed=%s", username), IsVerified: true, }) } if err := db.Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "username"}}, DoNothing: true}).CreateInBatches(&usersBatch, 25).Error; err != nil { return err } var createdUsers []models.User var availableGenres []models.Genre db.Where("username NOT LIKE ?", "user_%").Find(&createdUsers) // SAFELY IGNORE TEST USERS db.Find(&availableGenres) if len(availableGenres) > 0 { for _, user := range createdUsers { assignedCount := rand.Intn(3) + 1 for range assignedCount { g := availableGenres[rand.Intn(len(availableGenres))] _ = db.Model(&user).Association("PreferredGenres").Append(&g) } } } return nil }