Files
kefu/im/backend/cmd/seed-test-users/main.go
T
2026-09-03 08:38:17 +08:00

66 lines
2.1 KiB
Go

package main
import (
"context"
"database/sql"
"encoding/json"
"flag"
"fmt"
"log"
"os"
"time"
"github.com/example/xingyu/internal/testusers"
"github.com/go-sql-driver/mysql"
)
func main() {
apply := flag.Bool("apply", false, "write the 100-user batch (default: print JSON only)")
base := flag.String("public-base", "", "public media URL, e.g. https://im.bchongw.com/uploads")
confirm := flag.String("confirm-database", "", "exact target database name, required for --apply")
production := flag.Bool("allow-production-test-data", false, "confirm intentional production fixture import")
source := flag.String("avatars-dir", "../fixtures/test-users/avatars", "generated avatar source directory")
media := flag.String("media-dir", "", "actual configured storage.local.directory / IM_MEDIA_DIR")
flag.Parse()
profiles, err := testusers.Generate(*base)
if err != nil {
log.Fatal(err)
}
if !*apply {
encoder := json.NewEncoder(os.Stdout)
encoder.SetIndent("", " ")
if err = encoder.Encode(profiles); err != nil {
log.Fatal(err)
}
return
}
if os.Getenv("IM_ENV") != "development" && os.Getenv("IM_ENV") != "test" && !*production {
log.Fatal("set IM_ENV=development/test, or explicitly confirm with --allow-production-test-data")
}
dsn := os.Getenv("IM_DB_DSN")
cfg, err := mysql.ParseDSN(dsn)
if err != nil || dsn == "" || *confirm == "" || cfg.DBName != *confirm {
log.Fatal("set IM_DB_DSN and matching --confirm-database; no default database is used")
}
cfg.ParseTime = true
db, err := sql.Open("mysql", cfg.FormatDSN())
if err != nil {
log.Fatal("cannot open database")
}
defer db.Close()
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
defer cancel()
if err = db.PingContext(ctx); err != nil {
log.Fatal("database connection failed (credentials not logged)")
}
if err = testusers.CopyAvatars(*source, *media); err != nil {
log.Fatal(err)
}
result, err := testusers.Seed(ctx, db, *base, *confirm)
if err != nil {
log.Fatal(err)
}
data, _ := json.MarshalIndent(result, "", " ")
fmt.Println(string(data))
}