66 lines
2.1 KiB
Go
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))
|
|
}
|