// cmd/run-server/seed/seed_social.go package seed import ( "fmt" "log" "math/rand" "clapclap/internal/models" "clapclap/internal/uuid" "gorm.io/gorm" "gorm.io/gorm/clause" ) func seedComments(db *gorm.DB, totalComments int) error { log.Printf("↳ Weaving %d relational random communication thread contexts...", totalComments) var users []models.User var tracks []models.Track db.Where("username NOT LIKE ?", "user_%").Find(&users) db.Where("name != ?", "Fixed Test Single").Find(&tracks) if len(users) == 0 || len(tracks) == 0 { return fmt.Errorf("dynamic social params empty") } phrases := []string{"Great transient response here.", "What plugin chain did you use?", "Catchy hooks!", "Needs more compression on the master.", "Incredible arrangement!"} for range totalComments { targetTrack := tracks[rand.Intn(len(tracks))] author := users[rand.Intn(len(users))] rootComment := models.Comment{ Content: phrases[rand.Intn(len(phrases))], TrackID: targetTrack.ID, AuthorID: author.ID, } db.Create(&rootComment) if rand.Float32() < 0.40 { replyAuthor := users[rand.Intn(len(users))] db.Create(&models.Comment{ Content: phrases[rand.Intn(len(phrases))], TrackID: targetTrack.ID, AuthorID: replyAuthor.ID, ReplyToID: &rootComment.ID, }) } } return nil } func seedRatings(db *gorm.DB) error { log.Println("↳ Structuring randomized rating allocations & dynamic math...") var users []models.User var tracks []models.Track db.Where("username NOT LIKE ?", "user_%").Find(&users) db.Where("name != ?", "Fixed Test Single").Find(&tracks) for _, track := range tracks { var combinedSum int = 0 var votesCounter int = 0 shuffledUsers := make([]models.User, len(users)) copy(shuffledUsers, users) rand.Shuffle(len(shuffledUsers), func(i, j int) { shuffledUsers[i], shuffledUsers[j] = shuffledUsers[j], shuffledUsers[i] }) reviewersCount := min(rand.Intn(len(users)/3+1)+2, len(users)) for idx := range reviewersCount { reviewer := shuffledUsers[idx] assignedScore := rand.Intn(4) + 7 rating := models.Rating{Value: assignedScore, TrackID: track.ID, AuthorID: reviewer.ID} err := db.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "author_id"}, {Name: "track_id"}}, DoNothing: true, }).Create(&rating).Error if err == nil && rating.ID != (uuid.UUID{}) { combinedSum += assignedScore votesCounter++ } } if votesCounter > 0 { computedAverage := float64(combinedSum) / float64(votesCounter) db.Model(&track).Updates(map[string]any{"average_rating": computedAverage, "rating_count": votesCounter}) } } return nil }