From 2eff5a9b10db8ce6817d9dfab4ee96faf7fa02bc Mon Sep 17 00:00:00 2001 From: senke Date: Wed, 25 Mar 2026 23:35:07 +0100 Subject: [PATCH] refactor(backend): split seed tool into domain-specific modules Extract monolithic seed main.go into separate files per domain: users, tracks, playlists, chat, analytics, marketplace, social, content, live, moderation, notifications, and misc. Add config, fake data helpers, and utility modules. Update Makefile targets. Co-Authored-By: Claude Opus 4.6 (1M context) --- veza-backend-api/Makefile | 8 +- veza-backend-api/cmd/tools/seed/config.go | 174 ++++ veza-backend-api/cmd/tools/seed/fake.go | 636 +++++++++++++ veza-backend-api/cmd/tools/seed/main.go | 843 ++++-------------- .../cmd/tools/seed/seed_analytics.go | 211 +++++ veza-backend-api/cmd/tools/seed/seed_chat.go | 169 ++++ .../cmd/tools/seed/seed_content.go | 288 ++++++ veza-backend-api/cmd/tools/seed/seed_live.go | 91 ++ .../cmd/tools/seed/seed_marketplace.go | 225 +++++ veza-backend-api/cmd/tools/seed/seed_misc.go | 195 ++++ .../cmd/tools/seed/seed_moderation.go | 158 ++++ .../cmd/tools/seed/seed_notifications.go | 94 ++ .../cmd/tools/seed/seed_playlists.go | 133 +++ .../cmd/tools/seed/seed_social.go | 248 ++++++ .../cmd/tools/seed/seed_tracks.go | 224 +++++ veza-backend-api/cmd/tools/seed/seed_users.go | 376 ++++++++ veza-backend-api/cmd/tools/seed/utils.go | 251 ++++++ veza-backend-api/seed-v2 | Bin 0 -> 8480926 bytes 18 files changed, 3662 insertions(+), 662 deletions(-) create mode 100644 veza-backend-api/cmd/tools/seed/config.go create mode 100644 veza-backend-api/cmd/tools/seed/fake.go create mode 100644 veza-backend-api/cmd/tools/seed/seed_analytics.go create mode 100644 veza-backend-api/cmd/tools/seed/seed_chat.go create mode 100644 veza-backend-api/cmd/tools/seed/seed_content.go create mode 100644 veza-backend-api/cmd/tools/seed/seed_live.go create mode 100644 veza-backend-api/cmd/tools/seed/seed_marketplace.go create mode 100644 veza-backend-api/cmd/tools/seed/seed_misc.go create mode 100644 veza-backend-api/cmd/tools/seed/seed_moderation.go create mode 100644 veza-backend-api/cmd/tools/seed/seed_notifications.go create mode 100644 veza-backend-api/cmd/tools/seed/seed_playlists.go create mode 100644 veza-backend-api/cmd/tools/seed/seed_social.go create mode 100644 veza-backend-api/cmd/tools/seed/seed_tracks.go create mode 100644 veza-backend-api/cmd/tools/seed/seed_users.go create mode 100644 veza-backend-api/cmd/tools/seed/utils.go create mode 100755 veza-backend-api/seed-v2 diff --git a/veza-backend-api/Makefile b/veza-backend-api/Makefile index e4b024f8c..28f5f184b 100644 --- a/veza-backend-api/Makefile +++ b/veza-backend-api/Makefile @@ -274,9 +274,13 @@ migrate: ## Exécute les migrations de base de données db-migrate: migrate ## Alias pour migrate -db-seed: ## Peuple la base de données avec des données de test +db-seed: ## Peuple la base de données avec des données réalistes (1200 users, 5000 tracks) @echo "$(GREEN)🌱 Peuplement de la base de données...$(NC)" - @echo "$(YELLOW)⚠️ Seeding non implémenté$(NC)" + @go run ./cmd/tools/seed/ + +db-seed-minimal: ## Peuple la base avec un jeu réduit (50 users, 200 tracks) + @echo "$(GREEN)🌱 Peuplement réduit...$(NC)" + @go run ./cmd/tools/seed/ --minimal # Lab Environment migrate-lab: ## Applique les migrations en environnement Lab diff --git a/veza-backend-api/cmd/tools/seed/config.go b/veza-backend-api/cmd/tools/seed/config.go new file mode 100644 index 000000000..79a0750c2 --- /dev/null +++ b/veza-backend-api/cmd/tools/seed/config.go @@ -0,0 +1,174 @@ +package main + +import "flag" + +// Config holds all seed volume parameters. +type Config struct { + // Users + TotalUsers int + NormalUsers int + Artists int + Labels int + Moderators int + Admins int + + // Content + Tracks int + Albums int + Playlists int + PlaylistMinTracks int + PlaylistMaxTracks int + + // Social + Follows int + TrackLikes int + TrackReposts int + Comments int + CommentLikes int + + // Chat + Conversations int + Messages int + + // Live + PastLiveStreams int + LiveStreams int + + // Marketplace + Products int + Orders int + ProductReviews int + + // Analytics + PlayEvents int + ProfileViews int + AnalyticsMonths int + + // Notifications + Notifications int + + // Files + FileEntries int + + // Misc + Groups int + SupportTickets int + APIKeys int + Announcements int + Reports int + DataExports int + GearItems int + Courses int +} + +// FullConfig returns the full-scale configuration (~1200 users, ~5000 tracks). +func FullConfig() Config { + return Config{ + TotalUsers: 1200, + NormalUsers: 1000, + Artists: 150, + Labels: 30, + Moderators: 15, + Admins: 5, + + Tracks: 5000, + Albums: 300, + Playlists: 800, + PlaylistMinTracks: 5, + PlaylistMaxTracks: 50, + + Follows: 15000, + TrackLikes: 30000, + TrackReposts: 5000, + Comments: 8000, + CommentLikes: 2000, + + Conversations: 500, + Messages: 10000, + + PastLiveStreams: 200, + LiveStreams: 5, + + Products: 400, + Orders: 600, + ProductReviews: 300, + + PlayEvents: 100000, + ProfileViews: 20000, + AnalyticsMonths: 6, + + Notifications: 15000, + + FileEntries: 6000, + + Groups: 40, + SupportTickets: 80, + APIKeys: 30, + Announcements: 10, + Reports: 60, + DataExports: 15, + GearItems: 200, + Courses: 25, + } +} + +// MinimalConfig returns a reduced configuration for fast dev iteration. +func MinimalConfig() Config { + return Config{ + TotalUsers: 50, + NormalUsers: 30, + Artists: 12, + Labels: 3, + Moderators: 2, + Admins: 3, + + Tracks: 200, + Albums: 25, + Playlists: 40, + PlaylistMinTracks: 3, + PlaylistMaxTracks: 15, + + Follows: 200, + TrackLikes: 500, + TrackReposts: 100, + Comments: 150, + CommentLikes: 50, + + Conversations: 20, + Messages: 200, + + PastLiveStreams: 10, + LiveStreams: 2, + + Products: 30, + Orders: 40, + ProductReviews: 20, + + PlayEvents: 2000, + ProfileViews: 400, + AnalyticsMonths: 2, + + Notifications: 300, + + FileEntries: 250, + + Groups: 5, + SupportTickets: 10, + APIKeys: 5, + Announcements: 3, + Reports: 8, + DataExports: 3, + GearItems: 20, + Courses: 5, + } +} + +// ParseFlags parses CLI flags and returns the appropriate config. +func ParseFlags() Config { + minimal := flag.Bool("minimal", false, "Use reduced volumes (50 users, 200 tracks) for fast dev") + flag.Parse() + if *minimal { + return MinimalConfig() + } + return FullConfig() +} diff --git a/veza-backend-api/cmd/tools/seed/fake.go b/veza-backend-api/cmd/tools/seed/fake.go new file mode 100644 index 000000000..de1a258f2 --- /dev/null +++ b/veza-backend-api/cmd/tools/seed/fake.go @@ -0,0 +1,636 @@ +package main + +import ( + "fmt" + "math" + "math/rand" + "strings" + "time" + + "github.com/google/uuid" +) + +// Deterministic RNG — set once in main.go +var rng *rand.Rand + +// InitRNG initializes the deterministic RNG. +func InitRNG(seed int64) { + rng = rand.New(rand.NewSource(seed)) +} + +// ── UUID helpers ───────────────────────────────────────────────────────────── + +func newUUID() string { + // Use rng bytes to make UUIDs deterministic + var b [16]byte + for i := range b { + b[i] = byte(rng.Intn(256)) + } + b[6] = (b[6] & 0x0f) | 0x40 // version 4 + b[8] = (b[8] & 0x3f) | 0x80 // variant 1 + u, _ := uuid.FromBytes(b[:]) + return u.String() +} + +// ── Random primitives ──────────────────────────────────────────────────────── + +func randInt(min, max int) int { + if min >= max { + return min + } + return min + rng.Intn(max-min+1) +} + +func randFloat(min, max float64) float64 { + return min + rng.Float64()*(max-min) +} + +func randBool() bool { + return rng.Intn(2) == 0 +} + +func randChance(pct int) bool { + return rng.Intn(100) < pct +} + +func pick[T any](slice []T) T { + return slice[rng.Intn(len(slice))] +} + +func pickN[T any](slice []T, n int) []T { + if n >= len(slice) { + cp := make([]T, len(slice)) + copy(cp, slice) + return cp + } + perm := rng.Perm(len(slice)) + result := make([]T, n) + for i := 0; i < n; i++ { + result[i] = slice[perm[i]] + } + return result +} + +func pickWeighted(weights []float64) int { + total := 0.0 + for _, w := range weights { + total += w + } + r := rng.Float64() * total + cum := 0.0 + for i, w := range weights { + cum += w + if r <= cum { + return i + } + } + return len(weights) - 1 +} + +// ── Power-law distribution ─────────────────────────────────────────────────── + +// PowerLaw returns a value following a power-law distribution. +// Used for follower counts, play counts, etc. +func PowerLaw(min, max int, alpha float64) int { + u := rng.Float64() + x := math.Pow( + math.Pow(float64(max), alpha+1)-math.Pow(float64(min), alpha+1)*u+math.Pow(float64(min), alpha+1), + 1.0/(alpha+1), + ) + v := int(x) + if v < min { + v = min + } + if v > max { + v = max + } + return v +} + +// ── Temporal helpers ───────────────────────────────────────────────────────── + +var baseTime = time.Date(2024, 9, 1, 0, 0, 0, 0, time.UTC) + +func seedTimeRange() (time.Time, time.Time) { + return baseTime, time.Now() +} + +// RandomTimeBetween returns a random time between start and end. +func RandomTimeBetween(start, end time.Time) time.Time { + delta := end.Sub(start) + if delta <= 0 { + return start + } + offset := time.Duration(rng.Int63n(int64(delta))) + return start.Add(offset) +} + +// RandomTimeAfter returns a random time between after and now. +func RandomTimeAfter(after time.Time) time.Time { + return RandomTimeBetween(after, time.Now()) +} + +// RandomPastTime returns a random time within the seed period. +func RandomPastTime() time.Time { + start, end := seedTimeRange() + return RandomTimeBetween(start, end) +} + +// RandomRegistrationTime returns a time spread over 18 months with growth curve. +// Earlier months have fewer registrations, later months have more. +func RandomRegistrationTime(index, total int) time.Time { + start, end := seedTimeRange() + // Use a quadratic growth curve: more users registered recently + t := float64(index) / float64(total) + // Quadratic: t^1.5 gives accelerating growth + adjusted := math.Pow(t, 1.5) + offset := time.Duration(adjusted * float64(end.Sub(start))) + return start.Add(offset) +} + +// RealisticHour adjusts a time to a realistic hour (peak 18-23h, low 3-7h). +func RealisticHour(t time.Time) time.Time { + // Distribution weights for each hour (0-23) + hourWeights := []float64{ + 3, 2, 1.5, 1, 0.5, 0.5, 1, 2, // 00-07 + 4, 5, 6, 7, 7, 6, 6, 7, // 08-15 + 8, 10, 12, 14, 15, 13, 10, 6, // 16-23 + } + hour := pickWeighted(hourWeights) + minute := rng.Intn(60) + second := rng.Intn(60) + return time.Date(t.Year(), t.Month(), t.Day(), hour, minute, second, 0, t.Location()) +} + +// DaysAgo returns a time N days ago. +func DaysAgo(d int) time.Time { + return time.Now().Add(-time.Duration(d) * 24 * time.Hour) +} + +// ── Artist names ───────────────────────────────────────────────────────────── + +var artistPrefixes = []string{ + "DJ ", "MC ", "", "", "", "", "", "", "", "", // 80% no prefix +} + +var artistFirstNames = []string{ + "Luna", "Nova", "Ash", "Kai", "Rio", "Zara", "Milo", "Jade", "Axel", "Nina", + "Felix", "Aria", "Leo", "Maya", "Theo", "Isla", "Remy", "Cleo", "Hugo", "Vera", + "Soren", "Lyra", "Nico", "Freya", "Dante", "Suki", "Orion", "Yuna", "Blaze", "Kira", + "Samir", "Elara", "Raven", "Zion", "Atlas", "Sage", "Phoenix", "Echo", "Jasper", "Aurora", +} + +var artistLastParts = []string{ + "beats", "sound", "wave", "bass", "pulse", "tone", "flux", "vibe", "sonic", "audio", + "rhythm", "synth", "groove", "noise", "echo", "drift", "loop", "fade", "glitch", "static", +} + +var stylizedNames = []string{ + "KNTRL", "Nø Signal", "×void×", "fm.static", "lowkey", "BVSS", "h3lix", "wav.form", + "neo.soul", "ctrl+alt", "404.wav", "null.set", "bit.crush", "sub.zero", "hi.pass", + "vrtx", "DRMZ", "pxlgrid", "snthwv", "bassface", "deepstate", "skyline", + "midnight", "goldchain", "velvet", "crimson", "phantom", "spectra", "zenith", + "vertex", "cascade", "prism", "solstice", "tempest", "horizon", "meridian", +} + +var frenchNames = []string{ + "Amélie", "Baptiste", "Camille", "Dimitri", "Éloïse", "Florian", "Gaëlle", "Hugo", + "Inès", "Jules", "Katia", "Léo", "Manon", "Nathan", "Océane", "Pierre", + "Quentin", "Rose", "Sébastien", "Théo", "Ulysse", "Victoire", "William", "Xavier", + "Yasmine", "Zoé", "Adrien", "Bérénice", "Clément", "Diane", "Émile", "Fantine", +} + +var frenchLastNames = []string{ + "Dubois", "Martin", "Lefèvre", "Moreau", "Laurent", "Garcia", "Petit", "Roux", + "Bernard", "Robert", "Durand", "Simon", "Michel", "Richard", "Thomas", "Leroux", + "David", "Bertrand", "Fournier", "Girard", "Mercier", "Dupont", "Lambert", "Bonnet", +} + +// GenArtistName generates a realistic artist/stage name. +func GenArtistName(index int) string { + switch { + case index%5 == 0: + // Stylized name + return pick(stylizedNames) + case index%3 == 0: + // French full name + return pick(frenchNames) + " " + pick(frenchLastNames) + default: + // Prefix + first name + maybe suffix + prefix := pick(artistPrefixes) + name := pick(artistFirstNames) + if randChance(30) { + return prefix + name + " " + pick(artistLastParts) + } + return prefix + name + } +} + +// GenUsername generates a valid username (3-30 chars, [a-zA-Z0-9_]). +func GenUsername(displayName string, index int) string { + // Sanitize display name + clean := strings.Map(func(r rune) rune { + if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') || (r >= '0' && r <= '9') || r == '_' { + return r + } + if r == ' ' || r == '.' || r == '-' { + return '_' + } + // Strip accents by dropping non-ASCII + return -1 + }, displayName) + + clean = strings.ToLower(clean) + // Remove consecutive underscores + for strings.Contains(clean, "__") { + clean = strings.ReplaceAll(clean, "__", "_") + } + clean = strings.Trim(clean, "_") + + if len(clean) < 3 { + clean = fmt.Sprintf("user_%d", index) + } + + // Ensure uniqueness with index suffix + if len(clean) > 20 { + clean = clean[:20] + } + return fmt.Sprintf("%s_%04d", clean, index) +} + +// ── Track titles ───────────────────────────────────────────────────────────── + +var trackAdjectives = []string{ + "Neon", "Midnight", "Golden", "Velvet", "Crystal", "Electric", "Digital", "Cosmic", + "Lunar", "Solar", "Deep", "Lost", "Broken", "Silent", "Frozen", "Burning", + "Faded", "Hollow", "Phantom", "Sacred", "Vivid", "Crimson", "Amber", "Sapphire", + "Endless", "Haunted", "Infinite", "Liquid", "Mystic", "Urban", "Ethereal", "Raw", +} + +var trackNouns = []string{ + "Dreams", "Waves", "Lights", "Rain", "Echo", "Pulse", "Horizon", "Shadow", + "Storm", "Flame", "Drift", "Spiral", "Signal", "Memory", "Voyage", "Whisper", + "Thunder", "Mirage", "Paradise", "Frequency", "Cascade", "Odyssey", "Nebula", "Prism", + "Skyline", "Orbit", "Labyrinth", "Phoenix", "Tempest", "Solitude", "Reverie", "Zenith", +} + +var trackTemplates = []string{ + "%s %s", // "Neon Dreams" + "%s %s", // "Midnight Waves" + "The %s", // "The Storm" + "%s", // "Pulse" + "%s & %s", // "Lights & Shadows" + "After %s", // "After Rain" + "Last %s", // "Last Signal" + "%s at Dawn", // "Waves at Dawn" + "%s Protocol", // "Midnight Protocol" + "%s Sessions", // "Deep Sessions" + "Into the %s", // "Into the Storm" + "%s Mode", // "Neon Mode" +} + +// GenTrackTitle generates a realistic track title. +func GenTrackTitle() string { + tmpl := pick(trackTemplates) + count := strings.Count(tmpl, "%s") + switch count { + case 0: + return tmpl + case 1: + if randBool() { + return fmt.Sprintf(tmpl, pick(trackAdjectives)) + } + return fmt.Sprintf(tmpl, pick(trackNouns)) + case 2: + return fmt.Sprintf(tmpl, pick(trackAdjectives), pick(trackNouns)) + } + return pick(trackAdjectives) + " " + pick(trackNouns) +} + +// ── Albums ─────────────────────────────────────────────────────────────────── + +var albumTemplates = []string{ + "%s EP", "%s Vol. %d", "%s Sessions", "The %s Collection", + "%s", "%s Tapes", "%s Archives", "Side %s", +} + +func GenAlbumTitle() string { + tmpl := pick(albumTemplates) + if strings.Contains(tmpl, "%d") { + return fmt.Sprintf(tmpl, pick(trackNouns), randInt(1, 3)) + } + if strings.Contains(tmpl, "%s") { + return fmt.Sprintf(tmpl, pick(trackAdjectives)) + } + return tmpl +} + +// ── Playlist names ─────────────────────────────────────────────────────────── + +var playlistNames = []string{ + "Chill Vibes 2025", "Workout Mix", "Late Night Sessions", "Morning Coffee", + "Deep Focus", "Road Trip Playlist", "Party Starters", "Rainy Day Beats", + "Sunset Grooves", "Study Sessions", "Pre-Game Hype", "Acoustic Chill", + "Underground Gems", "Throwback Jams", "Midnight Drive", "Sunday Morning", + "Bass Heavy", "Melodic Journey", "Lo-Fi & Chill", "Festival Favorites", + "New Discoveries", "Indie Gems", "Electronic Essentials", "Hip-Hop Rotation", + "Jazz Lounge", "Ambient Textures", "Funk & Soul", "Classical Focus", + "Drum & Bass Energy", "Techno Temple", "House Classics", "Reggae Vibes", + "Synthwave Dreams", "Post-Rock Journey", "Metal Mondays", "Blues Collection", + "Downtempo Drift", "Peak Time Bangers", "Warm Up Set", "After Hours", + "Bedroom Sessions", "Creative Flow", "Gym Power", "Cooking Tunes", + "Cleaning Motivation", "Meditation Sounds", "Nature Ambiance", "City Sounds", + "Vinyl Selections", "Hidden Treasures", "Fresh Finds Weekly", "Nostalgia Trip", +} + +func GenPlaylistName(index int) string { + if index < len(playlistNames) { + return playlistNames[index] + } + adj := pick(trackAdjectives) + noun := pick([]string{"Mix", "Playlist", "Collection", "Selection", "Vibes", "Beats", "Tunes", "Session"}) + return fmt.Sprintf("%s %s #%d", adj, noun, index) +} + +// ── Genres ──────────────────────────────────────────────────────────────────── + +type GenreInfo struct { + Name string + Slug string + BPMRange [2]int + Keys []string +} + +var Genres = []GenreInfo{ + {"Electronic", "electronic", [2]int{120, 140}, []string{"Am", "Cm", "Dm", "Em", "Fm"}}, + {"House", "house", [2]int{118, 130}, []string{"Am", "Cm", "Dm", "G", "F"}}, + {"Techno", "techno", [2]int{125, 150}, []string{"Am", "Dm", "Em", "Bm", "Cm"}}, + {"Ambient", "ambient", [2]int{60, 100}, []string{"C", "D", "F", "G", "Am"}}, + {"Drum & Bass", "drum-and-bass", [2]int{160, 180}, []string{"Am", "Dm", "Em", "Fm", "Gm"}}, + {"Dubstep", "dubstep", [2]int{135, 145}, []string{"Dm", "Em", "Fm", "Gm", "Am"}}, + {"Trance", "trance", [2]int{130, 150}, []string{"Am", "Dm", "Em", "Cm", "Fm"}}, + {"Jazz", "jazz", [2]int{80, 160}, []string{"Dm", "Gm", "Cm", "Fm", "Bb"}}, + {"Rock", "rock", [2]int{100, 160}, []string{"E", "A", "D", "G", "Em"}}, + {"Pop", "pop", [2]int{90, 130}, []string{"C", "G", "Am", "F", "D"}}, + {"Hip-Hop", "hip-hop", [2]int{70, 100}, []string{"Cm", "Fm", "Gm", "Dm", "Am"}}, + {"Classical", "classical", [2]int{40, 180}, []string{"C", "D", "G", "Am", "Em"}}, + {"Folk", "folk", [2]int{80, 130}, []string{"G", "C", "D", "Am", "Em"}}, + {"Reggae", "reggae", [2]int{60, 90}, []string{"Am", "Dm", "G", "C", "Em"}}, + {"Soul", "soul", [2]int{70, 110}, []string{"Dm", "Am", "Gm", "Cm", "Fm"}}, + {"Funk", "funk", [2]int{90, 120}, []string{"Em", "Am", "Dm", "G", "A"}}, + {"Blues", "blues", [2]int{60, 120}, []string{"E", "A", "B", "Am", "Em"}}, + {"Metal", "metal", [2]int{100, 200}, []string{"Em", "Am", "Dm", "E", "D"}}, + {"Indie", "indie", [2]int{90, 140}, []string{"C", "G", "Am", "F", "Em"}}, + {"Experimental", "experimental", [2]int{40, 200}, []string{"", "Am", "C", "Dm", ""}}, + {"World", "world", [2]int{70, 140}, []string{"Dm", "Am", "Em", "G", "C"}}, + {"Latin", "latin", [2]int{80, 140}, []string{"Am", "Dm", "G", "C", "Em"}}, + {"Lo-Fi", "lo-fi", [2]int{60, 90}, []string{"Am", "Dm", "Em", "C", "Fm"}}, +} + +// GenreForArtist returns 1-3 consistent genres for an artist. +func GenreForArtist(artistIndex int) []GenreInfo { + // Use artist index as seed for consistency + primary := artistIndex % len(Genres) + count := 1 + rng.Intn(3) + result := []GenreInfo{Genres[primary]} + // Add nearby genres + for i := 1; i < count && i < len(Genres); i++ { + next := (primary + i) % len(Genres) + result = append(result, Genres[next]) + } + return result +} + +// ── Bio generator ──────────────────────────────────────────────────────────── + +var bioTemplates = []string{ + "Producteur %s basé à %s. %s", + "%s artist exploring the boundaries of %s and %s.", + "Making %s since %d. %s", + "Born in %s, raised on %s. Currently working on new material.", + "%s producer & DJ. Resident at %s. %s", + "Independent %s artist. Available for collaborations.", + "Passionate about %s and sound design. %s", + "Multi-instrumentalist blending %s with %s. Based in %s.", + "Creating sonic landscapes between %s and %s.", + "🎵 %s | %s | Based in %s", +} + +var cities = []string{ + "Paris", "Lyon", "Marseille", "Toulouse", "Bordeaux", "Nantes", "Lille", "Strasbourg", + "Berlin", "London", "Amsterdam", "Barcelona", "Brussels", "Montreal", "New York", + "Los Angeles", "Tokyo", "Lagos", "São Paulo", "Melbourne", "Stockholm", "Vienna", +} + +var bioSuffixes = []string{ + "Open for collabs.", "New EP coming soon.", "Bookings: see website.", + "Label founder.", "Self-taught producer.", "Vinyl collector.", + "Always looking for new sounds.", "Music is a journey, not a destination.", + "", "", "", // Sometimes no suffix +} + +func GenBio(genre string) string { + tmpl := pick(bioTemplates) + city := pick(cities) + suffix := pick(bioSuffixes) + year := randInt(2008, 2023) + genre2 := pick(Genres).Name + + s := tmpl + s = strings.Replace(s, "%s", genre, 1) + s = strings.Replace(s, "%s", city, 1) + s = strings.Replace(s, "%s", suffix, 1) + s = strings.Replace(s, "%s", genre2, 1) + s = strings.Replace(s, "%s", city, 1) + s = strings.Replace(s, "%d", fmt.Sprintf("%d", year), 1) + // Clean up leftover %s + for strings.Contains(s, "%s") { + s = strings.Replace(s, "%s", pick([]string{genre, city, suffix}), 1) + } + return s +} + +// GenShortBio generates a 20-80 char bio for regular users. +func GenShortBio() string { + bios := []string{ + "Music lover.", "Just here for the vibes.", "Discovering new sounds daily.", + "Vinyl junkie.", "Festival goer. Playlist maker.", "Underground music enthusiast.", + "Bass head.", "Chillwave addict.", "Lo-fi and coffee.", "Night owl.", + "Always on repeat.", "Headphones on, world off.", "Eclectic listener.", + "Beatmaker wannabe.", "Melody seeker.", "Groove collector.", + "Sound explorer.", "Audio nerd.", "Rhythm is life.", + "Music is the answer.", "Curator of good vibes.", + } + return pick(bios) +} + +// ── Comment generator ──────────────────────────────────────────────────────── + +var commentTemplates = []string{ + "This track is incredible! 🔥", "Love the vibe on this one.", + "The production quality is amazing.", "Can't stop listening to this.", + "This hits different at night.", "Perfect track for my playlist.", + "The bass on this is insane.", "Beautiful melody, well done!", + "Discovered this today, instant favorite.", "The mix is so clean.", + "This deserves way more plays.", "Reminds me of early %s.", + "Your best work yet!", "How did you get that synth sound?", + "The drop at 1:30 is everything.", "Smooth production, respect.", + "This needs to be in a movie soundtrack.", "Played this 10 times today already.", + "The atmosphere on this track is unreal.", "Fire 🔥🔥🔥", + "Adding this to every playlist.", "The outro is hauntingly beautiful.", + "Chef's kiss on the mastering.", "This is what I needed today.", + "Absolute banger.", "So underrated.", "The groove never stops.", + "Your sound design skills are next level.", "Pure vibes.", + "This brought me back to my first rave.", "Incredible arrangement.", + "The percussion work is stellar.", "Love the vocal chops.", + "This gives me goosebumps every time.", "What DAW did you use?", + "Certified classic.", "Sharing this with everyone I know.", + "The transition at 2:45 is genius.", "Perfect driving music.", + "I could listen to this forever.", "The ambiance is just right.", +} + +func GenComment() string { + tmpl := pick(commentTemplates) + if strings.Contains(tmpl, "%s") { + return fmt.Sprintf(tmpl, pick(Genres).Name) + } + return tmpl +} + +// ── Message generator ──────────────────────────────────────────────────────── + +var chatMessages = []string{ + "Hey, what's up?", "Anyone heard the new release?", "Great set last night!", + "Looking for collab partners.", "What plugins do you recommend?", + "Just finished a new track, feedback welcome!", "Thanks for the follow!", + "Love your latest upload.", "When's your next live stream?", + "Check out my new playlist.", "The mix sounds great.", + "What DAW are you using?", "Ableton or FL Studio?", + "Anyone going to the festival this summer?", "Great community here.", + "Need help with mixing, any tips?", "The platform is awesome.", + "Just uploaded my first track!", "Who wants to do a remix swap?", + "Your sound design is incredible.", "How do you get that bass sound?", + "Thanks for sharing!", "Welcome to the group!", + "Let's set up a listening session.", "Perfect track for the weekend.", + "Anyone know good sample packs?", "Mastering tips?", + "Studio session later?", "New beat ready for vocals.", + "This community is fire.", "Appreciate the support everyone!", +} + +func GenMessage() string { + return pick(chatMessages) +} + +// ── Product names ──────────────────────────────────────────────────────────── + +var productTypes = []string{"beat", "sample-pack", "beat", "sample-pack", "beat"} +var productCategories = []string{ + "beats", "samples", "electronic", "house", "acoustic", "stems", + "hip-hop", "trap", "lo-fi", "ambient", "dj-tools", "sfx", "sync", +} + +func GenProductTitle(genre string) string { + templates := []string{ + "%s Beat Pack Vol. %d", "%s Essentials", "%s Sample Collection", + "%s Stems Bundle", "%s Loop Kit", "Premium %s Beats", + "%s Sound Design Pack", "%s Producer Kit", "%s One-Shots", + "%s Drum Kit", "%s Texture Pack", "%s Presets Collection", + } + tmpl := pick(templates) + if strings.Contains(tmpl, "%d") { + return fmt.Sprintf(tmpl, genre, randInt(1, 5)) + } + return fmt.Sprintf(tmpl, genre) +} + +// ── IP and User-Agent generators ───────────────────────────────────────────── + +func GenIP() string { + return fmt.Sprintf("%d.%d.%d.%d", randInt(1, 223), randInt(0, 255), randInt(0, 255), randInt(1, 254)) +} + +var userAgents = []string{ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_0) AppleWebKit/537.36 Chrome/119.0.0.0", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/120.0.0.0", + "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15", + "Mozilla/5.0 (Android 14; Mobile) AppleWebKit/537.36 Chrome/120.0.0.0", + "Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X) AppleWebKit/605.1.15", +} + +func GenUserAgent() string { + return pick(userAgents) +} + +var countryCodes = []string{ + "FR", "FR", "FR", "FR", "FR", // 50% French + "US", "US", "DE", "GB", "BE", "CA", "CH", "ES", "IT", "NL", + "JP", "BR", "AU", "SE", "PT", "MA", "SN", "CI", "TN", "DZ", +} + +func GenCountry() string { + return pick(countryCodes) +} + +var sources = []string{"web", "web", "web", "mobile", "mobile", "api"} + +func GenSource() string { + return pick(sources) +} + +// ── Room names ─────────────────────────────────────────────────────────────── + +var roomNames = []string{ + "General", "Production Tips", "Beat Marketplace", "Feedback Corner", + "Mixing & Mastering", "Vinyl Talk", "Festival Chat", "Sample Swap", + "Sound Design Lab", "Artist Lounge", "New Releases", "Collab Hub", + "Genre Discussion", "Gear Talk", "Music Theory", "Business & Promo", + "Open Mic", "Challenge of the Week", "Studio Setup", "Intro Thread", +} + +// ── Gear ───────────────────────────────────────────────────────────────────── + +type GearTemplate struct { + Name, Category, Brand, Model string + Price float64 +} + +var gearTemplates = []GearTemplate{ + {"Ableton Push 3", "controller", "Ableton", "Push 3", 999}, + {"Focal Shape 65", "monitors", "Focal", "Shape 65", 599}, + {"RME Babyface Pro FS", "audio-interface", "RME", "Babyface Pro FS", 849}, + {"Akai MPC One+", "sampler", "Akai", "MPC One+", 699}, + {"Audio-Technica AT2020", "microphone", "Audio-Technica", "AT2020", 99}, + {"Beyerdynamic DT 770 Pro", "headphones", "Beyerdynamic", "DT 770 Pro", 159}, + {"Zoom H6", "recorder", "Zoom", "H6", 349}, + {"Sennheiser MKH 416", "microphone", "Sennheiser", "MKH 416", 999}, + {"Pioneer DDJ-1000", "dj-controller", "Pioneer", "DDJ-1000", 1199}, + {"Allen & Heath Xone:96", "mixer", "Allen & Heath", "Xone:96", 1899}, + {"Martin D-28", "guitar", "Martin", "D-28", 2999}, + {"Neumann U87", "microphone", "Neumann", "U87", 3199}, + {"Korg Minilogue XD", "synthesizer", "Korg", "Minilogue XD", 649}, + {"Arturia KeyLab 61 MkII", "controller", "Arturia", "KeyLab 61 MkII", 449}, + {"Universal Audio Apollo Twin", "audio-interface", "Universal Audio", "Apollo Twin", 899}, + {"Yamaha HS8", "monitors", "Yamaha", "HS8", 349}, + {"Shure SM7B", "microphone", "Shure", "SM7B", 399}, + {"Roland TR-8S", "drum-machine", "Roland", "TR-8S", 599}, + {"Moog Subsequent 37", "synthesizer", "Moog", "Subsequent 37", 1499}, + {"Native Instruments Maschine+", "sampler", "Native Instruments", "Maschine+", 1399}, + {"Audient iD14 MkII", "audio-interface", "Audient", "iD14 MkII", 249}, + {"KRK Rokit 5 G4", "monitors", "KRK", "Rokit 5 G4", 179}, + {"Rode NT1-A", "microphone", "Rode", "NT1-A", 229}, + {"Elektron Digitakt II", "sampler", "Elektron", "Digitakt II", 899}, + {"Teenage Engineering OP-1 Field", "synthesizer", "Teenage Engineering", "OP-1 Field", 1999}, +} + +// ── Live stream titles ─────────────────────────────────────────────────────── + +var liveStreamTitles = []string{ + "Friday Night Set", "Production Session — New EP Preview", "Beat Making LIVE", + "Acoustic Session — Unplugged", "Late Night Vinyl Mix", "Sunday Jazz Session", + "Studio Tour & Q&A", "Making a Track From Scratch", "Mixing Masterclass", + "Sample Flipping Challenge", "Ambient Soundscape Session", "Open Decks Night", + "Synth Jam Session", "Drum Programming Workshop", "Vocal Recording Session", + "Lo-Fi Beats to Study To — LIVE", "Deep House Sunday", "Techno Warehouse Set", + "Indie Acoustic Session", "Sound Design Exploration", +} diff --git a/veza-backend-api/cmd/tools/seed/main.go b/veza-backend-api/cmd/tools/seed/main.go index d358fa1e9..1f52a8e2e 100644 --- a/veza-backend-api/cmd/tools/seed/main.go +++ b/veza-backend-api/cmd/tools/seed/main.go @@ -4,688 +4,211 @@ import ( "database/sql" "fmt" "log" - "math/rand" "os" - "strings" "time" - "github.com/google/uuid" "github.com/joho/godotenv" _ "github.com/lib/pq" - "golang.org/x/crypto/bcrypt" ) -// ─── helpers ──────────────────────────────────────────────────────────────── -func must(err error, msg string) { - if err != nil { - log.Fatalf("%s: %v", msg, err) - } -} - -func tryExec(db *sql.DB, query string, args ...interface{}) { - _, _ = db.Exec(query, args...) -} - -func execOrWarn(db *sql.DB, label string, query string, args ...interface{}) { - if _, err := db.Exec(query, args...); err != nil { - log.Printf(" ⚠ %s: %v", label, err) - } -} - -func countRows(db *sql.DB, table string) int { - var n int - _ = db.QueryRow(fmt.Sprintf("SELECT COUNT(*) FROM %s", table)).Scan(&n) - return n -} - -func randBetween(min, max int) int { return min + rand.Intn(max-min+1) } - -func daysAgo(d int) time.Time { return time.Now().Add(-time.Duration(d) * 24 * time.Hour) } - -func hoursAgo(h int) time.Time { return time.Now().Add(-time.Duration(h) * time.Hour) } - -// ─── main ─────────────────────────────────────────────────────────────────── func main() { _ = godotenv.Load() + + cfg := ParseFlags() + + // Deterministic seed for reproducibility + InitRNG(42) + dbURL := os.Getenv("DATABASE_URL") if dbURL == "" { log.Fatal("DATABASE_URL not set") } db, err := sql.Open("postgres", dbURL) - must(err, "DB connect") + if err != nil { + log.Fatalf("DB connect: %v", err) + } defer db.Close() - must(db.Ping(), "DB ping") + if err := db.Ping(); err != nil { + log.Fatalf("DB ping: %v", err) + } - fmt.Println("╔═══════════════════════════════════════════════╗") - fmt.Println("║ VEZA — Database Seed Script ║") - fmt.Println("╚═══════════════════════════════════════════════╝") + // Increase connection pool for bulk operations + db.SetMaxOpenConns(10) + db.SetMaxIdleConns(5) + + startTime := time.Now() + + fmt.Println("╔═══════════════════════════════════════════════════════════╗") + fmt.Println("║ VEZA — Realistic Database Seeder v2 ║") + fmt.Println("╚═══════════════════════════════════════════════════════════╝") + fmt.Printf("\n Mode: %s\n", modeName(cfg)) + fmt.Printf(" Users: %d | Tracks: %d | Plays: %d\n\n", cfg.TotalUsers, cfg.Tracks, cfg.PlayEvents) + + // ── TRUNCATE all tables ────────────────────────────────────────────────── + fmt.Print("Truncating all tables... ") + if err := TruncateAll(db); err != nil { + log.Fatalf("truncate: %v", err) + } + fmt.Println("done") + + // ── SEED in dependency order ───────────────────────────────────────────── + + // Level 0: Users (no FK dependencies) + users, err := SeedUsers(db, cfg) + if err != nil { + log.Fatalf("seed users: %v", err) + } + + // Level 1: Tracks (depends on users) + tracks, err := SeedTracks(db, cfg, users) + if err != nil { + log.Fatalf("seed tracks: %v", err) + } + + // Level 2: Playlists (depends on users, tracks) + _, err = SeedPlaylists(db, cfg, users, tracks) + if err != nil { + log.Fatalf("seed playlists: %v", err) + } + + // Level 2: Social (depends on users, tracks) + if err := SeedSocial(db, cfg, users, tracks); err != nil { + log.Fatalf("seed social: %v", err) + } + + // Level 2: Chat (depends on users) + _, err = SeedChat(db, cfg, users) + if err != nil { + log.Fatalf("seed chat: %v", err) + } + + // Level 2: Live streams (depends on users) + if err := SeedLive(db, cfg, users, tracks); err != nil { + log.Fatalf("seed live: %v", err) + } + + // Level 2: Marketplace (depends on users, tracks) + _, err = SeedMarketplace(db, cfg, users, tracks) + if err != nil { + log.Fatalf("seed marketplace: %v", err) + } + + // Level 3: Analytics (depends on users, tracks — heaviest step) + if err := SeedAnalytics(db, cfg, users, tracks); err != nil { + log.Fatalf("seed analytics: %v", err) + } + + // Level 2: Content (depends on users, tracks) + if err := SeedContent(db, cfg, users, tracks); err != nil { + log.Fatalf("seed content: %v", err) + } + + // Level 2: Moderation (depends on users, tracks) + if err := SeedModeration(db, cfg, users, tracks); err != nil { + log.Fatalf("seed moderation: %v", err) + } + + // Level 2: Notifications (depends on users) + if err := SeedNotifications(db, cfg, users); err != nil { + log.Fatalf("seed notifications: %v", err) + } + + // Level 2: Misc (depends on users) + if err := SeedMisc(db, cfg, users); err != nil { + log.Fatalf("seed misc: %v", err) + } + + // ── VALIDATION ─────────────────────────────────────────────────────────── + fmt.Println("\n═══ VALIDATION ═══") + validate(db) + + // ── SUMMARY ────────────────────────────────────────────────────────────── + elapsed := time.Since(startTime) fmt.Println() - - // Hash a shared password (bcrypt cost 12) - hash, err := bcrypt.GenerateFromPassword([]byte("Password123!"), 12) - must(err, "bcrypt") - pw := string(hash) - - // ═════════════════════════════════════════════════════════════════════════ - // USERS (10) - // ═════════════════════════════════════════════════════════════════════════ - type user struct { - id, email, username, display, role, bio string - isAdmin bool - } - - var users []user - if countRows(db, "users") == 0 { - fmt.Print("Creating users... ") - users = []user{ - {uuid.NewString(), "admin@veza.fr", "admin_veza", "Admin Veza", "admin", "Platform administrator", true}, - {uuid.NewString(), "amelie@veza.fr", "amelie_dubois", "Amelie Dubois", "creator", "Productrice electro basee a Paris. Melodic techno & ambient.", false}, - {uuid.NewString(), "marcus@veza.fr", "marcus_beats", "Marcus Beats", "creator", "Beatmaker from Lyon. Hip-hop, trap, lo-fi.", false}, - {uuid.NewString(), "sakura@veza.fr", "sakura_sound", "Sakura Sound", "creator", "Sound designer & foley artist. Cinematic textures.", false}, - {uuid.NewString(), "djrenzo@veza.fr", "dj_renzo", "DJ Renzo", "creator", "House & disco edits. Paris nightlife.", false}, - {uuid.NewString(), "clara@veza.fr", "clara_voice", "Clara Voix", "creator", "Singer-songwriter. Indie folk & acoustic.", false}, - {uuid.NewString(), "listener1@veza.fr", "music_lover", "Music Lover", "user", "Just here for the vibes.", false}, - {uuid.NewString(), "listener2@veza.fr", "groove_hunter", "Groove Hunter", "user", "Always looking for fresh beats.", false}, - {uuid.NewString(), "listener3@veza.fr", "night_owl", "Night Owl", "premium", "Late night music sessions.", false}, - {uuid.NewString(), "mod@veza.fr", "moderator_veza", "Moderator", "moderator", "Community moderator.", false}, - } - for _, u := range users { - _, err := db.Exec(`INSERT INTO users (id, email, email_verified_at, password_hash, username, slug, display_name, - role, is_active, is_verified, is_admin, bio, created_at, updated_at) - VALUES ($1,$2,NOW(),$3,$4,$5,$6,$7,true,true,$8,$9,NOW()-interval '1 day'*$10,NOW())`, - u.id, u.email, pw, u.username, u.username, u.display, u.role, u.isAdmin, u.bio, randBetween(1, 60)) - must(err, "user "+u.username) - } - fmt.Printf("%d created\n", len(users)) - - // Profiles & settings - for _, u := range users { - tryExec(db, `INSERT INTO user_profiles (user_id,bio,tagline,language,theme,profile_visibility) VALUES ($1,$2,$3,'fr','auto','public')`, - u.id, u.bio, strings.Split(u.bio, ".")[0]) - tryExec(db, `INSERT INTO user_settings (user_id) VALUES ($1) ON CONFLICT DO NOTHING`, u.id) - } - // Roles - tryExec(db, `INSERT INTO user_roles (user_id,role_id) SELECT $1,id FROM roles WHERE name='admin' ON CONFLICT DO NOTHING`, users[0].id) - tryExec(db, `INSERT INTO user_roles (user_id,role_id) SELECT $1,id FROM roles WHERE name='moderator' ON CONFLICT DO NOTHING`, users[9].id) - } else { - fmt.Println("Users already exist — loading IDs...") - rows, _ := db.Query(`SELECT id,email,username,display_name,role,COALESCE(bio,''),is_admin FROM users ORDER BY created_at LIMIT 10`) - for rows != nil && rows.Next() { - var u user - _ = rows.Scan(&u.id, &u.email, &u.username, &u.display, &u.role, &u.bio, &u.isAdmin) - users = append(users, u) - } - if rows != nil { - rows.Close() - } - } - - if len(users) < 10 { - fmt.Println("⚠ Need at least 10 users for full seed. Exiting.") - os.Exit(0) - } - - amelieID := users[1].id - marcusID := users[2].id - sakuraID := users[3].id - renzoID := users[4].id - claraID := users[5].id - - // ═════════════════════════════════════════════════════════════════════════ - // TRACKS (22) - // ═════════════════════════════════════════════════════════════════════════ - type track struct { - id, creator, title, artist, album, genre, key, tags string - duration, bpm int - } - var tracks []track - - if countRows(db, "tracks") == 0 { - fmt.Print("Creating tracks... ") - tracks = []track{ - {uuid.NewString(), amelieID, "Neon Dreams", "Amelie Dubois", "Neon EP", "electronic", "Am", "{electronic,ambient,melodic}", 342, 128}, - {uuid.NewString(), amelieID, "Midnight Protocol", "Amelie Dubois", "Neon EP", "techno", "Dm", "{techno,dark,melodic}", 410, 132}, - {uuid.NewString(), amelieID, "Aurora Borealis", "Amelie Dubois", "Neon EP", "ambient", "C", "{ambient,atmospheric,chill}", 520, 90}, - {uuid.NewString(), amelieID, "Digital Rain", "Amelie Dubois", "Singles", "electronic", "Em", "{electronic,synth,progressive}", 285, 126}, - {uuid.NewString(), amelieID, "Pulse", "Amelie Dubois", "Singles", "techno", "Bm", "{techno,driving,peak}", 378, 134}, - {uuid.NewString(), marcusID, "Late Night Loops", "Marcus Beats", "Bedroom Sessions", "hip-hop", "Cm", "{lofi,chill,beats}", 198, 85}, - {uuid.NewString(), marcusID, "Concrete Jungle", "Marcus Beats", "Bedroom Sessions", "hip-hop", "Fm", "{hiphop,boom-bap,gritty}", 225, 90}, - {uuid.NewString(), marcusID, "Velvet Touch", "Marcus Beats", "Bedroom Sessions", "r&b", "Ab", "{rnb,smooth,lofi}", 240, 78}, - {uuid.NewString(), marcusID, "City Lights", "Marcus Beats", "Singles", "trap", "Gm", "{trap,melodic,urban}", 210, 140}, - {uuid.NewString(), marcusID, "Rainy Days", "Marcus Beats", "Singles", "lo-fi", "D", "{lofi,rain,relax}", 180, 72}, - {uuid.NewString(), sakuraID, "Forest Whispers", "Sakura Sound", "Nature Vol.1", "ambient", "F", "{nature,foley,cinematic}", 480, 60}, - {uuid.NewString(), sakuraID, "Ocean Depths", "Sakura Sound", "Nature Vol.1", "ambient", "Eb", "{water,deep,ambient}", 540, 55}, - {uuid.NewString(), sakuraID, "Thunder Plains", "Sakura Sound", "Nature Vol.1", "cinematic", "Bb", "{storm,epic,cinematic}", 360, 80}, - {uuid.NewString(), sakuraID, "Urban Field Recording", "Sakura Sound", "Singles", "experimental", "", "{field-recording,urban,experimental}", 300, 0}, - {uuid.NewString(), renzoID, "Saturday Night Edit", "DJ Renzo", "Club Cuts", "house", "G", "{house,disco,funky}", 420, 122}, - {uuid.NewString(), renzoID, "Funky Elevator", "DJ Renzo", "Club Cuts", "disco", "A", "{disco,funk,groovy}", 355, 118}, - {uuid.NewString(), renzoID, "Deep in the Club", "DJ Renzo", "Club Cuts", "deep house", "Dm", "{deephouse,minimal,late-night}", 480, 124}, - {uuid.NewString(), renzoID, "Sunrise Set", "DJ Renzo", "Singles", "house", "C", "{house,progressive,sunrise}", 600, 120}, - {uuid.NewString(), claraID, "Paper Boats", "Clara Voix", "Whisper", "folk", "G", "{folk,acoustic,indie}", 220, 95}, - {uuid.NewString(), claraID, "Morning Light", "Clara Voix", "Whisper", "indie", "D", "{indie,dreamy,morning}", 198, 100}, - {uuid.NewString(), claraID, "Letters Never Sent", "Clara Voix", "Whisper", "folk", "Em", "{folk,emotional,singer-songwriter}", 265, 88}, - {uuid.NewString(), claraID, "Wildflowers", "Clara Voix", "Singles", "acoustic", "C", "{acoustic,nature,gentle}", 185, 92}, - } - for i, t := range tracks { - createdAt := daysAgo(60 - i*2) - // file_path uses "audio/{Title_With_Underscores}.mp3" matching generated audio files - filePath := "audio/" + strings.ReplaceAll(t.title, " ", "_") + ".mp3" - _, err := db.Exec(`INSERT INTO tracks (id,creator_id,user_id,title,artist,album,genre,duration,bpm,musical_key, - visibility,is_public,is_downloadable,status,stream_status,play_count,like_count,tags,file_path,format,published_at,created_at,updated_at) - VALUES ($1,$2,$2,$3,$4,$5,$6,$7,$8,$9,'public',true,false,'completed','ready',$10,$11,$12::text[],$14,'mp3',$13,$13,$13)`, - t.id, t.creator, t.title, t.artist, t.album, t.genre, t.duration, t.bpm, t.key, - randBetween(10, 500), randBetween(2, 50), t.tags, createdAt, filePath) - must(err, "track "+t.title) - } - fmt.Printf("%d created\n", len(tracks)) - } else { - fmt.Println("Tracks already exist — loading IDs...") - rows, _ := db.Query(`SELECT id,creator_id,title,artist,COALESCE(album,''),COALESCE(genre,''),COALESCE(musical_key,''),'{}',duration,COALESCE(bpm,0) FROM tracks ORDER BY created_at LIMIT 22`) - for rows != nil && rows.Next() { - var t track - _ = rows.Scan(&t.id, &t.creator, &t.title, &t.artist, &t.album, &t.genre, &t.key, &t.tags, &t.duration, &t.bpm) - tracks = append(tracks, t) - } - if rows != nil { - rows.Close() - } - } - - // ═════════════════════════════════════════════════════════════════════════ - // PLAYLISTS (6) - // ═════════════════════════════════════════════════════════════════════════ - type playlist struct{ id, user, name, desc string } - var playlists []playlist - - if countRows(db, "playlists") < 6 { - fmt.Print("Creating playlists... ") - playlists = []playlist{ - {uuid.NewString(), amelieID, "Late Night Techno", "My favorite tracks for late sessions"}, - {uuid.NewString(), marcusID, "Chill Beats Study", "Perfect background music for focus"}, - {uuid.NewString(), renzoID, "Weekend Warm-Up", "Pre-party essentials"}, - {uuid.NewString(), claraID, "Acoustic Mornings", "Gentle wake-up tracks"}, - {uuid.NewString(), users[6].id, "Discovery Mix", "New finds from this month"}, - {uuid.NewString(), users[7].id, "Workout Energy", "High-BPM motivation"}, - } - for _, p := range playlists { - tryExec(db, `INSERT INTO playlists (id,user_id,name,title,description,visibility,is_public,is_collaborative) VALUES ($1,$2,$3,$3,$4,'public',true,false)`, - p.id, p.user, p.name, p.desc) - } - fmt.Printf("%d created\n", len(playlists)) - - // Playlist tracks - ptMap := []struct{ pi int; ti []int }{ - {0, []int{0, 1, 4, 14, 16, 17}}, {1, []int{5, 7, 9, 18, 19}}, - {2, []int{14, 15, 16, 3, 4}}, {3, []int{18, 19, 20, 21, 10}}, - {4, []int{0, 5, 10, 14, 18, 8}}, {5, []int{1, 4, 8, 14, 15, 16}}, - } - for _, pt := range ptMap { - for pos, ti := range pt.ti { - if ti < len(tracks) { - tryExec(db, `INSERT INTO playlist_tracks (playlist_id,track_id,position,added_by) VALUES ($1,$2,$3,$4)`, - playlists[pt.pi].id, tracks[ti].id, pos, playlists[pt.pi].user) - } - } - tryExec(db, `UPDATE playlists SET track_count=(SELECT COUNT(*) FROM playlist_tracks WHERE playlist_id=$1) WHERE id=$1`, playlists[pt.pi].id) - } - } else { - fmt.Println("Playlists already exist — skipping") - } - - // ═════════════════════════════════════════════════════════════════════════ - // FOLLOWS (18) - // ═════════════════════════════════════════════════════════════════════════ - if countRows(db, "follows") < 10 { - fmt.Print("Creating follows... ") - follows := [][2]int{ - // Listeners follow creators - {6, 1}, {6, 2}, {6, 4}, {7, 1}, {7, 3}, {7, 4}, {7, 2}, - {8, 1}, {8, 2}, {8, 3}, {8, 4}, {8, 5}, - // Creators follow each other - {1, 2}, {2, 1}, {1, 4}, {4, 1}, {3, 1}, {5, 2}, {5, 3}, - // Admin follows all creators (so feed has content) - {0, 1}, {0, 2}, {0, 3}, {0, 4}, {0, 5}, - } - c := 0 - for _, f := range follows { - if _, err := db.Exec(`INSERT INTO follows (follower_id,followed_id) VALUES ($1,$2) ON CONFLICT DO NOTHING`, users[f[0]].id, users[f[1]].id); err == nil { - c++ - } - } - fmt.Printf("%d created\n", c) - } - - // ═════════════════════════════════════════════════════════════════════════ - // CHAT ROOMS & MESSAGES - // ═════════════════════════════════════════════════════════════════════════ - if countRows(db, "rooms") == 0 { - fmt.Print("Creating chat rooms & messages... ") - roomIDs := [3]string{uuid.NewString(), uuid.NewString(), uuid.NewString()} - roomData := []struct{ name, owner string }{ - {"General", users[0].id}, {"Production Tips", amelieID}, {"Beat Marketplace", marcusID}, - } - for i, r := range roomData { - tryExec(db, `INSERT INTO rooms (id,name,owner_id,creator_id,room_type,is_private,created_at,updated_at) VALUES ($1,$2,$3,$3,'group',false,NOW(),NOW())`, roomIDs[i], r.name, r.owner) - } - for _, rid := range roomIDs { - for _, u := range users[:8] { - tryExec(db, `INSERT INTO room_members (room_id,user_id,role) VALUES ($1,$2,'member') ON CONFLICT DO NOTHING`, rid, u.id) - } - } - msgs := []struct{ r, s int; c string }{ - {0, 1, "Hey everyone! Welcome to Veza."}, {0, 2, "Glad to be here. Just uploaded some new beats!"}, - {0, 6, "Love the vibes on this platform."}, {0, 3, "Anyone interested in some cinematic samples?"}, - {0, 4, "Weekend set coming soon, stay tuned!"}, {1, 1, "What DAW is everyone using?"}, - {1, 2, "Ableton all the way. FL Studio for quick ideas."}, {1, 3, "Pro Tools for recording, Reaper for mixing."}, - {1, 5, "Logic Pro X here. Love the stock plugins."}, {2, 2, "New beat pack dropping this weekend. 10 beats, all original."}, - {2, 7, "How much for exclusive rights?"}, {2, 2, "DM me for pricing on exclusives!"}, - } - for i, m := range msgs { - ts := hoursAgo(len(msgs) - i) - tryExec(db, `INSERT INTO messages (room_id,sender_id,user_id,content,message_type,created_at,updated_at) VALUES ($1,$2,$2,$3,'text',$4,$4)`, - roomIDs[m.r], users[m.s].id, m.c, ts) - } - fmt.Printf("3 rooms, %d messages\n", len(msgs)) - } - - // ═════════════════════════════════════════════════════════════════════════ - // TRACK PLAYS (analytics — fixed column names) - // ═════════════════════════════════════════════════════════════════════════ - if countRows(db, "track_plays") == 0 { - fmt.Print("Creating play history... ") - c := 0 - listeners := []int{6, 7, 8} - sources := []string{"web", "mobile", "api"} - countries := []string{"FR", "US", "DE", "GB", "JP", "BR", "CA"} - for _, li := range listeners { - for _, t := range tracks { - // Each listener plays ~70% of tracks, some multiple times - plays := 0 - if rand.Intn(10) < 7 { - plays = 1 - } - if rand.Intn(10) < 3 { - plays = randBetween(2, 5) // replay - } - for p := 0; p < plays; p++ { - ts := daysAgo(randBetween(0, 45)) - dur := t.duration * randBetween(60, 100) / 100 // 60-100% of track - tryExec(db, `INSERT INTO track_plays (track_id,user_id,duration,played_at,source,country_code,created_at,updated_at) - VALUES ($1,$2,$3,$4,$5,$6,$4,$4)`, - t.id, users[li].id, dur, ts, sources[rand.Intn(len(sources))], countries[rand.Intn(len(countries))]) - c++ - } - } - } - fmt.Printf("%d plays recorded\n", c) - } - - // ═════════════════════════════════════════════════════════════════════════ - // TRACK LIKES - // ═════════════════════════════════════════════════════════════════════════ - if countRows(db, "track_likes") < 20 { - fmt.Print("Creating likes... ") - c := 0 - for _, li := range []int{6, 7, 8} { - for i, t := range tracks { - if i%3 == 0 || i%5 == 0 || rand.Intn(4) == 0 { - if _, err := db.Exec(`INSERT INTO track_likes (track_id,user_id) VALUES ($1,$2) ON CONFLICT DO NOTHING`, t.id, users[li].id); err == nil { - c++ - } - } - } - } - fmt.Printf("%d likes\n", c) - } - - // ═════════════════════════════════════════════════════════════════════════ - // COMMENTS - // ═════════════════════════════════════════════════════════════════════════ - if countRows(db, "comments") == 0 { - fmt.Print("Creating comments... ") - commentData := []struct{ track, user int; content string }{ - {0, 6, "This track is incredible, the synth work is amazing!"}, {0, 7, "Perfect for late night coding sessions."}, - {0, 8, "Amelie never disappoints. 🔥"}, {1, 7, "Dark and moody, love it."}, - {5, 6, "These loops are so clean."}, {5, 8, "Could listen to this on repeat all day."}, - {7, 6, "Smooth R&B vibes, exactly what I needed."}, {10, 8, "Beautiful nature sounds, so calming."}, - {14, 7, "DJ Renzo always brings the groove!"}, {14, 6, "This one gets the party started!"}, - {18, 6, "Clara your voice is so beautiful."}, {18, 8, "Acoustic perfection."}, - {20, 7, "This made me emotional, beautiful songwriting."}, {9, 6, "Lo-fi perfection for rainy days."}, - {3, 8, "The production quality is top notch."}, {16, 7, "Deep house at its finest."}, - {11, 6, "I can hear the ocean in my headphones."}, {19, 8, "Morning Light is my alarm song now."}, - {4, 7, "Peak time techno! Need this in a set."}, {15, 6, "Funky Elevator is an instant classic."}, - } - for _, cm := range commentData { - if cm.track < len(tracks) { - tryExec(db, `INSERT INTO comments (user_id,target_id,target_type,content,created_at,updated_at) VALUES ($1,$2,'track',$3,$4,$4)`, - users[cm.user].id, tracks[cm.track].id, cm.content, daysAgo(randBetween(0, 30))) - } - } - fmt.Printf("%d comments\n", len(commentData)) - } - - // ═════════════════════════════════════════════════════════════════════════ - // NOTIFICATIONS (fixed: column "read" not "is_read", "content" not "message") - // ═════════════════════════════════════════════════════════════════════════ - if countRows(db, "notifications") == 0 { - fmt.Print("Creating notifications... ") - notifs := []struct{ user int; ntype, title, content string }{ - {1, "follow", "New follower", "music_lover started following you"}, - {1, "follow", "New follower", "groove_hunter started following you"}, - {2, "follow", "New follower", "night_owl started following you"}, - {1, "like", "Track liked", "Someone liked your track Neon Dreams"}, - {2, "like", "Track liked", "Someone liked your track Late Night Loops"}, - {3, "like", "Track liked", "Someone liked your track Forest Whispers"}, - {4, "comment", "New comment", "music_lover commented on Saturday Night Edit"}, - {5, "comment", "New comment", "night_owl commented on Paper Boats"}, - {1, "system", "Welcome", "Welcome to Veza! Start by uploading your first track."}, - {6, "system", "Welcome", "Welcome to Veza! Discover amazing music from independent artists."}, - {7, "system", "Welcome", "Welcome to Veza! Follow your favorite artists to see their new releases."}, - {0, "system", "Admin alert", "New user registrations this week: 5"}, - {2, "milestone", "Milestone reached", "Your track Late Night Loops just hit 100 plays!"}, - {1, "milestone", "Milestone reached", "You now have 5 followers!"}, - } - for _, n := range notifs { - tryExec(db, `INSERT INTO notifications (user_id,type,title,content,read,created_at,updated_at) VALUES ($1,$2,$3,$4,false,$5,$5)`, - users[n.user].id, n.ntype, n.title, n.content, daysAgo(randBetween(0, 14))) - } - fmt.Printf("%d created\n", len(notifs)) - } - - // ═════════════════════════════════════════════════════════════════════════ - // PRODUCTS (marketplace — 12 products from creators) - // ═════════════════════════════════════════════════════════════════════════ - type product struct{ id, seller, title, desc, ptype, license, category string; price float64; trackIdx int; bpm int; key string } - var products []product - - if countRows(db, "products") == 0 { - fmt.Print("Creating marketplace products... ") - products = []product{ - {uuid.NewString(), marcusID, "Lo-Fi Beats Pack Vol.1", "10 royalty-free lo-fi beats for content creators", "sample-pack", "non-exclusive", "beats", 29.99, -1, 80, "Cm"}, - {uuid.NewString(), marcusID, "Trap Essentials", "5 hard-hitting trap beats ready to use", "sample-pack", "non-exclusive", "beats", 19.99, -1, 140, "Gm"}, - {uuid.NewString(), amelieID, "Neon Dreams — Exclusive License", "Full exclusive rights to Neon Dreams", "beat", "exclusive", "electronic", 299.99, 0, 128, "Am"}, - {uuid.NewString(), amelieID, "Synth Textures Pack", "50 custom synth one-shots and loops", "sample-pack", "non-exclusive", "samples", 14.99, -1, 0, ""}, - {uuid.NewString(), amelieID, "Techno Stems — Midnight Protocol", "Individual stems for remix", "beat", "non-exclusive", "stems", 49.99, 1, 132, "Dm"}, - {uuid.NewString(), renzoID, "Disco Edits Bundle", "3 disco edits ready for DJ sets", "sample-pack", "non-exclusive", "dj-tools", 24.99, -1, 120, "G"}, - {uuid.NewString(), renzoID, "Saturday Night Edit — License", "Non-exclusive license for streaming", "beat", "non-exclusive", "house", 39.99, 14, 122, "G"}, - {uuid.NewString(), sakuraID, "Cinematic Foley Collection", "200+ foley sounds from nature recordings", "sample-pack", "non-exclusive", "sfx", 34.99, -1, 0, ""}, - {uuid.NewString(), sakuraID, "Ambient Textures Vol.1", "Layered ambient textures for film scoring", "sample-pack", "non-exclusive", "ambient", 19.99, -1, 0, ""}, - {uuid.NewString(), claraID, "Acoustic Guitar Loops", "15 acoustic guitar loops in various keys", "sample-pack", "non-exclusive", "acoustic", 12.99, -1, 95, "G"}, - {uuid.NewString(), claraID, "Paper Boats — Sync License", "Sync license for film/TV/ads", "beat", "non-exclusive", "sync", 149.99, 18, 95, "G"}, - {uuid.NewString(), marcusID, "City Lights — Lease", "Standard lease for City Lights beat", "beat", "non-exclusive", "trap", 49.99, 8, 140, "Gm"}, - } - for _, p := range products { - var trackID interface{} - if p.trackIdx >= 0 && p.trackIdx < len(tracks) { - trackID = tracks[p.trackIdx].id - } - tryExec(db, `INSERT INTO products (id,seller_id,title,description,price,currency,status,product_type,track_id,license_type,bpm,musical_key,category,created_at,updated_at) - VALUES ($1,$2,$3,$4,$5,'EUR','active',$6,$7,$8,$9,$10,$11,NOW()-interval '1 day'*$12,NOW())`, - p.id, p.seller, p.title, p.desc, p.price, p.ptype, trackID, p.license, p.bpm, p.key, p.category, randBetween(1, 30)) - } - fmt.Printf("%d products\n", len(products)) - } else { - fmt.Println("Products already exist — loading IDs...") - rows, _ := db.Query(`SELECT id,seller_id,title FROM products ORDER BY created_at LIMIT 12`) - for rows != nil && rows.Next() { - var p product - _ = rows.Scan(&p.id, &p.seller, &p.title) - products = append(products, p) - } - if rows != nil { - rows.Close() - } - } - - // ═════════════════════════════════════════════════════════════════════════ - // ORDERS & ORDER ITEMS (4 completed purchases) - // ═════════════════════════════════════════════════════════════════════════ - if countRows(db, "orders") == 0 && len(products) >= 6 { - fmt.Print("Creating orders... ") - orderData := []struct{ buyer int; productIdxs []int; total float64 }{ - {6, []int{0, 3}, 44.98}, // music_lover buys lo-fi pack + synth textures - {7, []int{1, 5}, 44.98}, // groove_hunter buys trap essentials + disco edits - {8, []int{6, 9}, 52.98}, // night_owl buys saturday night license + acoustic loops - {6, []int{7}, 34.99}, // music_lover buys foley collection - } - for _, o := range orderData { - oid := uuid.NewString() - tryExec(db, `INSERT INTO orders (id,buyer_id,total_amount,currency,status,created_at,updated_at) VALUES ($1,$2,$3,'EUR','completed',$4,$4)`, - oid, users[o.buyer].id, o.total, daysAgo(randBetween(1, 20))) - for _, pi := range o.productIdxs { - if pi < len(products) { - tryExec(db, `INSERT INTO order_items (order_id,product_id,price) VALUES ($1,$2,$3)`, oid, products[pi].id, products[pi].price) - } - } - } - fmt.Printf("%d orders\n", len(orderData)) - } - - // ═════════════════════════════════════════════════════════════════════════ - // DAILY TRACK STATS (last 30 days for top tracks) - // ═════════════════════════════════════════════════════════════════════════ - if countRows(db, "daily_track_stats") == 0 { - fmt.Print("Creating daily track stats... ") - c := 0 - for _, t := range tracks[:10] { // top 10 tracks - for d := 0; d < 30; d++ { - date := daysAgo(d).Format("2006-01-02") - plays := randBetween(1, 25) - uniq := randBetween(1, plays) - complete := randBetween(0, uniq) - totalTime := plays * t.duration * randBetween(60, 100) / 100 - avgCompl := float64(randBetween(50, 95)) / 100 - tryExec(db, `INSERT INTO daily_track_stats (track_id,date,total_plays,unique_listeners,complete_listens,total_play_time,avg_completion_rate) VALUES ($1,$2,$3,$4,$5,$6,$7) ON CONFLICT DO NOTHING`, - t.id, date, plays, uniq, complete, totalTime, avgCompl) - c++ - } - } - fmt.Printf("%d stat rows\n", c) - } - - // ═════════════════════════════════════════════════════════════════════════ - // COURSES & LESSONS (education) - // ═════════════════════════════════════════════════════════════════════════ - if countRows(db, "courses") == 0 { - fmt.Print("Creating courses & lessons... ") - courseData := []struct{ creator, title, slug, desc, category, level string; price int; lessonCount int }{ - {amelieID, "Introduction to Music Production", "intro-music-production", "Learn the basics of music production with Ableton Live. From your first beat to a finished track.", "production", "beginner", 0, 8}, - {amelieID, "Melodic Techno Masterclass", "melodic-techno-masterclass", "Deep dive into melodic techno production techniques, sound design, and arrangement.", "production", "intermediate", 4999, 12}, - {marcusID, "Hip-Hop Beat Making 101", "hiphop-beatmaking-101", "Learn to make hard-hitting hip-hop beats from scratch. Sampling, drum programming, mixing.", "production", "beginner", 2999, 10}, - {sakuraID, "Field Recording & Sound Design", "field-recording-sound-design", "Capture the world around you and turn it into cinematic soundscapes.", "sound-design", "intermediate", 3999, 6}, - {claraID, "Songwriting for Beginners", "songwriting-beginners", "Find your voice, write meaningful lyrics, and structure your songs.", "songwriting", "beginner", 0, 5}, - } - for _, cd := range courseData { - cid := uuid.NewString() - status := "published" - var publishedAt interface{} = daysAgo(randBetween(5, 40)) - tryExec(db, `INSERT INTO courses (id,creator_id,title,slug,description,category,tags,price_cents,currency,pricing_model,status,level,language,lesson_count,published_at,created_at,updated_at) - VALUES ($1,$2,$3,$4,$5,$6,ARRAY['music','production'],$7,'EUR','fixed',$8,$9,'fr',$10,$11,$12,$12)`, - cid, cd.creator, cd.title, cd.slug, cd.desc, cd.category, cd.price, status, cd.level, cd.lessonCount, publishedAt, daysAgo(randBetween(10, 50))) - - // Create lessons for this course - lessonTitles := []string{ - "Getting Started", "Setting Up Your DAW", "Understanding Audio Basics", "Your First Beat", - "Melody and Harmony", "Sound Design Fundamentals", "Arrangement Techniques", "Mixing Basics", - "EQ and Compression", "Effects and Processing", "Mastering Your Track", "Final Project", - } - for li := 0; li < cd.lessonCount && li < len(lessonTitles); li++ { - tryExec(db, `INSERT INTO lessons (course_id,order_index,title,description,duration_seconds,is_preview_free,transcoding_status) VALUES ($1,$2,$3,$4,$5,$6,'completed')`, - cid, li, lessonTitles[li], fmt.Sprintf("Lesson %d of %s", li+1, cd.title), randBetween(300, 1800), li < 2) - } - } - fmt.Printf("%d courses\n", len(courseData)) - - // Enroll some users - rows, _ := db.Query(`SELECT id FROM courses LIMIT 5`) - var courseIDs []string - for rows != nil && rows.Next() { - var id string - _ = rows.Scan(&id) - courseIDs = append(courseIDs, id) - } - if rows != nil { - rows.Close() - } - for _, cid := range courseIDs { - for _, ui := range []int{6, 7, 8} { - if rand.Intn(3) == 0 { - tryExec(db, `INSERT INTO course_enrollments (user_id,course_id,status,purchased_at) VALUES ($1,$2,'active',NOW()-interval '1 day'*$3) ON CONFLICT DO NOTHING`, - users[ui].id, cid, randBetween(1, 20)) - } - } - } - } - - // ═════════════════════════════════════════════════════════════════════════ - // GEAR ITEMS (creator equipment) - // ═════════════════════════════════════════════════════════════════════════ - if countRows(db, "gear_items") == 0 { - fmt.Print("Creating gear inventory... ") - gearData := []struct{ user int; name, cat, brand, model, status, condition string; price float64 }{ - {1, "Ableton Push 3", "controller", "Ableton", "Push 3", "Active", "Excellent", 999}, - {1, "Focal Shape 65", "monitors", "Focal", "Shape 65", "Active", "Good", 599}, - {1, "RME Babyface Pro FS", "audio-interface", "RME", "Babyface Pro FS", "Active", "Excellent", 849}, - {2, "Akai MPC One+", "sampler", "Akai", "MPC One+", "Active", "Good", 699}, - {2, "Audio-Technica AT2020", "microphone", "Audio-Technica", "AT2020", "Active", "Good", 99}, - {2, "Beyerdynamic DT 770 Pro", "headphones", "Beyerdynamic", "DT 770 Pro", "Active", "Fair", 159}, - {3, "Zoom H6", "recorder", "Zoom", "H6", "Active", "Excellent", 349}, - {3, "Sennheiser MKH 416", "microphone", "Sennheiser", "MKH 416", "Active", "Good", 999}, - {4, "Pioneer DDJ-1000", "dj-controller", "Pioneer", "DDJ-1000", "Active", "Good", 1199}, - {4, "Allen & Heath Xone:96", "mixer", "Allen & Heath", "Xone:96", "Active", "Excellent", 1899}, - {5, "Martin D-28", "guitar", "Martin", "D-28", "Active", "Good", 2999}, - {5, "Neumann U87", "microphone", "Neumann", "U87", "Active", "Excellent", 3199}, - } - for _, g := range gearData { - tryExec(db, `INSERT INTO gear_items (user_id,name,category,brand,model,status,condition,purchase_price,currency,purchase_date,is_public,created_at,updated_at) - VALUES ($1,$2,$3,$4,$5,$6,$7,$8,'EUR',$9,true,NOW(),NOW())`, - users[g.user].id, g.name, g.cat, g.brand, g.model, g.status, g.condition, g.price, daysAgo(randBetween(30, 365)).Format("2006-01-02")) - } - fmt.Printf("%d items\n", len(gearData)) - } - - // ═════════════════════════════════════════════════════════════════════════ - // LIVE STREAMS (scheduled + past) - // ═════════════════════════════════════════════════════════════════════════ - if countRows(db, "live_streams") == 0 { - fmt.Print("Creating live streams... ") - liveData := []struct{ user int; title, desc, cat string; isLive bool; viewers int }{ - {4, "Friday Night Disco Set", "Live disco & house set from my studio", "dj-set", false, 0}, - {1, "Production Session — New EP Preview", "Working on new melodic techno tracks live", "production", false, 0}, - {2, "Beat Making LIVE — Taking Requests", "Making beats on the spot, drop your ideas in chat", "production", false, 0}, - {5, "Acoustic Session — Unplugged", "Playing some originals and covers", "performance", false, 0}, - } - for _, l := range liveData { - tryExec(db, `INSERT INTO live_streams (user_id,title,description,category,streamer_name,is_live,viewer_count,tags,scheduled_at,created_at,updated_at) - VALUES ($1,$2,$3,$4,$5,$6,$7,'[]'::jsonb,$8,NOW(),NOW())`, - users[l.user].id, l.title, l.desc, l.cat, users[l.user].display, l.isLive, l.viewers, - daysAgo(-randBetween(1, 14))) // future scheduled - } - fmt.Printf("%d streams\n", len(liveData)) - } - - // ═════════════════════════════════════════════════════════════════════════ - // ANNOUNCEMENTS - // ═════════════════════════════════════════════════════════════════════════ - if countRows(db, "announcements") == 0 { - fmt.Print("Creating announcements... ") - annData := []struct{ title, content, atype string }{ - {"Welcome to Veza!", "We're thrilled to launch Veza — an ethical music platform built for artists and listeners. Explore, create, and connect.", "info"}, - {"Marketplace Now Open", "Buy and sell beats, samples, and presets directly on the platform. Fair pricing, transparent licensing.", "feature"}, - {"Scheduled Maintenance", "Brief maintenance window planned for Sunday 3am-5am CET. Streams may be briefly interrupted.", "warning"}, - } - for _, a := range annData { - tryExec(db, `INSERT INTO announcements (title,content,type,is_active,starts_at,created_by,created_at) VALUES ($1,$2,$3,true,NOW(),$4,NOW())`, - a.title, a.content, a.atype, users[0].id) - } - fmt.Printf("%d announcements\n", len(annData)) - } - - // ═════════════════════════════════════════════════════════════════════════ - // SUPPORT TICKETS - // ═════════════════════════════════════════════════════════════════════════ - if countRows(db, "support_tickets") == 0 { - fmt.Print("Creating support tickets... ") - ticketData := []struct{ user int; email, subject, msg, cat, status string }{ - {6, "listener1@veza.fr", "Cannot upload profile picture", "I keep getting an error when trying to upload my avatar. File is a 2MB JPEG.", "technical", "open"}, - {7, "listener2@veza.fr", "How to create a playlist?", "I'm new here, how do I create a collaborative playlist?", "general", "resolved"}, - {2, "marcus@veza.fr", "Payment not received for beat sale", "Sold a beat 5 days ago but haven't received the payout yet.", "billing", "open"}, - {8, "listener3@veza.fr", "Feature request: dark mode scheduler", "Would love to have dark mode auto-switch at sunset.", "feature", "open"}, - } - for _, t := range ticketData { - tryExec(db, `INSERT INTO support_tickets (user_id,email,subject,message,category,status,created_at) VALUES ($1,$2,$3,$4,$5,$6,$7)`, - users[t.user].id, t.email, t.subject, t.msg, t.cat, t.status, daysAgo(randBetween(0, 10))) - } - fmt.Printf("%d tickets\n", len(ticketData)) - } - - // ═════════════════════════════════════════════════════════════════════════ - // API KEYS (developer portal) - // ═════════════════════════════════════════════════════════════════════════ - if countRows(db, "api_keys") == 0 { - fmt.Print("Creating API keys... ") - apiKeyData := []struct{ user int; name string; scopes string }{ - {1, "Amelie Production Bot", "{read,write,tracks}"}, - {2, "Marcus Beat Distributor", "{read,tracks,marketplace}"}, - } - for _, k := range apiKeyData { - prefix := fmt.Sprintf("veza_%s", uuid.NewString()[:8]) - hashedKey, _ := bcrypt.GenerateFromPassword([]byte(uuid.NewString()), 10) - tryExec(db, `INSERT INTO api_keys (user_id,name,prefix,hashed_key,scopes,created_at) VALUES ($1,$2,$3,$4,$5::text[],NOW())`, - users[k.user].id, k.name, prefix, string(hashedKey), k.scopes) - } - fmt.Printf("%d keys\n", len(apiKeyData)) - } - - // ═════════════════════════════════════════════════════════════════════════ - // ANALYTICS EVENTS (general platform events) - // ═════════════════════════════════════════════════════════════════════════ - if countRows(db, "analytics_events") == 0 { - fmt.Print("Creating analytics events... ") - c := 0 - eventTypes := []string{"page_view", "track_play", "search", "playlist_create", "follow", "signup", "login"} - for d := 0; d < 14; d++ { - numEvents := randBetween(20, 80) - for e := 0; e < numEvents; e++ { - userIdx := rand.Intn(len(users)) - evt := eventTypes[rand.Intn(len(eventTypes))] - tryExec(db, `INSERT INTO analytics_events (event_name,user_id,payload,created_at) VALUES ($1,$2,$3,$4)`, - evt, users[userIdx].id, fmt.Sprintf(`{"source":"web","page":"/dashboard","session_id":"%s"}`, uuid.NewString()[:8]), - daysAgo(d).Add(time.Duration(randBetween(0, 86400))*time.Second)) - c++ - } - } - fmt.Printf("%d events\n", c) - } - - // ═════════════════════════════════════════════════════════════════════════ - // SUMMARY - // ═════════════════════════════════════════════════════════════════════════ - fmt.Println() - fmt.Println("╔═══════════════════════════════════════════════╗") - fmt.Println("║ Seed Complete! ║") - fmt.Println("╚═══════════════════════════════════════════════╝") + fmt.Println("╔═══════════════════════════════════════════════════════════╗") + fmt.Println("║ Seed Complete! ║") + fmt.Println("╚═══════════════════════════════════════════════════════════╝") fmt.Println() tables := []string{ - "users", "tracks", "playlists", "follows", "rooms", "messages", - "track_plays", "track_likes", "comments", "notifications", - "products", "orders", "order_items", "daily_track_stats", - "courses", "lessons", "course_enrollments", "gear_items", - "live_streams", "announcements", "support_tickets", "api_keys", "analytics_events", - } - for _, t := range tables { - fmt.Printf(" %-24s %d rows\n", t, countRows(db, t)) + "users", "user_profiles", "user_settings", "user_roles", + "tracks", "track_genres", "track_tags", + "playlists", "playlist_tracks", "playlist_follows", + "follows", "track_likes", "track_reposts", "track_comments", "comments", "user_blocks", + "rooms", "room_members", "messages", + "live_streams", "co_listening_sessions", + "products", "orders", "order_items", "product_reviews", + "seller_stripe_accounts", "seller_balances", + "track_plays", "playback_history", "daily_track_stats", + "geographic_play_stats", "analytics_events", + "files", "user_storage_quotas", + "courses", "lessons", "course_enrollments", + "gear_items", + "groups", "group_members", + "reports", "moderation_actions", "user_strikes", "user_suspensions", + "notifications", "notification_preferences", + "support_tickets", "api_keys", "announcements", + "data_exports", "login_history", "user_preferences", } + totalRows := 0 + for _, t := range tables { + n := CountRows(db, t) + totalRows += n + fmt.Printf(" %-30s %7d rows\n", t, n) + } + + fmt.Printf("\n %-30s %7d rows\n", "TOTAL", totalRows) + fmt.Printf(" %-30s %s\n", "Duration", elapsed.Round(time.Millisecond)) + + fmt.Println("\n--- Test Accounts ---") + for _, ta := range testAccounts { + fmt.Printf(" %-12s %-25s password: %s\n", ta.Role, ta.Email, ta.Password) + } fmt.Println() - fmt.Println("--- Login Credentials (Password123! for all) ---") - fmt.Println(" Admin: admin@veza.fr") - fmt.Println(" Creator: amelie@veza.fr / marcus@veza.fr / sakura@veza.fr") - fmt.Println(" Creator: djrenzo@veza.fr / clara@veza.fr") - fmt.Println(" Listener: listener1@veza.fr / listener2@veza.fr / listener3@veza.fr") - fmt.Println(" Moderator: mod@veza.fr") - fmt.Println() - fmt.Println(" Dashboard: http://veza.fr:5173/dashboard") +} + +func modeName(cfg Config) string { + if cfg.TotalUsers <= 100 { + return "MINIMAL" + } + return "FULL" +} + +// validate checks data integrity. +func validate(db *sql.DB) { + checks := []struct { + name string + query string + }{ + {"test accounts exist", "SELECT COUNT(*) FROM users WHERE email IN ('admin@veza.music','artist@veza.music','user@veza.music','mod@veza.music','new@veza.music')"}, + {"no orphan track_plays", "SELECT COUNT(*) FROM track_plays tp LEFT JOIN tracks t ON tp.track_id = t.id WHERE t.id IS NULL"}, + {"no orphan follows", "SELECT COUNT(*) FROM follows f LEFT JOIN users u ON f.follower_id = u.id WHERE u.id IS NULL"}, + {"no orphan playlist_tracks", "SELECT COUNT(*) FROM playlist_tracks pt LEFT JOIN playlists p ON pt.playlist_id = p.id WHERE p.id IS NULL"}, + {"no orphan messages", "SELECT COUNT(*) FROM messages m LEFT JOIN rooms r ON m.room_id = r.id WHERE r.id IS NULL"}, + {"no orphan order_items", "SELECT COUNT(*) FROM order_items oi LEFT JOIN orders o ON oi.order_id = o.id WHERE o.id IS NULL"}, + } + + for _, c := range checks { + var n int + err := db.QueryRow(c.query).Scan(&n) + if err != nil { + fmt.Printf(" ⚠ %s: query error: %v\n", c.name, err) + continue + } + if c.name == "test accounts exist" { + if n == 5 { + fmt.Printf(" ✓ %s: %d/5\n", c.name, n) + } else { + fmt.Printf(" ✗ %s: only %d/5 found!\n", c.name, n) + } + } else { + if n == 0 { + fmt.Printf(" ✓ %s: OK\n", c.name) + } else { + fmt.Printf(" ✗ %s: %d orphans found!\n", c.name, n) + } + } + } } diff --git a/veza-backend-api/cmd/tools/seed/seed_analytics.go b/veza-backend-api/cmd/tools/seed/seed_analytics.go new file mode 100644 index 000000000..3ca57eba7 --- /dev/null +++ b/veza-backend-api/cmd/tools/seed/seed_analytics.go @@ -0,0 +1,211 @@ +package main + +import ( + "database/sql" + "fmt" + "time" +) + +// SeedAnalytics creates track_plays, playback_history, daily_track_stats, +// geographic_play_stats, and analytics_events. +func SeedAnalytics(db *sql.DB, cfg Config, users []SeededUser, tracks []SeededTrack) error { + fmt.Println("\n═══ ANALYTICS ═══") + + if len(tracks) == 0 || len(users) == 0 { + return nil + } + + // ── 1. Track plays (the big one) ───────────────────────────────────────── + p := NewProgress("track_plays", cfg.PlayEvents) + playRows := make([][]interface{}, 0, cfg.PlayEvents) + + monthsBack := cfg.AnalyticsMonths + startDate := time.Now().AddDate(0, -monthsBack, 0) + + for i := 0; i < cfg.PlayEvents; i++ { + user := users[rng.Intn(len(users))] + // Power-law: popular tracks get way more plays + track := tracks[PowerLaw(0, len(tracks)-1, 1.5)] + + playedAt := RandomTimeBetween(startDate, time.Now()) + playedAt = RealisticHour(playedAt) + + // Duration: 30-100% of track (most listen to 60%+) + pctListened := randInt(30, 100) + duration := track.Duration * pctListened / 100 + if duration < 1 { + duration = 1 + } + + playRows = append(playRows, []interface{}{ + newUUID(), track.ID, user.ID, duration, + playedAt, nil, nil, GenUserAgent(), + GenSource(), GenCountry(), + playedAt, playedAt, nil, + }) + } + + _, err := BulkInsert(db, "track_plays", + "id, track_id, user_id, duration, played_at, device, ip_address, user_agent, source, country_code, created_at, updated_at, deleted_at", + playRows) + if err != nil { + return fmt.Errorf("insert track_plays: %w", err) + } + p.Update(cfg.PlayEvents) + p.Done() + + // ── 2. Playback history ────────────────────────────────────────────────── + historyCount := cfg.PlayEvents / 5 // 20% of plays recorded in history + p = NewProgress("playback_history", historyCount) + historyRows := make([][]interface{}, 0, historyCount) + + for i := 0; i < historyCount; i++ { + user := users[rng.Intn(len(users))] + track := tracks[rng.Intn(len(tracks))] + playedAt := RandomTimeBetween(startDate, time.Now()) + duration := randInt(30, track.Duration) + completion := 0 + if track.Duration > 0 { + completion = duration * 100 / track.Duration + } + if completion > 100 { + completion = 100 + } + source := GenSource() + device := pick([]string{"desktop", "mobile", "tablet"}) + + historyRows = append(historyRows, []interface{}{ + newUUID(), user.ID, track.ID, + duration, completion, source, nil, device, playedAt, + }) + } + + _, err = BulkInsert(db, "playback_history", + "id, user_id, track_id, played_duration, completion_percentage, source, source_id, device_type, played_at", + historyRows) + if err != nil { + return fmt.Errorf("insert playback_history: %w", err) + } + p.Update(historyCount) + p.Done() + + // ── 3. Daily track stats ───────────────────────────────────────────────── + // Top 200 tracks, 180 days of stats + topTrackCount := len(tracks) / 5 + if topTrackCount > 200 { + topTrackCount = 200 + } + days := monthsBack * 30 + statsCount := topTrackCount * days + p = NewProgress("daily_track_stats", statsCount) + statsRows := make([][]interface{}, 0, statsCount) + + for ti := 0; ti < topTrackCount; ti++ { + track := tracks[ti] + for d := 0; d < days; d++ { + date := time.Now().AddDate(0, 0, -d).Format("2006-01-02") + // Growth curve: more plays for newer days + dayMultiplier := float64(days-d) / float64(days) + basePlays := PowerLaw(0, 50, 1.0) + totalPlays := int(float64(basePlays) * (0.5 + dayMultiplier)) + if totalPlays < 0 { + totalPlays = 0 + } + uniqueListeners := totalPlays * randInt(50, 90) / 100 + if uniqueListeners < 0 { + uniqueListeners = 0 + } + completeListens := uniqueListeners * randInt(40, 80) / 100 + totalPlayTime := totalPlays * track.Duration * randInt(60, 100) / 100 + avgCompletion := randFloat(0.4, 0.95) + + statsRows = append(statsRows, []interface{}{ + track.ID, date, totalPlays, uniqueListeners, + completeListens, totalPlayTime, avgCompletion, + }) + } + } + + _, err = BulkInsertRaw(db, "daily_track_stats", + "track_id, date, total_plays, unique_listeners, complete_listens, total_play_time, avg_completion_rate", + statsRows, "ON CONFLICT (track_id, date) DO NOTHING") + if err != nil { + return fmt.Errorf("insert daily_track_stats: %w", err) + } + p.Update(len(statsRows)) + p.Done() + + // ── 4. Geographic play stats ───────────────────────────────────────────── + geoCount := topTrackCount * 10 // ~10 countries per top track + p = NewProgress("geographic_play_stats", geoCount) + geoRows := make([][]interface{}, 0, geoCount) + + for ti := 0; ti < topTrackCount; ti++ { + track := tracks[ti] + countries := pickN(countryCodes, randInt(3, 10)) + for _, cc := range countries { + date := time.Now().AddDate(0, 0, -randInt(0, days)).Format("2006-01-02") + geoRows = append(geoRows, []interface{}{ + newUUID(), track.ID, cc, "", date, + int64(randInt(1, 5000)), int64(randInt(1, 3000)), + time.Now(), time.Now(), + }) + } + } + + _, _ = BulkInsert(db, "geographic_play_stats", + "id, track_id, country_code, region, date, play_count, unique_listeners, created_at, updated_at", + geoRows) + p.Update(len(geoRows)) + p.Done() + + // ── 5. Analytics events ────────────────────────────────────────────────── + eventCount := cfg.PlayEvents / 4 + p = NewProgress("analytics_events", eventCount) + eventRows := make([][]interface{}, 0, eventCount) + eventTypes := []string{ + "page_view", "track_play", "search", "playlist_create", + "follow", "signup", "login", "track_upload", "profile_view", + "playlist_view", "marketplace_view", "product_view", + } + + for i := 0; i < eventCount; i++ { + user := users[rng.Intn(len(users))] + evt := pick(eventTypes) + createdAt := RandomTimeBetween(startDate, time.Now()) + createdAt = RealisticHour(createdAt) + payload := fmt.Sprintf(`{"source":"%s","page":"/dashboard","session_id":"%s"}`, GenSource(), newUUID()[:8]) + + eventRows = append(eventRows, []interface{}{ + newUUID(), evt, user.ID, payload, createdAt, + }) + } + + _, err = BulkInsert(db, "analytics_events", + "id, event_name, user_id, payload, created_at", + eventRows) + if err != nil { + return fmt.Errorf("insert analytics_events: %w", err) + } + p.Update(eventCount) + p.Done() + + // ── 6. Update track play/like counts ───────────────────────────────────── + p = NewProgress("update track counts", 1) + _, _ = db.Exec("UPDATE tracks SET play_count = (SELECT COUNT(*) FROM track_plays WHERE track_plays.track_id = tracks.id)") + _, _ = db.Exec("UPDATE tracks SET like_count = (SELECT COUNT(*) FROM track_likes WHERE track_likes.track_id = tracks.id)") + _, _ = db.Exec("UPDATE tracks SET comment_count = (SELECT COUNT(*) FROM track_comments WHERE track_comments.track_id = tracks.id)") + p.Update(1) + p.Done() + + // ── 7. Update user profile counts ──────────────────────────────────────── + p = NewProgress("update profile counts", 1) + _, _ = db.Exec("UPDATE user_profiles SET follower_count = (SELECT COUNT(*) FROM follows WHERE follows.followed_id = user_profiles.user_id)") + _, _ = db.Exec("UPDATE user_profiles SET following_count = (SELECT COUNT(*) FROM follows WHERE follows.follower_id = user_profiles.user_id)") + _, _ = db.Exec("UPDATE user_profiles SET track_count = (SELECT COUNT(*) FROM tracks WHERE tracks.creator_id = user_profiles.user_id AND tracks.deleted_at IS NULL)") + _, _ = db.Exec("UPDATE user_profiles SET playlist_count = (SELECT COUNT(*) FROM playlists WHERE playlists.user_id = user_profiles.user_id AND playlists.deleted_at IS NULL)") + p.Update(1) + p.Done() + + return nil +} diff --git a/veza-backend-api/cmd/tools/seed/seed_chat.go b/veza-backend-api/cmd/tools/seed/seed_chat.go new file mode 100644 index 000000000..00492a845 --- /dev/null +++ b/veza-backend-api/cmd/tools/seed/seed_chat.go @@ -0,0 +1,169 @@ +package main + +import ( + "database/sql" + "fmt" + "time" +) + +// SeededRoom holds room data. +type SeededRoom struct { + ID string + CreatorID string + Name string +} + +// SeedChat creates rooms, room_members, messages, read_receipts, and message_reactions. +func SeedChat(db *sql.DB, cfg Config, users []SeededUser) ([]SeededRoom, error) { + fmt.Println("\n═══ CHAT ═══") + + rooms := make([]SeededRoom, 0, cfg.Conversations) + allUsers := users + + // ── 1. Create rooms ────────────────────────────────────────────────────── + // Mix of group rooms and DM rooms + groupCount := cfg.Conversations / 5 // 20% group rooms + dmCount := cfg.Conversations - groupCount // 80% DMs + + p := NewProgress("rooms", cfg.Conversations) + roomRows := make([][]interface{}, 0, cfg.Conversations) + + // Group rooms + for i := 0; i < groupCount; i++ { + id := newUUID() + creator := allUsers[rng.Intn(len(allUsers))] + name := pick(roomNames) + if i >= len(roomNames) { + name = fmt.Sprintf("%s #%d", pick(roomNames), i) + } + slug := fmt.Sprintf("room-%d", i) + createdAt := RandomTimeAfter(creator.CreatedAt) + + r := SeededRoom{ID: id, CreatorID: creator.ID, Name: name} + rooms = append(rooms, r) + + roomRows = append(roomRows, []interface{}{ + id, name, slug, fmt.Sprintf("Group chat: %s", name), + "group", false, nil, 50, // room_type, is_private, password_hash, max_members + creator.ID, 0, 0, creator.ID, true, + createdAt, createdAt, nil, + }) + } + + // DM rooms + for i := 0; i < dmCount; i++ { + id := newUUID() + user1 := allUsers[rng.Intn(len(allUsers))] + user2 := allUsers[rng.Intn(len(allUsers))] + if user1.ID == user2.ID { + continue + } + slug := fmt.Sprintf("dm-%d", i) + createdAt := RandomTimeAfter(user1.CreatedAt) + + r := SeededRoom{ID: id, CreatorID: user1.ID, Name: "DM"} + rooms = append(rooms, r) + + roomRows = append(roomRows, []interface{}{ + id, nil, slug, nil, + "direct", true, nil, 2, + user1.ID, 0, 0, user1.ID, true, + createdAt, createdAt, nil, + }) + } + + _, err := BulkInsert(db, "rooms", + "id, name, slug, description, room_type, is_private, password_hash, max_members, creator_id, member_count, message_count, owner_id, is_active, created_at, updated_at, deleted_at", + roomRows) + if err != nil { + return nil, fmt.Errorf("insert rooms: %w", err) + } + p.Update(len(roomRows)) + p.Done() + + // ── 2. Room members ────────────────────────────────────────────────────── + p = NewProgress("room_members", len(rooms)*5) + memberRows := make([][]interface{}, 0, len(rooms)*5) + memberSeen := make(map[string]bool) + + for ri, room := range rooms { + // Always add the creator as owner + key := room.ID + ":" + room.CreatorID + if !memberSeen[key] { + memberSeen[key] = true + memberRows = append(memberRows, []interface{}{ + newUUID(), room.ID, room.CreatorID, "owner", false, false, nil, + time.Now(), time.Now(), time.Now(), nil, + }) + } + + // Add members + var memberCount int + if ri < groupCount { + memberCount = randInt(3, 20) // group rooms + } else { + memberCount = 1 // DM: just the other person + } + + for j := 0; j < memberCount; j++ { + member := allUsers[rng.Intn(len(allUsers))] + key = room.ID + ":" + member.ID + if memberSeen[key] { + continue + } + memberSeen[key] = true + memberRows = append(memberRows, []interface{}{ + newUUID(), room.ID, member.ID, "member", false, false, nil, + time.Now(), time.Now(), time.Now(), nil, + }) + } + } + + _, err = BulkInsert(db, "room_members", + "id, room_id, user_id, role, is_banned, is_muted, last_read_at, joined_at, created_at, updated_at, deleted_at", + memberRows) + if err != nil { + return nil, fmt.Errorf("insert room_members: %w", err) + } + p.Update(len(memberRows)) + p.Done() + + // ── 3. Messages ────────────────────────────────────────────────────────── + p = NewProgress("messages", cfg.Messages) + msgRows := make([][]interface{}, 0, cfg.Messages) + + // Distribute messages across rooms (more active rooms get more messages) + for i := 0; i < cfg.Messages; i++ { + room := rooms[PowerLaw(0, len(rooms)-1, 1.0)] + sender := allUsers[rng.Intn(len(allUsers))] + content := GenMessage() + + // Space messages over time + baseTime := DaysAgo(180) + msgTime := RandomTimeBetween(baseTime, time.Now()) + msgTime = RealisticHour(msgTime) + + msgRows = append(msgRows, []interface{}{ + newUUID(), room.ID, sender.ID, content, + "text", nil, nil, // message_type, attachment_file_id, reply_to_id + false, nil, false, false, nil, // is_edited, edited_at, is_deleted, is_pinned, metadata + sender.ID, nil, // user_id, parent_id + msgTime, nil, msgTime, + }) + } + + _, err = BulkInsert(db, "messages", + "id, room_id, sender_id, content, message_type, attachment_file_id, reply_to_id, is_edited, edited_at, is_deleted, is_pinned, metadata, user_id, parent_id, created_at, deleted_at, updated_at", + msgRows) + if err != nil { + return nil, fmt.Errorf("insert messages: %w", err) + } + p.Update(len(msgRows)) + p.Done() + + // Update room message_count and member_count + _, _ = db.Exec("UPDATE rooms SET message_count = (SELECT COUNT(*) FROM messages WHERE messages.room_id = rooms.id)") + _, _ = db.Exec("UPDATE rooms SET member_count = (SELECT COUNT(*) FROM room_members WHERE room_members.room_id = rooms.id)") + + return rooms, nil +} diff --git a/veza-backend-api/cmd/tools/seed/seed_content.go b/veza-backend-api/cmd/tools/seed/seed_content.go new file mode 100644 index 000000000..3655db775 --- /dev/null +++ b/veza-backend-api/cmd/tools/seed/seed_content.go @@ -0,0 +1,288 @@ +package main + +import ( + "database/sql" + "fmt" + "time" +) + +// SeedContent creates files, user_storage_quotas, courses, lessons, gear_items, groups. +func SeedContent(db *sql.DB, cfg Config, users []SeededUser, tracks []SeededTrack) error { + fmt.Println("\n═══ CONTENT ═══") + + artists := GetArtists(users) + + // ── 1. Files (simulated entries for tracks and avatars) ────────────────── + p := NewProgress("files", cfg.FileEntries) + fileRows := make([][]interface{}, 0, cfg.FileEntries) + + // Audio files for tracks + for i, t := range tracks { + if i >= cfg.FileEntries*2/3 { + break + } + fileSize := int64(t.Duration) * int64(randInt(16000, 32000)) + storagePath := fmt.Sprintf("audio/%s.mp3", t.ID) + url := fmt.Sprintf("https://cdn.veza.music/%s", storagePath) + + fileRows = append(fileRows, []interface{}{ + newUUID(), t.CreatorID, + fmt.Sprintf("%s.mp3", t.ID), fmt.Sprintf("%s.mp3", t.Title), + "audio/mpeg", fileSize, storagePath, "s3", + "veza-audio", url, nil, // thumbnail_url + fmt.Sprintf("%x", rng.Int63()), nil, // file_hash, metadata + true, time.Now(), nil, // is_processed, processed_at, processing_error + true, "clean", time.Now(), // virus_scanned, virus_scan_result, virus_scanned_at + false, // is_public + time.Now(), time.Now(), nil, + }) + } + + // Avatar files for users + avatarCount := cfg.FileEntries / 3 + for i := 0; i < avatarCount && i < len(users); i++ { + u := users[i] + fileSize := int64(randInt(50000, 500000)) // 50KB - 500KB + storagePath := fmt.Sprintf("avatars/%s.jpg", u.ID) + url := fmt.Sprintf("https://cdn.veza.music/%s", storagePath) + + fileRows = append(fileRows, []interface{}{ + newUUID(), u.ID, + fmt.Sprintf("%s.jpg", u.ID), "avatar.jpg", + "image/jpeg", fileSize, storagePath, "s3", + "veza-avatars", url, nil, + fmt.Sprintf("%x", rng.Int63()), nil, + true, time.Now(), nil, + true, "clean", time.Now(), + true, + u.CreatedAt, u.CreatedAt, nil, + }) + } + + _, err := BulkInsert(db, "files", + "id, user_id, filename, original_filename, mime_type, file_size, storage_path, storage_provider, bucket_name, url, thumbnail_url, file_hash, metadata, is_processed, processed_at, processing_error, virus_scanned, virus_scan_result, virus_scanned_at, is_public, created_at, updated_at, deleted_at", + fileRows) + if err != nil { + return fmt.Errorf("insert files: %w", err) + } + p.Update(len(fileRows)) + p.Done() + + // ── 2. User storage quotas ─────────────────────────────────────────────── + p = NewProgress("user_storage_quotas", len(artists)) + quotaRows := make([][]interface{}, 0, len(artists)) + for _, a := range artists { + usedBytes := int64(randInt(100, 5000)) * 1024 * 1024 // 100MB - 5GB + maxBytes := int64(10) * 1024 * 1024 * 1024 // 10GB + quotaRows = append(quotaRows, []interface{}{ + newUUID(), a.ID, usedBytes, maxBytes, time.Now(), time.Now(), + }) + } + _, _ = BulkInsert(db, "user_storage_quotas", + "id, user_id, used_bytes, max_bytes, created_at, updated_at", + quotaRows) + p.Update(len(quotaRows)) + p.Done() + + // ── 3. Courses & Lessons ───────────────────────────────────────────────── + p = NewProgress("courses", cfg.Courses) + courseRows := make([][]interface{}, 0, cfg.Courses) + type courseInfo struct { + id string + lessonCount int + } + courses := make([]courseInfo, 0, cfg.Courses) + + courseCategories := []string{"production", "mixing", "sound-design", "songwriting", "djing", "mastering"} + levels := []string{"beginner", "intermediate", "advanced"} + lessonTitles := []string{ + "Getting Started", "Setting Up Your DAW", "Understanding Audio Basics", + "Your First Beat", "Melody and Harmony", "Sound Design Fundamentals", + "Arrangement Techniques", "Mixing Basics", "EQ and Compression", + "Effects and Processing", "Mastering Your Track", "Final Project", + "Advanced Techniques", "Creative Workflows", "Industry Standards", + } + + for i := 0; i < cfg.Courses && i < len(artists); i++ { + id := newUUID() + artist := artists[i%len(artists)] + title := fmt.Sprintf("%s Masterclass — %s", GenreForArtist(i)[0].Name, pick([]string{"From Zero to Pro", "Complete Guide", "Deep Dive", "Essentials", "Workshop"})) + slug := fmt.Sprintf("course-%d", i) + category := pick(courseCategories) + level := pick(levels) + price := randInt(0, 9999) // 0 = free + lessonCount := randInt(5, 15) + createdAt := RandomTimeAfter(artist.CreatedAt) + + var publishedAt interface{} = createdAt + status := "published" + if randChance(10) { + status = "draft" + publishedAt = nil + } + + c := courseInfo{id: id, lessonCount: lessonCount} + courses = append(courses, c) + + courseRows = append(courseRows, []interface{}{ + id, artist.ID, title, slug, + fmt.Sprintf("Learn %s with %s. Comprehensive course covering everything from basics to advanced techniques.", category, artist.DisplayName), + category, fmt.Sprintf("{music,production,%s}", category), + price, "EUR", "fixed", status, level, "fr", + lessonCount, publishedAt, createdAt, createdAt, + }) + } + + _, err = BulkInsert(db, "courses", + "id, creator_id, title, slug, description, category, tags, price_cents, currency, pricing_model, status, level, language, lesson_count, published_at, created_at, updated_at", + courseRows) + if err != nil { + return fmt.Errorf("insert courses: %w", err) + } + p.Update(len(courseRows)) + p.Done() + + // Lessons + totalLessons := 0 + for _, c := range courses { + totalLessons += c.lessonCount + } + p = NewProgress("lessons", totalLessons) + lessonRows := make([][]interface{}, 0, totalLessons) + for _, c := range courses { + for li := 0; li < c.lessonCount; li++ { + title := lessonTitles[li%len(lessonTitles)] + lessonRows = append(lessonRows, []interface{}{ + newUUID(), c.id, li, title, + fmt.Sprintf("Lesson %d: %s", li+1, title), + randInt(300, 1800), // duration 5-30min + li < 2, // first 2 lessons free preview + "completed", + }) + } + } + _, _ = BulkInsert(db, "lessons", + "id, course_id, order_index, title, description, duration_seconds, is_preview_free, transcoding_status", + lessonRows) + p.Update(totalLessons) + p.Done() + + // Course enrollments + enrollCount := cfg.Courses * 5 + p = NewProgress("course_enrollments", enrollCount) + enrollRows := make([][]interface{}, 0, enrollCount) + enrollSeen := make(map[string]bool) + for i := 0; i < enrollCount*2 && len(enrollRows) < enrollCount; i++ { + c := courses[rng.Intn(len(courses))] + u := users[rng.Intn(len(users))] + key := c.id + ":" + u.ID + if enrollSeen[key] { + continue + } + enrollSeen[key] = true + enrollRows = append(enrollRows, []interface{}{ + newUUID(), u.ID, c.id, "active", time.Now(), + }) + } + _, _ = BulkInsert(db, "course_enrollments", + "id, user_id, course_id, status, purchased_at", + enrollRows) + p.Update(len(enrollRows)) + p.Done() + + // ── 4. Gear items ──────────────────────────────────────────────────────── + p = NewProgress("gear_items", cfg.GearItems) + gearRows := make([][]interface{}, 0, cfg.GearItems) + conditions := []string{"Excellent", "Good", "Fair"} + + for i := 0; i < cfg.GearItems; i++ { + artist := artists[rng.Intn(len(artists))] + gear := pick(gearTemplates) + purchaseDate := RandomTimeAfter(artist.CreatedAt).Format("2006-01-02") + gearRows = append(gearRows, []interface{}{ + newUUID(), artist.ID, gear.Name, gear.Category, gear.Brand, gear.Model, + "Active", pick(conditions), gear.Price, "EUR", purchaseDate, + true, time.Now(), time.Now(), + }) + } + _, _ = BulkInsert(db, "gear_items", + "id, user_id, name, category, brand, model, status, condition, purchase_price, currency, purchase_date, is_public, created_at, updated_at", + gearRows) + p.Update(cfg.GearItems) + p.Done() + + // ── 5. Groups ──────────────────────────────────────────────────────────── + p = NewProgress("groups", cfg.Groups) + groupRows := make([][]interface{}, 0, cfg.Groups) + type groupInfo struct { + id string + creatorID string + } + groups := make([]groupInfo, 0, cfg.Groups) + + groupNames := []string{ + "Electronic Producers", "Hip-Hop Collective", "Ambient Sound Lab", + "Jazz Fusion Circle", "Indie Artists Network", "Vinyl Enthusiasts", + "Sound Design Guild", "Remix Community", "Songwriters Hub", + "Studio Gear Talk", "Music Theory Nerds", "Live Performance Group", + "Lo-Fi Producers", "Techno Underground", "Acoustic Sessions", + } + + for i := 0; i < cfg.Groups; i++ { + id := newUUID() + creator := users[rng.Intn(len(users))] + name := groupNames[i%len(groupNames)] + if i >= len(groupNames) { + name = fmt.Sprintf("%s #%d", pick(groupNames), i) + } + createdAt := RandomTimeAfter(creator.CreatedAt) + g := groupInfo{id: id, creatorID: creator.ID} + groups = append(groups, g) + + groupRows = append(groupRows, []interface{}{ + id, name, fmt.Sprintf("A community for %s enthusiasts", name), + creator.ID, nil, true, 1, createdAt, createdAt, nil, + }) + } + _, _ = BulkInsert(db, "groups", + "id, name, description, creator_id, avatar_url, is_public, member_count, created_at, updated_at, deleted_at", + groupRows) + p.Update(cfg.Groups) + p.Done() + + // Group members + memberCount := cfg.Groups * 15 + p = NewProgress("group_members", memberCount) + gmRows := make([][]interface{}, 0, memberCount) + gmSeen := make(map[string]bool) + for _, g := range groups { + // Add creator + key := g.id + ":" + g.creatorID + gmSeen[key] = true + gmRows = append(gmRows, []interface{}{ + newUUID(), g.id, g.creatorID, "admin", time.Now(), time.Now(), + }) + // Add random members + count := randInt(5, 30) + for j := 0; j < count; j++ { + u := users[rng.Intn(len(users))] + key = g.id + ":" + u.ID + if gmSeen[key] { + continue + } + gmSeen[key] = true + gmRows = append(gmRows, []interface{}{ + newUUID(), g.id, u.ID, "member", time.Now(), time.Now(), + }) + } + } + _, _ = BulkInsert(db, "group_members", + "id, group_id, user_id, role, joined_at, created_at", + gmRows) + // Update member counts + _, _ = db.Exec("UPDATE groups SET member_count = (SELECT COUNT(*) FROM group_members WHERE group_members.group_id = groups.id)") + p.Update(len(gmRows)) + p.Done() + + return nil +} diff --git a/veza-backend-api/cmd/tools/seed/seed_live.go b/veza-backend-api/cmd/tools/seed/seed_live.go new file mode 100644 index 000000000..5d68770ec --- /dev/null +++ b/veza-backend-api/cmd/tools/seed/seed_live.go @@ -0,0 +1,91 @@ +package main + +import ( + "database/sql" + "fmt" + "time" +) + +// SeedLive creates live_streams and co_listening_sessions. +func SeedLive(db *sql.DB, cfg Config, users []SeededUser, tracks []SeededTrack) error { + fmt.Println("\n═══ LIVE STREAMS ═══") + + artists := GetArtists(users) + if len(artists) == 0 { + return nil + } + + // ── 1. Past live streams ───────────────────────────────────────────────── + p := NewProgress("live_streams (past)", cfg.PastLiveStreams) + liveRows := make([][]interface{}, 0, cfg.PastLiveStreams+cfg.LiveStreams) + + for i := 0; i < cfg.PastLiveStreams; i++ { + artist := artists[rng.Intn(len(artists))] + title := pick(liveStreamTitles) + desc := fmt.Sprintf("Live session by %s", artist.DisplayName) + category := pick([]string{"dj-set", "production", "performance", "tutorial", "q&a"}) + + startTime := RandomTimeAfter(artist.CreatedAt) + viewerCount := PowerLaw(1, 500, 1.5) + + liveRows = append(liveRows, []interface{}{ + newUUID(), artist.ID, title, desc, category, + artist.DisplayName, false, viewerCount, + "[]", // tags (jsonb) + startTime, startTime, startTime, + }) + } + p.Update(cfg.PastLiveStreams) + p.Done() + + // ── 2. Current live streams ────────────────────────────────────────────── + p = NewProgress("live_streams (active)", cfg.LiveStreams) + for i := 0; i < cfg.LiveStreams && i < len(artists); i++ { + artist := artists[i] + title := pick(liveStreamTitles) + desc := fmt.Sprintf("LIVE NOW: %s", artist.DisplayName) + category := pick([]string{"dj-set", "production", "performance"}) + startTime := time.Now().Add(-time.Duration(randInt(5, 90)) * time.Minute) + viewerCount := randInt(5, 150) + + liveRows = append(liveRows, []interface{}{ + newUUID(), artist.ID, title, desc, category, + artist.DisplayName, true, viewerCount, + "[]", + startTime, startTime, startTime, + }) + } + p.Update(cfg.LiveStreams) + p.Done() + + _, err := BulkInsert(db, "live_streams", + "id, user_id, title, description, category, streamer_name, is_live, viewer_count, tags, scheduled_at, created_at, updated_at", + liveRows) + if err != nil { + return fmt.Errorf("insert live_streams: %w", err) + } + + // ── 3. Co-listening sessions ───────────────────────────────────────────── + coCount := cfg.PastLiveStreams / 10 + if coCount < 5 { + coCount = 5 + } + p = NewProgress("co_listening_sessions", coCount) + coRows := make([][]interface{}, 0, coCount) + for i := 0; i < coCount && len(tracks) > 0; i++ { + host := users[rng.Intn(len(users))] + track := tracks[rng.Intn(len(tracks))] + createdAt := RandomTimeAfter(host.CreatedAt) + expiresAt := createdAt.Add(4 * time.Hour) + coRows = append(coRows, []interface{}{ + newUUID(), host.ID, track.ID, createdAt, expiresAt, + }) + } + _, _ = BulkInsert(db, "co_listening_sessions", + "id, host_id, track_id, created_at, expires_at", + coRows) + p.Update(coCount) + p.Done() + + return nil +} diff --git a/veza-backend-api/cmd/tools/seed/seed_marketplace.go b/veza-backend-api/cmd/tools/seed/seed_marketplace.go new file mode 100644 index 000000000..41a2b2fcc --- /dev/null +++ b/veza-backend-api/cmd/tools/seed/seed_marketplace.go @@ -0,0 +1,225 @@ +package main + +import ( + "database/sql" + "fmt" + "time" +) + +// SeededProduct holds product data. +type SeededProduct struct { + ID string + SellerID string + Title string + Price float64 +} + +// SeedMarketplace creates products, orders, order_items, product_reviews, +// seller_stripe_accounts, and seller_balances. +func SeedMarketplace(db *sql.DB, cfg Config, users []SeededUser, tracks []SeededTrack) ([]SeededProduct, error) { + fmt.Println("\n═══ MARKETPLACE ═══") + + artists := GetArtists(users) + listeners := GetListeners(users) + if len(artists) == 0 { + return nil, nil + } + + products := make([]SeededProduct, 0, cfg.Products) + + // ── 1. Products ────────────────────────────────────────────────────────── + p := NewProgress("products", cfg.Products) + productRows := make([][]interface{}, 0, cfg.Products) + + for i := 0; i < cfg.Products; i++ { + id := newUUID() + seller := artists[rng.Intn(len(artists))] + genres := GenreForArtist(rng.Intn(len(artists))) + genre := genres[0] + title := GenProductTitle(genre.Name) + desc := fmt.Sprintf("Professional %s content by %s", genre.Slug, seller.DisplayName) + price := float64(randInt(999, 29999)) / 100.0 // €9.99 - €299.99 + ptype := pick(productTypes) + license := pick([]string{"non-exclusive", "exclusive", "non-exclusive"}) + category := pick(productCategories) + bpm := randInt(genre.BPMRange[0], genre.BPMRange[1]) + key := "" + if len(genre.Keys) > 0 { + key = pick(genre.Keys) + } + + // Optionally link to a track + var trackID interface{} + if ptype == "beat" && len(tracks) > 0 && randChance(50) { + // Find a track by this seller + for _, t := range tracks { + if t.CreatorID == seller.ID { + trackID = t.ID + break + } + } + } + + createdAt := RandomTimeAfter(seller.CreatedAt) + prod := SeededProduct{ID: id, SellerID: seller.ID, Title: title, Price: price} + products = append(products, prod) + + productRows = append(productRows, []interface{}{ + id, seller.ID, title, desc, price, "EUR", "active", + ptype, trackID, license, bpm, key, category, + createdAt, createdAt, + }) + } + + _, err := BulkInsert(db, "products", + "id, seller_id, title, description, price, currency, status, product_type, track_id, license_type, bpm, musical_key, category, created_at, updated_at", + productRows) + if err != nil { + return nil, fmt.Errorf("insert products: %w", err) + } + p.Update(len(productRows)) + p.Done() + + // ── 2. Orders ──────────────────────────────────────────────────────────── + p = NewProgress("orders + order_items", cfg.Orders) + orderRows := make([][]interface{}, 0, cfg.Orders) + itemRows := make([][]interface{}, 0, cfg.Orders*2) + + allBuyers := append(listeners, users...) // Mix of listeners and all users + statuses := []string{"completed", "completed", "completed", "completed", "pending", "cancelled"} + + for i := 0; i < cfg.Orders; i++ { + orderID := newUUID() + buyer := allBuyers[rng.Intn(len(allBuyers))] + status := pick(statuses) + createdAt := RandomTimeAfter(buyer.CreatedAt) + + // 1-3 items per order + itemCount := randInt(1, 3) + totalAmount := 0.0 + selectedProducts := pickN(products, itemCount) + + for _, prod := range selectedProducts { + totalAmount += prod.Price + itemRows = append(itemRows, []interface{}{ + newUUID(), orderID, prod.ID, prod.Price, + }) + } + + orderRows = append(orderRows, []interface{}{ + orderID, buyer.ID, totalAmount, "EUR", status, + createdAt, createdAt, + }) + } + + _, err = BulkInsert(db, "orders", + "id, buyer_id, total_amount, currency, status, created_at, updated_at", + orderRows) + if err != nil { + return nil, fmt.Errorf("insert orders: %w", err) + } + + _, err = BulkInsert(db, "order_items", + "id, order_id, product_id, price", + itemRows) + if err != nil { + return nil, fmt.Errorf("insert order_items: %w", err) + } + p.Update(cfg.Orders) + p.Done() + + // ── 3. Product reviews ─────────────────────────────────────────────────── + p = NewProgress("product_reviews", cfg.ProductReviews) + reviewRows := make([][]interface{}, 0, cfg.ProductReviews) + reviewSeen := make(map[string]bool) + + reviewContents := []string{ + "Excellent quality, exactly what I needed!", "Great sounds, well organized.", + "Good value for the price.", "Professional quality samples.", + "Perfect for my latest project.", "Would buy again!", + "Decent pack, some gems in there.", "Not what I expected but still useful.", + "Top-notch production quality.", "These beats are fire!", + "Clean mix, ready to use.", "Amazing variety in this pack.", + } + + for i := 0; i < cfg.ProductReviews*2 && len(reviewRows) < cfg.ProductReviews; i++ { + prod := products[rng.Intn(len(products))] + reviewer := allBuyers[rng.Intn(len(allBuyers))] + if reviewer.ID == prod.SellerID { + continue + } + key := prod.ID + ":" + reviewer.ID + if reviewSeen[key] { + continue + } + reviewSeen[key] = true + reviewRows = append(reviewRows, []interface{}{ + newUUID(), prod.ID, reviewer.ID, + randInt(3, 5), // rating 3-5 (realistic positive bias) + pick(reviewContents), + time.Now(), time.Now(), + }) + } + + _, _ = BulkInsert(db, "product_reviews", + "id, product_id, user_id, rating, content, created_at, updated_at", + reviewRows) + p.Update(len(reviewRows)) + p.Done() + + // ── 4. Seller stripe accounts ──────────────────────────────────────────── + p = NewProgress("seller_stripe_accounts", len(artists)) + sellerRows := make([][]interface{}, 0, len(artists)) + + for _, artist := range artists { + if !randChance(60) { + continue + } + sellerRows = append(sellerRows, []interface{}{ + newUUID(), artist.ID, + fmt.Sprintf("acct_%s", newUUID()[:16]), + true, // is_onboarded + true, // payouts_enabled + true, // charges_enabled + "verified", // kyc_status + nil, nil, // kyc_verification_session_id, kyc_verified_at + nil, // kyc_last_error + time.Now(), time.Now(), + }) + } + + _, _ = BulkInsert(db, "seller_stripe_accounts", + "id, user_id, stripe_account_id, is_onboarded, payouts_enabled, charges_enabled, kyc_status, kyc_verification_session_id, kyc_verified_at, kyc_last_error, created_at, updated_at", + sellerRows) + p.Update(len(sellerRows)) + p.Done() + + // ── 5. Seller balances ─────────────────────────────────────────────────── + p = NewProgress("seller_balances", len(artists)) + balanceRows := make([][]interface{}, 0, len(artists)) + for _, artist := range artists { + if !randChance(50) { + continue + } + totalEarned := int64(randInt(0, 100000)) + totalPaid := totalEarned * int64(randInt(30, 80)) / 100 + available := totalEarned - totalPaid - int64(randInt(0, 10000)) + if available < 0 { + available = 0 + } + pending := int64(randInt(0, 10000)) + + balanceRows = append(balanceRows, []interface{}{ + newUUID(), artist.ID, + available, pending, totalEarned, totalPaid, + "EUR", time.Now(), + }) + } + _, _ = BulkInsert(db, "seller_balances", + "id, seller_id, available_cents, pending_cents, total_earned_cents, total_paid_out_cents, currency, updated_at", + balanceRows) + p.Update(len(balanceRows)) + p.Done() + + return products, nil +} diff --git a/veza-backend-api/cmd/tools/seed/seed_misc.go b/veza-backend-api/cmd/tools/seed/seed_misc.go new file mode 100644 index 000000000..6a1ad159e --- /dev/null +++ b/veza-backend-api/cmd/tools/seed/seed_misc.go @@ -0,0 +1,195 @@ +package main + +import ( + "database/sql" + "fmt" + "time" +) + +// SeedMisc creates support_tickets, api_keys, announcements, data_exports, +// login_history, audit_logs, and user_preferences. +func SeedMisc(db *sql.DB, cfg Config, users []SeededUser) error { + fmt.Println("\n═══ MISC ═══") + + artists := GetArtists(users) + admins := GetAdmins(users) + + // ── 1. Support tickets ─────────────────────────────────────────────────── + p := NewProgress("support_tickets", cfg.SupportTickets) + ticketRows := make([][]interface{}, 0, cfg.SupportTickets) + ticketCategories := []string{"technical", "billing", "general", "feature", "account"} + ticketStatuses := []string{"open", "open", "in_progress", "resolved", "closed"} + ticketSubjects := []string{ + "Cannot upload audio file", "Payment not received", "Account access issue", + "Feature request: dark mode", "Playlist sync problem", "Mobile app crash", + "Stream quality issues", "Profile picture upload failed", "How to sell beats?", + "Collaboration feature not working", "Missing analytics data", "Copyright claim dispute", + "Email notifications not arriving", "Two-factor auth setup", "Delete my account", + } + + for i := 0; i < cfg.SupportTickets; i++ { + user := users[rng.Intn(len(users))] + subject := pick(ticketSubjects) + ticketRows = append(ticketRows, []interface{}{ + newUUID(), user.ID, user.Email, + subject, fmt.Sprintf("Details about: %s. Please help!", subject), + pick(ticketCategories), pick(ticketStatuses), + RandomTimeAfter(user.CreatedAt), + }) + } + _, _ = BulkInsert(db, "support_tickets", + "id, user_id, email, subject, message, category, status, created_at", + ticketRows) + p.Update(cfg.SupportTickets) + p.Done() + + // ── 2. API keys ────────────────────────────────────────────────────────── + p = NewProgress("api_keys", cfg.APIKeys) + apiRows := make([][]interface{}, 0, cfg.APIKeys) + apiNames := []string{ + "Production Bot", "Beat Distributor", "Analytics Dashboard", + "Auto-Upload Script", "Playlist Sync", "Stream Monitor", + } + + for i := 0; i < cfg.APIKeys && i < len(artists); i++ { + artist := artists[i%len(artists)] + prefix := fmt.Sprintf("veza_%s", newUUID()[:8]) + hashedKey := fmt.Sprintf("$2a$10$%s", newUUID()) // Placeholder hash + name := apiNames[i%len(apiNames)] + scopes := pick([]string{"{read,write,tracks}", "{read,tracks,marketplace}", "{read}", "{read,write}"}) + + apiRows = append(apiRows, []interface{}{ + newUUID(), artist.ID, name, prefix, hashedKey, scopes, time.Now(), + }) + } + _, _ = BulkInsert(db, "api_keys", + "id, user_id, name, prefix, hashed_key, scopes, created_at", + apiRows) + p.Update(len(apiRows)) + p.Done() + + // ── 3. Announcements ───────────────────────────────────────────────────── + p = NewProgress("announcements", cfg.Announcements) + annRows := make([][]interface{}, 0, cfg.Announcements) + annData := []struct{ title, content, atype string }{ + {"Welcome to Veza!", "We're thrilled to launch Veza — an ethical music platform built for artists and listeners.", "info"}, + {"Marketplace Now Open", "Buy and sell beats, samples, and presets directly on the platform.", "feature"}, + {"New: Live Streaming", "Stream your sessions live to your followers. Available now for all creators.", "feature"}, + {"Scheduled Maintenance", "Brief maintenance window planned for this weekend. Streams may be briefly interrupted.", "warning"}, + {"Community Guidelines Updated", "We've updated our community guidelines. Please review them.", "info"}, + {"Mobile App Beta", "The mobile app is now in beta. Sign up to be a tester!", "feature"}, + {"Holiday Sale", "Special discounts on marketplace products this week.", "info"}, + {"New Audio Quality Options", "Hi-Res audio streaming is now available for premium users.", "feature"}, + {"Creator Fund Launched", "Earn more from your music with our new creator support fund.", "info"}, + {"Platform Update v2.0", "Major platform update with improved UI, faster streaming, and new features.", "feature"}, + } + + adminID := "" + if len(admins) > 0 { + adminID = admins[0].ID + } else { + adminID = users[0].ID + } + + for i := 0; i < cfg.Announcements && i < len(annData); i++ { + a := annData[i] + annRows = append(annRows, []interface{}{ + newUUID(), a.title, a.content, a.atype, + true, time.Now(), adminID, DaysAgo(cfg.Announcements - i), + }) + } + _, _ = BulkInsert(db, "announcements", + "id, title, content, type, is_active, starts_at, created_by, created_at", + annRows) + p.Update(len(annRows)) + p.Done() + + // ── 4. Data exports (RGPD) ─────────────────────────────────────────────── + p = NewProgress("data_exports", cfg.DataExports) + exportRows := make([][]interface{}, 0, cfg.DataExports) + exportStatuses := []string{"completed", "completed", "pending", "processing"} + + for i := 0; i < cfg.DataExports; i++ { + user := users[rng.Intn(len(users))] + status := pick(exportStatuses) + createdAt := RandomTimeAfter(user.CreatedAt) + expiresAt := createdAt.Add(7 * 24 * time.Hour) // 7 day expiry + + var completedAt interface{} + var s3Key interface{} + var fileSize interface{} + if status == "completed" { + completedAt = RandomTimeAfter(createdAt) + s3Key = fmt.Sprintf("exports/%s/%s.zip", user.ID, newUUID()[:8]) + fs := int64(randInt(1000000, 50000000)) // 1MB - 50MB + fileSize = fs + } + + exportRows = append(exportRows, []interface{}{ + newUUID(), user.ID, status, s3Key, fileSize, + expiresAt, createdAt, completedAt, nil, + }) + } + _, _ = BulkInsert(db, "data_exports", + "id, user_id, status, s3_key, file_size_bytes, expires_at, created_at, completed_at, error_message", + exportRows) + p.Update(cfg.DataExports) + p.Done() + + // ── 5. Login history ───────────────────────────────────────────────────── + loginCount := len(users) * 3 // ~3 login entries per user on average + p = NewProgress("login_history", loginCount) + loginRows := make([][]interface{}, 0, loginCount) + for i := 0; i < loginCount; i++ { + user := users[rng.Intn(len(users))] + loginAt := RandomTimeAfter(user.CreatedAt) + loginAt = RealisticHour(loginAt) + success := randChance(95) // 95% success rate + reason := "" + if !success { + reason = pick([]string{"invalid_password", "account_locked", "expired_session"}) + } + + loginRows = append(loginRows, []interface{}{ + newUUID(), user.ID, GenIP(), GenUserAgent(), + success, reason, loginAt, + }) + } + _, _ = BulkInsert(db, "login_history", + "id, user_id, ip_address, user_agent, success, reason, created_at", + loginRows) + p.Update(loginCount) + p.Done() + + // ── 6. User preferences ────────────────────────────────────────────────── + prefCount := len(users) / 3 // ~33% have explicit preferences + p = NewProgress("user_preferences", prefCount) + prefRows := make([][]interface{}, 0, prefCount) + themes := []string{"light", "dark", "auto"} + langs := []string{"fr", "en", "de", "es"} + contrasts := []string{"normal", "high"} + densities := []string{"comfortable", "compact", "spacious"} + + prefSeen := make(map[string]bool) + for i := 0; i < prefCount; i++ { + user := users[rng.Intn(len(users))] + if prefSeen[user.ID] { + continue + } + prefSeen[user.ID] = true + prefRows = append(prefRows, []interface{}{ + user.ID, pick(themes), pick(langs), "UTC", + "{}", "{}", `{"quality":"high","autoplay":true}`, + pick(contrasts), pick(densities), + randInt(180, 280), randInt(14, 20), + time.Now(), + }) + } + _, _ = BulkInsert(db, "user_preferences", + "user_id, theme, language, timezone, notifications, privacy, audio, contrast, density, accent_hue, font_size, updated_at", + prefRows) + p.Update(len(prefRows)) + p.Done() + + return nil +} diff --git a/veza-backend-api/cmd/tools/seed/seed_moderation.go b/veza-backend-api/cmd/tools/seed/seed_moderation.go new file mode 100644 index 000000000..51d267661 --- /dev/null +++ b/veza-backend-api/cmd/tools/seed/seed_moderation.go @@ -0,0 +1,158 @@ +package main + +import ( + "database/sql" + "fmt" + "time" +) + +// SeedModeration creates reports, moderation_actions, user_strikes, user_suspensions. +func SeedModeration(db *sql.DB, cfg Config, users []SeededUser, tracks []SeededTrack) error { + fmt.Println("\n═══ MODERATION ═══") + + mods := GetModerators(users) + admins := GetAdmins(users) + moderators := append(mods, admins...) + if len(moderators) == 0 { + return nil + } + + // ── 1. Reports ─────────────────────────────────────────────────────────── + p := NewProgress("reports", cfg.Reports) + reportRows := make([][]interface{}, 0, cfg.Reports) + + reportReasons := []string{ + "spam", "harassment", "copyright", "inappropriate_content", + "misleading", "hate_speech", "violence", "impersonation", + } + reportStatuses := []string{"pending", "pending", "reviewed", "resolved", "dismissed"} + + type reportInfo struct { + id string + } + reports := make([]reportInfo, 0, cfg.Reports) + + for i := 0; i < cfg.Reports; i++ { + id := newUUID() + reporter := users[rng.Intn(len(users))] + reason := pick(reportReasons) + status := pick(reportStatuses) + createdAt := RandomTimeAfter(reporter.CreatedAt) + + // Report target: user or track + var reportedUserID interface{} + var contentType string + var contentID interface{} + if randChance(60) && len(tracks) > 0 { + t := tracks[rng.Intn(len(tracks))] + contentType = "track" + contentID = t.ID + } else { + u := users[rng.Intn(len(users))] + reportedUserID = u.ID + contentType = "user" + } + + reports = append(reports, reportInfo{id: id}) + reportRows = append(reportRows, []interface{}{ + id, reporter.ID, reportedUserID, contentType, contentID, + fmt.Sprintf("Reported for %s", reason), + status, nil, nil, // resolved_by, resolved_at + createdAt, + pick(reportReasons), "normal", "", "", nil, // category, priority, resolution_note, resolution_action, assigned_to + createdAt, + }) + } + + _, err := BulkInsert(db, "reports", + "id, reporter_id, reported_user_id, content_type, content_id, reason, status, resolved_by, resolved_at, created_at, category, priority, resolution_note, resolution_action, assigned_to, updated_at", + reportRows) + if err != nil { + return fmt.Errorf("insert reports: %w", err) + } + p.Update(cfg.Reports) + p.Done() + + // ── 2. Moderation actions ──────────────────────────────────────────────── + actionCount := cfg.Reports / 2 // ~50% of reports get an action + p = NewProgress("moderation_actions", actionCount) + actionRows := make([][]interface{}, 0, actionCount) + actionTypes := []string{"warn", "mute", "suspend", "ban", "content_removal", "dismiss"} + + for i := 0; i < actionCount && i < len(reports); i++ { + mod := moderators[rng.Intn(len(moderators))] + action := pick(actionTypes) + targetUser := users[rng.Intn(len(users))] + + actionRows = append(actionRows, []interface{}{ + newUUID(), mod.ID, targetUser.ID, + nil, nil, // target_content_type, target_content_id + action, fmt.Sprintf("Action: %s — reviewed by moderator", action), + "{}", time.Now(), + }) + } + + _, _ = BulkInsert(db, "moderation_actions", + "id, moderator_id, target_user_id, target_content_type, target_content_id, action, reason, metadata, created_at", + actionRows) + p.Update(len(actionRows)) + p.Done() + + // ── 3. User strikes ────────────────────────────────────────────────────── + strikeCount := cfg.Reports / 5 + p = NewProgress("user_strikes", strikeCount) + strikeRows := make([][]interface{}, 0, strikeCount) + strikeReasons := []string{"spam", "harassment", "copyright_violation", "inappropriate_content"} + + for i := 0; i < strikeCount; i++ { + targetUser := users[rng.Intn(len(users))] + mod := moderators[rng.Intn(len(moderators))] + reason := pick(strikeReasons) + severity := pick([]string{"warning", "minor", "major", "critical"}) + expiresAt := time.Now().AddDate(0, 3, 0) // 3 months + + strikeRows = append(strikeRows, []interface{}{ + newUUID(), targetUser.ID, nil, // report_id + reason, severity, mod.ID, + true, false, nil, false, nil, nil, nil, // is_active, appealed, appeal_text, appeal_resolved, appeal_result, appeal_resolved_by, appeal_resolved_at + expiresAt, time.Now(), time.Now(), + }) + } + + _, _ = BulkInsert(db, "user_strikes", + "id, user_id, report_id, reason, severity, issued_by, is_active, appealed, appeal_text, appeal_resolved, appeal_result, appeal_resolved_by, appeal_resolved_at, expires_at, created_at, updated_at", + strikeRows) + p.Update(len(strikeRows)) + p.Done() + + // ── 4. User suspensions (very few) ─────────────────────────────────────── + suspCount := strikeCount / 3 + if suspCount < 2 { + suspCount = 2 + } + p = NewProgress("user_suspensions", suspCount) + suspRows := make([][]interface{}, 0, suspCount) + + for i := 0; i < suspCount; i++ { + targetUser := users[randInt(len(users)/2, len(users)-1)] // Pick from second half (less important) + mod := moderators[rng.Intn(len(moderators))] + reason := pick(strikeReasons) + suspendedUntil := time.Now().Add(time.Duration(randInt(1, 30)) * 24 * time.Hour) + + suspRows = append(suspRows, []interface{}{ + newUUID(), targetUser.ID, + fmt.Sprintf("Suspended for %s", reason), + mod.ID, suspendedUntil, + true, nil, nil, // is_active, lifted_by, lifted_at + time.Now(), + }) + } + + _, _ = BulkInsert(db, "user_suspensions", + "id, user_id, reason, suspended_by, suspended_until, is_active, lifted_by, lifted_at, created_at", + suspRows) + p.Update(len(suspRows)) + p.Done() + + return nil +} diff --git a/veza-backend-api/cmd/tools/seed/seed_notifications.go b/veza-backend-api/cmd/tools/seed/seed_notifications.go new file mode 100644 index 000000000..3b3580159 --- /dev/null +++ b/veza-backend-api/cmd/tools/seed/seed_notifications.go @@ -0,0 +1,94 @@ +package main + +import ( + "database/sql" + "fmt" + "time" +) + +// SeedNotifications creates notifications and notification_preferences. +func SeedNotifications(db *sql.DB, cfg Config, users []SeededUser) error { + fmt.Println("\n═══ NOTIFICATIONS ═══") + + // ── 1. Notifications ───────────────────────────────────────────────────── + p := NewProgress("notifications", cfg.Notifications) + notifRows := make([][]interface{}, 0, cfg.Notifications) + + notifTypes := []string{ + "follow", "like", "comment", "message", "system", + "milestone", "track_upload", "mention", "playlist_follow", + } + + notifTemplates := map[string][2]string{ + "follow": {"New follower", "Someone started following you"}, + "like": {"Track liked", "Someone liked your track"}, + "comment": {"New comment", "New comment on your track"}, + "message": {"New message", "You have a new message"}, + "system": {"System", "Welcome to Veza!"}, + "milestone": {"Milestone", "Your track reached 100 plays!"}, + "track_upload": {"New release", "An artist you follow uploaded a new track"}, + "mention": {"Mentioned", "You were mentioned in a comment"}, + "playlist_follow": {"Playlist followed", "Someone followed your playlist"}, + } + + for i := 0; i < cfg.Notifications; i++ { + user := users[rng.Intn(len(users))] + ntype := pick(notifTypes) + tmpl := notifTemplates[ntype] + createdAt := RandomTimeAfter(user.CreatedAt) + createdAt = RealisticHour(createdAt) + + // 70% read, 30% unread + isRead := randChance(70) + var readAt interface{} + if isRead { + readAt = RandomTimeAfter(createdAt) + } + + notifRows = append(notifRows, []interface{}{ + newUUID(), user.ID, ntype, tmpl[0], tmpl[1], + nil, isRead, createdAt, createdAt, readAt, + }) + } + + _, err := BulkInsert(db, "notifications", + "id, user_id, type, title, content, link, read, created_at, updated_at, read_at", + notifRows) + if err != nil { + return fmt.Errorf("insert notifications: %w", err) + } + p.Update(cfg.Notifications) + p.Done() + + // ── 2. Notification preferences ────────────────────────────────────────── + // Give ~30% of users custom notification preferences + prefCount := len(users) * 30 / 100 + p = NewProgress("notification_preferences", prefCount) + prefRows := make([][]interface{}, 0, prefCount) + npSeen := make(map[string]bool) + + for i := 0; i < prefCount && i < len(users); i++ { + user := users[rng.Intn(len(users))] + if npSeen[user.ID] { + continue + } + npSeen[user.ID] = true + prefRows = append(prefRows, []interface{}{ + user.ID, + randChance(80), // push_follow + randChance(80), // push_like + randChance(80), // push_comment + randChance(90), // push_message + randChance(70), // push_mention + time.Now(), time.Now(), + }) + } + + _, _ = BulkInsert(db, "notification_preferences", + "user_id, push_follow, push_like, push_comment, push_message, push_mention, created_at, updated_at", + prefRows) + p.Update(len(prefRows)) + p.Done() + + return nil +} diff --git a/veza-backend-api/cmd/tools/seed/seed_playlists.go b/veza-backend-api/cmd/tools/seed/seed_playlists.go new file mode 100644 index 000000000..c9bf4e2eb --- /dev/null +++ b/veza-backend-api/cmd/tools/seed/seed_playlists.go @@ -0,0 +1,133 @@ +package main + +import ( + "database/sql" + "fmt" + "time" +) + +// SeededPlaylist holds playlist data. +type SeededPlaylist struct { + ID string + UserID string + Name string +} + +// SeedPlaylists creates playlists and populates playlist_tracks, playlist_follows. +func SeedPlaylists(db *sql.DB, cfg Config, users []SeededUser, tracks []SeededTrack) ([]SeededPlaylist, error) { + fmt.Println("\n═══ PLAYLISTS ═══") + + allUsers := users + playlists := make([]SeededPlaylist, 0, cfg.Playlists) + + // ── 1. Create playlists ────────────────────────────────────────────────── + p := NewProgress("playlists", cfg.Playlists) + playlistRows := make([][]interface{}, 0, cfg.Playlists) + + for i := 0; i < cfg.Playlists; i++ { + id := newUUID() + user := allUsers[rng.Intn(len(allUsers))] + name := GenPlaylistName(i) + desc := fmt.Sprintf("Curated by %s", user.DisplayName) + createdAt := RandomTimeAfter(user.CreatedAt) + + visibility := "public" + isPublic := true + if randChance(15) { + visibility = "private" + isPublic = false + } + isCollab := randChance(10) + + pl := SeededPlaylist{ID: id, UserID: user.ID, Name: name} + playlists = append(playlists, pl) + + playlistRows = append(playlistRows, []interface{}{ + id, user.ID, name, desc, nil, // cover_url + visibility, isCollab, 0, 0, 0, // track_count, duration_seconds, follower_count + name, isPublic, + createdAt, createdAt, nil, + }) + } + + _, err := BulkInsert(db, "playlists", + "id, user_id, name, description, cover_url, visibility, is_collaborative, track_count, duration_seconds, follower_count, title, is_public, created_at, updated_at, deleted_at", + playlistRows) + if err != nil { + return nil, fmt.Errorf("insert playlists: %w", err) + } + p.Update(cfg.Playlists) + p.Done() + + // ── 2. Populate playlist_tracks ────────────────────────────────────────── + if len(tracks) == 0 { + return playlists, nil + } + + p = NewProgress("playlist_tracks", cfg.Playlists) + ptRows := make([][]interface{}, 0, cfg.Playlists*15) + seen := make(map[string]bool) // prevent duplicate (playlist_id, track_id) + + for _, pl := range playlists { + trackCount := randInt(cfg.PlaylistMinTracks, cfg.PlaylistMaxTracks) + if trackCount > len(tracks) { + trackCount = len(tracks) + } + selectedTracks := pickN(tracks, trackCount) + for pos, t := range selectedTracks { + key := pl.ID + ":" + t.ID + if seen[key] { + continue + } + seen[key] = true + ptRows = append(ptRows, []interface{}{ + newUUID(), pl.ID, t.ID, pos, pl.UserID, time.Now(), + }) + } + } + + _, err = BulkInsert(db, "playlist_tracks", + "id, playlist_id, track_id, position, added_by, added_at", + ptRows) + if err != nil { + return nil, fmt.Errorf("insert playlist_tracks: %w", err) + } + p.Update(len(ptRows)) + p.Done() + + // ── 3. Update track_count on playlists ─────────────────────────────────── + _, _ = db.Exec("UPDATE playlists SET track_count = (SELECT COUNT(*) FROM playlist_tracks WHERE playlist_tracks.playlist_id = playlists.id)") + + // ── 4. Playlist follows ────────────────────────────────────────────────── + followCount := len(playlists) * 3 // ~3 follows per playlist on average + p = NewProgress("playlist_follows", followCount) + pfRows := make([][]interface{}, 0, followCount) + pfSeen := make(map[string]bool) + + for i := 0; i < followCount; i++ { + pl := playlists[rng.Intn(len(playlists))] + user := allUsers[rng.Intn(len(allUsers))] + if user.ID == pl.UserID { + continue // Don't follow own playlist + } + key := pl.ID + ":" + user.ID + if pfSeen[key] { + continue + } + pfSeen[key] = true + pfRows = append(pfRows, []interface{}{ + newUUID(), pl.ID, user.ID, time.Now(), time.Now(), nil, + }) + } + + _, err = BulkInsert(db, "playlist_follows", + "id, playlist_id, user_id, created_at, updated_at, deleted_at", + pfRows) + if err != nil { + return nil, fmt.Errorf("insert playlist_follows: %w", err) + } + p.Update(len(pfRows)) + p.Done() + + return playlists, nil +} diff --git a/veza-backend-api/cmd/tools/seed/seed_social.go b/veza-backend-api/cmd/tools/seed/seed_social.go new file mode 100644 index 000000000..a442a8ef2 --- /dev/null +++ b/veza-backend-api/cmd/tools/seed/seed_social.go @@ -0,0 +1,248 @@ +package main + +import ( + "database/sql" + "fmt" + "time" +) + +// SeedSocial creates follows, track_likes, track_reposts, comments, and user_blocks. +func SeedSocial(db *sql.DB, cfg Config, users []SeededUser, tracks []SeededTrack) error { + fmt.Println("\n═══ SOCIAL ═══") + + artists := GetArtists(users) + allUsers := users + + // ── 1. Follows (scale-free distribution) ───────────────────────────────── + p := NewProgress("follows", cfg.Follows) + followRows := make([][]interface{}, 0, cfg.Follows) + followSeen := make(map[string]bool) + + // Build popularity weights: artists are much more likely to be followed + artistSet := make(map[string]bool) + for _, a := range artists { + artistSet[a.ID] = true + } + + for i := 0; i < cfg.Follows*2 && len(followRows) < cfg.Follows; i++ { + follower := allUsers[rng.Intn(len(allUsers))] + + // 70% chance to follow an artist, 30% random user + var followed SeededUser + if randChance(70) && len(artists) > 0 { + // Power-law: top artists get followed more + idx := PowerLaw(0, len(artists)-1, 1.5) + followed = artists[idx] + } else { + followed = allUsers[rng.Intn(len(allUsers))] + } + + if follower.ID == followed.ID { + continue + } + key := follower.ID + ":" + followed.ID + if followSeen[key] { + continue + } + followSeen[key] = true + + createdAt := RandomTimeAfter(follower.CreatedAt) + if followed.CreatedAt.After(follower.CreatedAt) { + createdAt = RandomTimeAfter(followed.CreatedAt) + } + + followRows = append(followRows, []interface{}{ + newUUID(), follower.ID, followed.ID, createdAt, createdAt, + }) + } + + // Ensure test artist@veza.music has many followers + testArtist := findUser(users, "artist@veza.music") + if testArtist != nil { + for _, u := range users[:min(200, len(users))] { + if u.ID == testArtist.ID { + continue + } + key := u.ID + ":" + testArtist.ID + if followSeen[key] { + continue + } + followSeen[key] = true + followRows = append(followRows, []interface{}{ + newUUID(), u.ID, testArtist.ID, RandomTimeAfter(u.CreatedAt), time.Now(), + }) + } + } + + _, err := BulkInsert(db, "follows", + "id, follower_id, followed_id, created_at, updated_at", + followRows) + if err != nil { + return fmt.Errorf("insert follows: %w", err) + } + p.Update(len(followRows)) + p.Done() + + // ── 2. Track likes ─────────────────────────────────────────────────────── + if len(tracks) == 0 { + return nil + } + + p = NewProgress("track_likes", cfg.TrackLikes) + likeRows := make([][]interface{}, 0, cfg.TrackLikes) + likeSeen := make(map[string]bool) + + for i := 0; i < cfg.TrackLikes*2 && len(likeRows) < cfg.TrackLikes; i++ { + user := allUsers[rng.Intn(len(allUsers))] + // Power-law: popular tracks get more likes + track := tracks[PowerLaw(0, len(tracks)-1, 1.2)] + key := user.ID + ":" + track.ID + if likeSeen[key] { + continue + } + likeSeen[key] = true + likeRows = append(likeRows, []interface{}{ + newUUID(), user.ID, track.ID, time.Now(), + }) + } + + _, err = BulkInsert(db, "track_likes", + "id, user_id, track_id, created_at", + likeRows) + if err != nil { + return fmt.Errorf("insert track_likes: %w", err) + } + p.Update(len(likeRows)) + p.Done() + + // ── 3. Track reposts ───────────────────────────────────────────────────── + p = NewProgress("track_reposts", cfg.TrackReposts) + repostRows := make([][]interface{}, 0, cfg.TrackReposts) + repostSeen := make(map[string]bool) + + for i := 0; i < cfg.TrackReposts*2 && len(repostRows) < cfg.TrackReposts; i++ { + user := allUsers[rng.Intn(len(allUsers))] + track := tracks[PowerLaw(0, len(tracks)-1, 1.2)] + if user.ID == track.CreatorID { + continue // Don't repost own tracks + } + key := user.ID + ":" + track.ID + if repostSeen[key] { + continue + } + repostSeen[key] = true + repostRows = append(repostRows, []interface{}{ + newUUID(), user.ID, track.ID, time.Now(), + }) + } + + _, err = BulkInsert(db, "track_reposts", + "id, user_id, track_id, created_at", + repostRows) + if err != nil { + return fmt.Errorf("insert track_reposts: %w", err) + } + p.Update(len(repostRows)) + p.Done() + + // ── 4. Comments (track_comments + generic comments) ────────────────────── + p = NewProgress("track_comments", cfg.Comments) + commentRows := make([][]interface{}, 0, cfg.Comments) + + for i := 0; i < cfg.Comments; i++ { + user := allUsers[rng.Intn(len(allUsers))] + track := tracks[PowerLaw(0, len(tracks)-1, 1.0)] + content := GenComment() + createdAt := RandomTimeAfter(user.CreatedAt) + + // Timed comment: position within the track + var timestampSec *int + if randChance(40) { + ts := randInt(0, track.Duration) + timestampSec = &ts + } + + commentRows = append(commentRows, []interface{}{ + newUUID(), track.ID, user.ID, content, + nil, // parent_comment_id + timestampSec, false, false, nil, + createdAt, createdAt, nil, + }) + } + + _, err = BulkInsert(db, "track_comments", + "id, track_id, user_id, content, parent_comment_id, timestamp_seconds, is_edited, is_deleted, parent_id, created_at, updated_at, deleted_at", + commentRows) + if err != nil { + return fmt.Errorf("insert track_comments: %w", err) + } + p.Update(len(commentRows)) + p.Done() + + // Also populate the generic 'comments' table (used for track comments via target_type) + p = NewProgress("comments (generic)", cfg.Comments/2) + genCommentRows := make([][]interface{}, 0, cfg.Comments/2) + for i := 0; i < cfg.Comments/2; i++ { + user := allUsers[rng.Intn(len(allUsers))] + track := tracks[rng.Intn(len(tracks))] + content := GenComment() + createdAt := RandomTimeAfter(user.CreatedAt) + genCommentRows = append(genCommentRows, []interface{}{ + newUUID(), user.ID, track.ID, "track", content, createdAt, createdAt, + }) + } + _, _ = BulkInsert(db, "comments", + "id, user_id, target_id, target_type, content, created_at, updated_at", + genCommentRows) + p.Update(len(genCommentRows)) + p.Done() + + // ── 5. User blocks (small number) ──────────────────────────────────────── + blockCount := len(users) / 50 // ~2% of users have blocked someone + if blockCount < 5 { + blockCount = 5 + } + p = NewProgress("user_blocks", blockCount) + blockRows := make([][]interface{}, 0, blockCount) + blockSeen := make(map[string]bool) + + for i := 0; i < blockCount; i++ { + blocker := allUsers[rng.Intn(len(allUsers))] + blocked := allUsers[rng.Intn(len(allUsers))] + if blocker.ID == blocked.ID { + continue + } + key := blocker.ID + ":" + blocked.ID + if blockSeen[key] { + continue + } + blockSeen[key] = true + blockRows = append(blockRows, []interface{}{ + newUUID(), blocker.ID, blocked.ID, nil, time.Now(), time.Now(), + }) + } + + _, _ = BulkInsert(db, "user_blocks", + "id, blocker_id, blocked_id, reason, created_at, updated_at", + blockRows) + p.Update(len(blockRows)) + p.Done() + + return nil +} + +func findUser(users []SeededUser, email string) *SeededUser { + for i := range users { + if users[i].Email == email { + return &users[i] + } + } + return nil +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} diff --git a/veza-backend-api/cmd/tools/seed/seed_tracks.go b/veza-backend-api/cmd/tools/seed/seed_tracks.go new file mode 100644 index 000000000..aac49ab01 --- /dev/null +++ b/veza-backend-api/cmd/tools/seed/seed_tracks.go @@ -0,0 +1,224 @@ +package main + +import ( + "database/sql" + "fmt" + "math" + "strings" +) + +// SeededTrack holds track data for cross-referencing. +type SeededTrack struct { + ID string + CreatorID string + Title string + Artist string + Genre string + Duration int + BPM int + Key string + AlbumID string + CreatedAt string // RFC3339 +} + +// SeededAlbum holds album data. +type SeededAlbum struct { + ID string + CreatorID string + Title string +} + +// SeedTracks creates tracks with power-law distribution across artists. +func SeedTracks(db *sql.DB, cfg Config, users []SeededUser) ([]SeededTrack, error) { + fmt.Println("\n═══ TRACKS ═══") + + artists := GetArtists(users) + if len(artists) == 0 { + return nil, fmt.Errorf("no artists found") + } + + // ── 1. Distribute tracks across artists using power law ────────────────── + // Top artists get many more tracks than bottom ones + trackCounts := distributeTracksToArtists(cfg.Tracks, len(artists)) + + // ── 2. Generate tracks ─────────────────────────────────────────────────── + tracks := make([]SeededTrack, 0, cfg.Tracks) + trackRows := make([][]interface{}, 0, cfg.Tracks) + + p := NewProgress("tracks", cfg.Tracks) + for ai, artist := range artists { + count := trackCounts[ai] + genres := GenreForArtist(ai) + primaryGenre := genres[0] + + for ti := 0; ti < count; ti++ { + id := newUUID() + title := GenTrackTitle() + genre := primaryGenre + if len(genres) > 1 && randChance(30) { + genre = genres[rng.Intn(len(genres))] + } + + duration := randInt(30, 720) // 30s to 12min + // Majority 2-5min + if randChance(60) { + duration = randInt(120, 300) + } + + bpm := randInt(genre.BPMRange[0], genre.BPMRange[1]) + key := "" + if len(genre.Keys) > 0 { + key = pick(genre.Keys) + } + + createdAt := RandomTimeAfter(artist.CreatedAt) + createdAt = RealisticHour(createdAt) + filePath := fmt.Sprintf("audio/%s/%s.mp3", artist.Username, strings.ReplaceAll(strings.ToLower(title), " ", "_")) + fileSize := int64(duration) * int64(randInt(16000, 32000)) // ~128-256 kbps + + tags := fmt.Sprintf("{%s,%s}", genre.Slug, pick([]string{"chill", "energetic", "dark", "melodic", "atmospheric", "groovy", "deep", "raw", "smooth", "heavy"})) + + t := SeededTrack{ + ID: id, + CreatorID: artist.ID, + Title: title, + Artist: artist.DisplayName, + Genre: genre.Slug, + Duration: duration, + BPM: bpm, + Key: key, + CreatedAt: createdAt.Format("2006-01-02T15:04:05Z"), + } + tracks = append(tracks, t) + + trackRows = append(trackRows, []interface{}{ + id, artist.ID, artist.ID, // creator_id, user_id + title, nil, // description + artist.DisplayName, nil, genre.Slug, // artist, album, genre + 0, duration, bpm, key, + "public", false, // visibility, is_downloadable + nil, nil, // cover_art_file_id, waveform_data + 0, 0, 0, 0, // counts (will be updated) + filePath, fileSize, "mp3", 320, 44100, // file details + nil, nil, // waveform_path, cover_art_path + "completed", nil, "ready", nil, // status, stream_status + true, tags, createdAt, createdAt, createdAt, nil, + }) + } + } + + _, err := BulkInsert(db, "tracks", + "id, creator_id, user_id, title, description, artist, album, genre, year, duration, bpm, musical_key, visibility, is_downloadable, cover_art_file_id, waveform_data, play_count, like_count, comment_count, download_count, file_path, file_size, format, bitrate, sample_rate, waveform_path, cover_art_path, status, status_message, stream_status, stream_manifest_url, is_public, tags, published_at, created_at, updated_at, deleted_at", + trackRows) + if err != nil { + return nil, fmt.Errorf("insert tracks: %w", err) + } + p.Update(len(trackRows)) + p.Done() + + // ── 3. Link tracks to genres (track_genres table) ──────────────────────── + p = NewProgress("track_genres", len(tracks)) + // First, fetch genre IDs + genreMap := make(map[string]string) + rows, err := db.Query("SELECT id, slug FROM genres") + if err == nil { + for rows.Next() { + var id, slug string + _ = rows.Scan(&id, &slug) + genreMap[slug] = id + } + rows.Close() + } + + if len(genreMap) > 0 { + tgRows := make([][]interface{}, 0, len(tracks)) + for _, t := range tracks { + if gid, ok := genreMap[t.Genre]; ok { + tgRows = append(tgRows, []interface{}{t.ID, gid}) + } + } + _, _ = BulkInsert(db, "track_genres", "track_id, genre_id", tgRows) + } + p.Update(len(tracks)) + p.Done() + + // ── 4. Link tracks to tags (track_tags table) ──────────────────────────── + p = NewProgress("track_tags", len(tracks)) + // Fetch tag IDs + tagMap := make(map[string]string) + rows, err = db.Query("SELECT id, name FROM tags") + if err == nil { + for rows.Next() { + var id, name string + _ = rows.Scan(&id, &name) + tagMap[strings.ToLower(name)] = id + } + rows.Close() + } + + if len(tagMap) > 0 { + ttRows := make([][]interface{}, 0, len(tracks)*2) + for _, t := range tracks { + if tid, ok := tagMap[t.Genre]; ok { + ttRows = append(ttRows, []interface{}{t.ID, tid}) + } + } + if len(ttRows) > 0 { + _, _ = BulkInsert(db, "track_tags", "track_id, tag_id", ttRows) + } + } + p.Update(len(tracks)) + p.Done() + + return tracks, nil +} + +// distributeTracksToArtists distributes totalTracks across numArtists +// using a power-law distribution. Top artists get many more tracks. +func distributeTracksToArtists(totalTracks, numArtists int) []int { + counts := make([]int, numArtists) + + // Generate power-law weights + weights := make([]float64, numArtists) + for i := range weights { + // Zipf-like: weight = 1/(rank^0.8) + weights[i] = 1.0 / math.Pow(float64(i+1), 0.8) + } + + // Normalize to sum to totalTracks + totalWeight := 0.0 + for _, w := range weights { + totalWeight += w + } + + assigned := 0 + for i := range counts { + counts[i] = int(float64(totalTracks) * weights[i] / totalWeight) + if counts[i] < 1 { + counts[i] = 1 + } + assigned += counts[i] + } + + // Adjust to hit exact total + diff := totalTracks - assigned + for i := 0; diff > 0; i = (i + 1) % numArtists { + counts[i]++ + diff-- + } + for i := 0; diff < 0; i = (i + 1) % numArtists { + if counts[i] > 1 { + counts[i]-- + diff++ + } + } + + // Cap at 80 tracks per artist + for i := range counts { + if counts[i] > 80 { + counts[i] = 80 + } + } + + return counts +} diff --git a/veza-backend-api/cmd/tools/seed/seed_users.go b/veza-backend-api/cmd/tools/seed/seed_users.go new file mode 100644 index 000000000..73dd80e20 --- /dev/null +++ b/veza-backend-api/cmd/tools/seed/seed_users.go @@ -0,0 +1,376 @@ +package main + +import ( + "database/sql" + "fmt" + "strings" + "time" + + "golang.org/x/crypto/bcrypt" +) + +// TestAccount represents a predefined test account. +type TestAccount struct { + Email string + Password string + Username string + DisplayName string + Role string + IsAdmin bool + Bio string +} + +var testAccounts = []TestAccount{ + {"admin@veza.music", "Admin123!", "admin_veza", "Admin Veza", "admin", true, "Platform administrator. Managing all the things."}, + {"artist@veza.music", "Artist123!", "top_artist", "Luna Dubois", "creator", false, "Productrice electro basée à Paris. Melodic techno & ambient. Label founder."}, + {"user@veza.music", "User123!", "music_fan", "Music Fan", "user", false, "Music lover. Always discovering new sounds. Playlist curator."}, + {"mod@veza.music", "Mod123!", "mod_veza", "Moderator Veza", "moderator", false, "Community moderator. Keeping the vibes positive."}, + {"new@veza.music", "New123!", "new_user", "New User", "user", false, "Just joined!"}, +} + +// SeededUser holds user data for cross-referencing in other seeders. +type SeededUser struct { + ID string + Email string + Username string + DisplayName string + Role string + IsAdmin bool + CreatedAt time.Time +} + +// SeedUsers creates all users, profiles, settings, and role assignments. +// Returns the full list of seeded users for use by other seeders. +func SeedUsers(db *sql.DB, cfg Config) ([]SeededUser, error) { + fmt.Println("\n═══ USERS ═══") + + // Pre-hash passwords (bcrypt cost 12) + defaultHash, err := bcrypt.GenerateFromPassword([]byte("Password123!"), 12) + if err != nil { + return nil, fmt.Errorf("bcrypt default: %w", err) + } + + // Hash each test account password + testHashes := make([]string, len(testAccounts)) + for i, ta := range testAccounts { + h, err := bcrypt.GenerateFromPassword([]byte(ta.Password), 12) + if err != nil { + return nil, fmt.Errorf("bcrypt test account %s: %w", ta.Email, err) + } + testHashes[i] = string(h) + } + + users := make([]SeededUser, 0, cfg.TotalUsers) + + // ── 1. Create test accounts first ──────────────────────────────────────── + p := NewProgress("users (test accounts)", len(testAccounts)) + testRows := make([][]interface{}, 0, len(testAccounts)) + for i, ta := range testAccounts { + id := newUUID() + createdAt := DaysAgo(365 + (len(testAccounts)-i)*30) // Staggered creation + u := SeededUser{ + ID: id, + Email: ta.Email, + Username: ta.Username, + DisplayName: ta.DisplayName, + Role: ta.Role, + IsAdmin: ta.IsAdmin, + CreatedAt: createdAt, + } + users = append(users, u) + testRows = append(testRows, []interface{}{ + id, ta.Email, createdAt, // email_verified_at = created_at + testHashes[i], ta.Username, ta.Username, + ta.DisplayName, nil, nil, // first_name, last_name + ta.Bio, nil, // location + ta.Role, true, true, false, ta.IsAdmin, true, + 0, nil, createdAt, 0, nil, nil, + createdAt, createdAt, nil, "{}", + }) + } + _, err = BulkInsert(db, "users", + "id, email, email_verified_at, password_hash, username, slug, display_name, first_name, last_name, bio, location, role, is_active, is_verified, is_banned, is_admin, is_public, token_version, last_password_change_at, last_login_at, login_count, last_login_ip, username_changed_at, created_at, updated_at, deleted_at, social_links", + testRows) + if err != nil { + return nil, fmt.Errorf("insert test users: %w", err) + } + p.Update(len(testAccounts)) + p.Done() + + // ── 2. Generate remaining users ────────────────────────────────────────── + remaining := cfg.TotalUsers - len(testAccounts) + if remaining <= 0 { + return users, nil + } + + // Distribute roles + artistCount := cfg.Artists - 1 // -1 for test artist + labelCount := cfg.Labels + modCount := cfg.Moderators - 1 // -1 for test mod + adminCount := cfg.Admins - 1 // -1 for test admin + normalCount := remaining - artistCount - labelCount - modCount - adminCount + + type roleAssignment struct { + role string + isAdmin bool + count int + } + assignments := []roleAssignment{ + {"admin", true, adminCount}, + {"moderator", false, modCount}, + {"creator", false, artistCount}, + {"creator", false, labelCount}, // Labels are creators too + {"user", false, normalCount}, + } + + pwHash := string(defaultHash) + userIdx := len(testAccounts) + allRows := make([][]interface{}, 0, remaining) + + for _, ra := range assignments { + p = NewProgress(fmt.Sprintf("users (%s)", ra.role), ra.count) + for i := 0; i < ra.count; i++ { + id := newUUID() + createdAt := RandomRegistrationTime(userIdx, cfg.TotalUsers) + createdAt = RealisticHour(createdAt) + + var displayName, bio, location string + var firstName, lastName *string + + if ra.role == "creator" { + displayName = GenArtistName(userIdx) + genres := GenreForArtist(userIdx) + bio = GenBio(genres[0].Name) + location = pick(cities) + fn := pick(frenchNames) + ln := pick(frenchLastNames) + firstName = &fn + lastName = &ln + } else { + fn := pick(frenchNames) + ln := pick(frenchLastNames) + displayName = fn + " " + ln + firstName = &fn + lastName = &ln + if randChance(60) { + bio = GenShortBio() + } + if randChance(40) { + location = pick(cities) + } + } + + username := GenUsername(displayName, userIdx) + email := fmt.Sprintf("%s@veza-user.local", username) + + // Email verification: 90% verified + var emailVerifiedAt interface{} + isVerified := randChance(90) + if isVerified { + emailVerifiedAt = RandomTimeAfter(createdAt) + } + + var socialLinks string + if ra.role == "creator" && randChance(70) { + socialLinks = fmt.Sprintf(`{"website":"https://%s.com","instagram":"@%s"}`, username, username) + } else { + socialLinks = "{}" + } + + var lastLoginAt interface{} + loginCount := 0 + if randChance(80) { + lastLoginAt = RandomTimeAfter(createdAt) + loginCount = randInt(1, 200) + } + + u := SeededUser{ + ID: id, + Email: email, + Username: username, + DisplayName: displayName, + Role: ra.role, + IsAdmin: ra.isAdmin, + CreatedAt: createdAt, + } + users = append(users, u) + + allRows = append(allRows, []interface{}{ + id, email, emailVerifiedAt, + pwHash, username, username, + displayName, firstName, lastName, + bio, location, + ra.role, true, isVerified, false, ra.isAdmin, true, + 0, nil, lastLoginAt, loginCount, nil, nil, + createdAt, createdAt, nil, socialLinks, + }) + userIdx++ + } + p.Update(ra.count) + p.Done() + } + + p = NewProgress("users (bulk insert)", len(allRows)) + _, err = BulkInsert(db, "users", + "id, email, email_verified_at, password_hash, username, slug, display_name, first_name, last_name, bio, location, role, is_active, is_verified, is_banned, is_admin, is_public, token_version, last_password_change_at, last_login_at, login_count, last_login_ip, username_changed_at, created_at, updated_at, deleted_at, social_links", + allRows) + if err != nil { + return nil, fmt.Errorf("insert generated users: %w", err) + } + p.Update(len(allRows)) + p.Done() + + // ── 3. User profiles ───────────────────────────────────────────────────── + p = NewProgress("user_profiles", len(users)) + profileRows := make([][]interface{}, 0, len(users)) + for _, u := range users { + var bio, tagline, website, bannerURL, avatarURL *string + language := "fr" + if randChance(30) { + language = "en" + } + theme := pick([]string{"auto", "light", "dark"}) + visibility := "public" + + if u.Role == "creator" { + b := GenBio(GenreForArtist(0)[0].Name) + bio = &b + t := strings.Split(b, ".")[0] + tagline = &t + w := fmt.Sprintf("https://%s.com", u.Username) + website = &w + bn := fmt.Sprintf("https://cdn.veza.music/banners/%s.jpg", u.ID) + bannerURL = &bn + } + av := fmt.Sprintf("https://cdn.veza.music/avatars/%s.jpg", u.ID) + avatarURL = &av + + profileRows = append(profileRows, []interface{}{ + newUUID(), u.ID, bio, tagline, nil, website, nil, nil, + avatarURL, bannerURL, + language, "UTC", theme, visibility, + false, true, + 0, 0, 0, 0, // counts will be updated + u.CreatedAt, u.CreatedAt, + }) + } + _, err = BulkInsert(db, "user_profiles", + "id, user_id, bio, tagline, location, website_url, birthdate, gender, avatar_url, banner_url, language, timezone, theme, profile_visibility, show_email, show_location, follower_count, following_count, track_count, playlist_count, created_at, updated_at", + profileRows) + if err != nil { + return nil, fmt.Errorf("insert profiles: %w", err) + } + p.Update(len(users)) + p.Done() + + // ── 4. User settings ───────────────────────────────────────────────────── + p = NewProgress("user_settings", len(users)) + settingsRows := make([][]interface{}, 0, len(users)) + for _, u := range users { + settingsRows = append(settingsRows, []interface{}{ + newUUID(), u.ID, + true, true, true, true, true, true, true, true, + false, true, true, false, true, + u.CreatedAt, u.CreatedAt, + }) + } + _, err = BulkInsert(db, "user_settings", + "id, user_id, email_notifications, push_notifications, browser_notifications, email_on_follow, email_on_like, email_on_comment, email_on_message, email_on_mention, email_marketing, allow_search_indexing, show_activity, explicit_content, autoplay, created_at, updated_at", + settingsRows) + if err != nil { + return nil, fmt.Errorf("insert settings: %w", err) + } + p.Update(len(users)) + p.Done() + + // ── 5. User roles (via roles table) ────────────────────────────────────── + p = NewProgress("user_roles", len(users)) + // First, fetch role IDs from the roles table + roleMap := make(map[string]string) + rows, err := db.Query("SELECT id, name FROM roles") + if err != nil { + return nil, fmt.Errorf("fetch roles: %w", err) + } + for rows.Next() { + var id, name string + _ = rows.Scan(&id, &name) + roleMap[name] = id + } + rows.Close() + + roleRows := make([][]interface{}, 0, len(users)) + for _, u := range users { + roleName := u.Role + roleID, ok := roleMap[roleName] + if !ok { + // Try mapping 'creator' to a role in the table + if roleName == "creator" { + if rid, ok2 := roleMap["creator"]; ok2 { + roleID = rid + } else { + continue + } + } else { + continue + } + } + roleRows = append(roleRows, []interface{}{ + newUUID(), u.ID, roleID, nil, roleName, true, nil, nil, + u.CreatedAt, nil, true, u.CreatedAt, + }) + } + _, err = BulkInsert(db, "user_roles", + "id, user_id, role_id, assigned_by, role, verified, verified_at, verified_by, assigned_at, expires_at, is_active, created_at", + roleRows) + if err != nil { + return nil, fmt.Errorf("insert user_roles: %w", err) + } + p.Update(len(users)) + p.Done() + + return users, nil +} + +// GetArtists returns only users with role "creator". +func GetArtists(users []SeededUser) []SeededUser { + var artists []SeededUser + for _, u := range users { + if u.Role == "creator" { + artists = append(artists, u) + } + } + return artists +} + +// GetListeners returns non-creator, non-admin, non-moderator users. +func GetListeners(users []SeededUser) []SeededUser { + var listeners []SeededUser + for _, u := range users { + if u.Role == "user" || u.Role == "premium" { + listeners = append(listeners, u) + } + } + return listeners +} + +// GetModerators returns users with moderator role. +func GetModerators(users []SeededUser) []SeededUser { + var mods []SeededUser + for _, u := range users { + if u.Role == "moderator" { + mods = append(mods, u) + } + } + return mods +} + +// GetAdmins returns users with admin role. +func GetAdmins(users []SeededUser) []SeededUser { + var admins []SeededUser + for _, u := range users { + if u.IsAdmin { + admins = append(admins, u) + } + } + return admins +} diff --git a/veza-backend-api/cmd/tools/seed/utils.go b/veza-backend-api/cmd/tools/seed/utils.go new file mode 100644 index 000000000..69a618ad5 --- /dev/null +++ b/veza-backend-api/cmd/tools/seed/utils.go @@ -0,0 +1,251 @@ +package main + +import ( + "database/sql" + "fmt" + "strings" + "time" +) + +// BulkInsert performs a multi-row INSERT for maximum performance. +// columns: comma-separated column list. rows: slice of value slices. +// Returns number of rows inserted. +func BulkInsert(db *sql.DB, table string, columns string, rows [][]interface{}) (int, error) { + if len(rows) == 0 { + return 0, nil + } + + cols := strings.Split(columns, ",") + for i := range cols { + cols[i] = strings.TrimSpace(cols[i]) + } + numCols := len(cols) + + // Batch in chunks of 500 rows to stay within PG parameter limit (65535) + batchSize := 500 + if numCols > 20 { + batchSize = 200 + } + if numCols > 40 { + batchSize = 100 + } + + total := 0 + for start := 0; start < len(rows); start += batchSize { + end := start + batchSize + if end > len(rows) { + end = len(rows) + } + batch := rows[start:end] + + var sb strings.Builder + sb.WriteString("INSERT INTO ") + sb.WriteString(table) + sb.WriteString(" (") + sb.WriteString(strings.Join(cols, ",")) + sb.WriteString(") VALUES ") + + args := make([]interface{}, 0, len(batch)*numCols) + paramIdx := 1 + + for i, row := range batch { + if i > 0 { + sb.WriteByte(',') + } + sb.WriteByte('(') + for j := 0; j < numCols; j++ { + if j > 0 { + sb.WriteByte(',') + } + fmt.Fprintf(&sb, "$%d", paramIdx) + paramIdx++ + if j < len(row) { + args = append(args, row[j]) + } else { + args = append(args, nil) + } + } + sb.WriteByte(')') + } + + sb.WriteString(" ON CONFLICT DO NOTHING") + + _, err := db.Exec(sb.String(), args...) + if err != nil { + return total, fmt.Errorf("bulk insert into %s (batch at offset %d): %w", table, start, err) + } + total += len(batch) + } + return total, nil +} + +// BulkInsertRaw is like BulkInsert but with a raw suffix instead of ON CONFLICT DO NOTHING. +func BulkInsertRaw(db *sql.DB, table string, columns string, rows [][]interface{}, suffix string) (int, error) { + if len(rows) == 0 { + return 0, nil + } + + cols := strings.Split(columns, ",") + for i := range cols { + cols[i] = strings.TrimSpace(cols[i]) + } + numCols := len(cols) + + batchSize := 500 + if numCols > 20 { + batchSize = 200 + } + if numCols > 40 { + batchSize = 100 + } + + total := 0 + for start := 0; start < len(rows); start += batchSize { + end := start + batchSize + if end > len(rows) { + end = len(rows) + } + batch := rows[start:end] + + var sb strings.Builder + sb.WriteString("INSERT INTO ") + sb.WriteString(table) + sb.WriteString(" (") + sb.WriteString(strings.Join(cols, ",")) + sb.WriteString(") VALUES ") + + args := make([]interface{}, 0, len(batch)*numCols) + paramIdx := 1 + + for i, row := range batch { + if i > 0 { + sb.WriteByte(',') + } + sb.WriteByte('(') + for j := 0; j < numCols; j++ { + if j > 0 { + sb.WriteByte(',') + } + fmt.Fprintf(&sb, "$%d", paramIdx) + paramIdx++ + if j < len(row) { + args = append(args, row[j]) + } else { + args = append(args, nil) + } + } + sb.WriteByte(')') + } + + if suffix != "" { + sb.WriteByte(' ') + sb.WriteString(suffix) + } + + _, err := db.Exec(sb.String(), args...) + if err != nil { + return total, fmt.Errorf("bulk insert into %s (batch at offset %d): %w", table, start, err) + } + total += len(batch) + } + return total, nil +} + +// TruncateAll truncates all seedable tables in correct FK order. +func TruncateAll(db *sql.DB) error { + // TRUNCATE CASCADE handles FK ordering for us + tables := []string{ + // Level 3 (deepest dependents first) + "order_items", "product_previews", "product_images", "product_licenses", + "product_reviews", "product_views", "licenses", + "read_receipts", "delivered_status", "message_reactions", + "cloud_file_versions", "cloud_file_shares", + "shared_queue_items", "queue_sessions", + "lesson_progress", "course_enrollments", "certificates", "course_reviews", + "track_distribution_status_history", "external_streaming_royalties", + // Level 2 + "playlist_tracks", "playlist_collaborators", "playlist_follows", "playlist_share_links", + "track_versions", "track_plays", "track_likes", "track_comments", "track_shares", + "track_history", "track_lyrics", "track_stems", "track_tags", "track_genres", + "track_reposts", "track_distributions", "daily_track_stats", "geographic_play_stats", + "track_discovery_sources", "track_segment_stats", "audio_fingerprints", + "playback_history", "playback_analytics", "hls_streams", "hls_transcode_queue", + "file_metadata", "file_conversions", "user_files", + "room_members", "messages", "room_invitations", + "group_members", "group_join_requests", "group_invitations", + "comments", "likes", "webhook_failures", + "gear_images", "gear_documents", "gear_repairs", + "products", "orders", + "queue_items", "analytics_events", "moderation_actions", + "subscription_invoices", "lessons", + "seller_transfers", "seller_payouts", + // Level 1 + "user_profiles", "user_settings", "user_roles", "user_preferences", "user_presence", + "user_blocks", "user_storage_quotas", "user_folders", "user_genre_follows", + "user_tag_follows", "notification_preferences", "push_subscriptions", + "federated_identities", "refresh_tokens", "password_reset_tokens", + "email_verification_tokens", "user_sessions", + "follows", "tracks", "playlists", "groups", "posts", "rooms", + "files", "file_uploads", "live_streams", "gear_items", + "api_keys", "webhooks", "reports", "announcements", "support_tickets", + "data_exports", "seller_stripe_accounts", "seller_balances", + "co_listening_sessions", "user_subscriptions", "notifications", + "password_history", "login_history", "sms_verification_codes", + "webauthn_credentials", "metric_alerts", "metric_alert_preferences", + "user_strikes", "user_suspensions", "spam_detections", "queues", + "courses", + // Level 0 + "users", "audit_logs", + } + + for _, t := range tables { + _, err := db.Exec(fmt.Sprintf("TRUNCATE TABLE %s CASCADE", t)) + if err != nil { + // Table might not exist yet, skip silently + continue + } + } + return nil +} + +// CountRows returns the row count for a table. +func CountRows(db *sql.DB, table string) int { + var n int + _ = db.QueryRow(fmt.Sprintf("SELECT COUNT(*) FROM %s", table)).Scan(&n) + return n +} + +// Progress tracks and displays progress for a seeding step. +type Progress struct { + label string + total int + current int + startTime time.Time +} + +// NewProgress creates a new progress tracker. +func NewProgress(label string, total int) *Progress { + return &Progress{ + label: label, + total: total, + startTime: time.Now(), + } +} + +// Update advances the progress counter. +func (p *Progress) Update(n int) { + p.current += n +} + +// Done prints the completion message with timing. +func (p *Progress) Done() { + elapsed := time.Since(p.startTime) + fmt.Printf(" %-30s %6d rows (%s)\n", p.label, p.current, elapsed.Round(time.Millisecond)) +} + +// SeedResult stores the result of a seeding operation. +type SeedResult struct { + Table string + Count int + Duration time.Duration +} diff --git a/veza-backend-api/seed-v2 b/veza-backend-api/seed-v2 new file mode 100755 index 0000000000000000000000000000000000000000..86c2604c7b83528def9ffa2c75f4754015d8c5ba GIT binary patch literal 8480926 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

}C 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%0Ak11e>0dUG*L2%qry4&I?X`s2Wd=F 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 z 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�^dCQnbsG=W?N$^=+qy? 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

cCiEc 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