fix: admin 初始化在数据库未就绪时静默失败

initAdmin 改为后台 goroutine 并重试最多 30 秒,避免 users-rpc
启动时 PostgreSQL 尚未接受连接导致管理员账户创建失败。
This commit is contained in:
zetaloop
2026-04-05 17:30:35 +08:00
parent de32143b6d
commit 168cec6d57
+46 -32
View File
@@ -4,6 +4,7 @@ import (
"context" "context"
"os" "os"
"strings" "strings"
"time"
"juwan-backend/app/snowflake/rpc/snowflake" "juwan-backend/app/snowflake/rpc/snowflake"
"juwan-backend/app/users/rpc/internal/models/users" "juwan-backend/app/users/rpc/internal/models/users"
@@ -21,40 +22,53 @@ func initAdmin(svcCtx *svc.ServiceContext) {
return return
} }
ctx := context.Background() go func() {
exists, _ := svcCtx.UsersModelRW.Users.Query().Where(users.UsernameEQ(username)).Exist(ctx) ctx := context.Background()
if exists { for i := range 30 {
return exists, err := svcCtx.UsersModelRW.Users.Query().Where(users.UsernameEQ(username)).Exist(ctx)
} if err != nil {
if i < 29 {
time.Sleep(time.Second)
continue
}
logx.Errorf("check admin user: %v", err)
return
}
if exists {
return
}
break
}
hashedPassword, err := pwdUtils.HashPassword(password) hashedPassword, err := pwdUtils.HashPassword(password)
if err != nil { if err != nil {
logx.Errorf("hash admin password: %v", err) logx.Errorf("hash admin password: %v", err)
return return
} }
resp, err := svcCtx.Snowflake.NextId(ctx, &snowflake.NextIdReq{}) resp, err := svcCtx.Snowflake.NextId(ctx, &snowflake.NextIdReq{})
if err != nil { if err != nil {
logx.Errorf("generate admin user ID: %v", err) logx.Errorf("generate admin user ID: %v", err)
return return
} }
_, err = svcCtx.UsersModelRW.Users.Create(). _, err = svcCtx.UsersModelRW.Users.Create().
SetID(resp.Id). SetID(resp.Id).
SetUsername(username). SetUsername(username).
SetPasswordHash(hashedPassword). SetPasswordHash(hashedPassword).
SetEmail(email). SetEmail(email).
SetPhone(""). SetPhone("").
SetBio(""). SetBio("").
SetAvatar(""). SetAvatar("").
SetCurrentRole("consumer"). SetCurrentRole("consumer").
SetNickname(username). SetNickname(username).
SetIsAdmin(true). SetIsAdmin(true).
Save(ctx) Save(ctx)
if err != nil { if err != nil {
logx.Errorf("create admin user: %v", err) logx.Errorf("create admin user: %v", err)
return return
} }
logx.Infof("initialized admin user: %s", username) logx.Infof("initialized admin user: %s", username)
}()
} }