package main import ( "context" "flag" "fmt" "os" "time" "go.uber.org/zap" "spark-server/internal/bootstrap" "spark-server/internal/infrastructure/id" "spark-server/internal/infrastructure/mysql" redisx "spark-server/internal/infrastructure/redis" convlogic "spark-server/internal/module/conversation/logic" convmodel "spark-server/internal/module/conversation/model" friendmodel "spark-server/internal/module/friend/model" groupmodel "spark-server/internal/module/group/model" msgmodel "spark-server/internal/module/message/model" seedlogic "spark-server/internal/module/seed/logic" usermodel "spark-server/internal/module/user/model" ) func main() { cfgPath := flag.String("config", "configs/config.yaml", "config path") flag.Parse() if err := run(*cfgPath); err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } } func run(cfgPath string) error { cfg, err := bootstrap.Load(cfgPath) if err != nil { return err } log := zap.NewNop() db, err := mysql.Open(log, &mysql.Options{ DSN: cfg.MySQL.DSN, SlowThreshold: cfg.MySQL.SlowThreshold, MaxOpenConns: cfg.MySQL.MaxOpenConns, MaxIdleConns: cfg.MySQL.MaxIdleConns, ConnMaxLifetime: cfg.MySQL.ConnMaxLifetime, ConnMaxIdleTime: cfg.MySQL.ConnMaxIdleTime, }) if err != nil { return fmt.Errorf("mysql: %w", err) } defer db.Close() if !db.Ready() { return fmt.Errorf("mysql: dsn is empty") } rdb, err := redisx.Open(&redisx.Options{ Addr: cfg.Redis.Addr, Username: cfg.Redis.Username, Password: cfg.Redis.Password, DB: cfg.Redis.DB, }) if err != nil { return fmt.Errorf("redis: %w", err) } defer rdb.Close() pingCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := rdb.Ping(pingCtx); err != nil { return fmt.Errorf("redis ping: %w", err) } ids, err := id.New(cfg.ID.SnowflakeWorkerID) if err != nil { return err } gdb := db.Gorm() users := usermodel.NewRepo(gdb) friends := friendmodel.NewRepo(gdb) chats := convlogic.NewP2PService(convmodel.NewRepo(gdb), ids) msgs := msgmodel.NewRepo(gdb) groups := groupmodel.NewRepo(gdb) svc := seedlogic.NewService(users, friends, chats, msgs, groups, ids) ctx, seedCancel := context.WithTimeout(context.Background(), 5*time.Minute) defer seedCancel() res, err := svc.Run(ctx) if err != nil { return err } fmt.Printf("seed ok bots=%d targets=%d group_id=%d sample_msgs=%d\n", res.Bots, res.Targets, res.GroupID, res.SampleMsgs) return nil }