spark-server/cmd/seed/main.go
DESKTOP-L8OUL9F\gfl0034 ce2cdf6bf3 feat: music 运营曲目、seed 机器人欢迎消息,并补充 novels/music OpenAPI
合并 origin/main 设备注册后,纳入本地 music 模块、seed 命令与 popadmin 相关路由/文档;music migration 编号为 0020 以避免与 0019_devices 冲突。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-23 16:07:05 +08:00

91 lines
2.5 KiB
Go

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
}