合并 origin/main 设备注册后,纳入本地 music 模块、seed 命令与 popadmin 相关路由/文档;music migration 编号为 0020 以避免与 0019_devices 冲突。 Co-authored-by: Cursor <cursoragent@cursor.com>
91 lines
2.5 KiB
Go
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
|
|
}
|