Files
team-api/internal/handler/setup/setup.go
T
2026-05-10 12:21:27 +08:00

76 lines
2.0 KiB
Go

package setup
import (
"encoding/json"
"sync/atomic"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/qianfree/team-api/internal/consts"
"github.com/qianfree/team-api/internal/logic/admin"
"github.com/qianfree/team-api/internal/packed"
"github.com/qianfree/team-api/internal/response"
)
var setupMode atomic.Bool
// SetSetupMode sets whether the system is in setup mode.
func SetSetupMode(enabled bool) {
setupMode.Store(enabled)
}
// IsSetupMode returns whether the system is currently in setup mode.
func IsSetupMode() bool {
return setupMode.Load()
}
// SetSetupComplete marks setup as complete.
func SetSetupComplete() {
setupMode.Store(false)
}
// HandleSetupPage serves the embedded setup HTML page.
func HandleSetupPage(r *ghttp.Request) {
r.Response.Header().Set("Content-Type", "text/html; charset=utf-8")
r.Response.Write(packed.SetupHTML)
}
// HandleSetupStatus returns system initialization status.
func HandleSetupStatus(r *ghttp.Request) {
exists, err := admin.AdminExists(r.Context())
if err != nil {
response.Error(r, err)
return
}
response.Success(r, g.Map{"initialized": exists})
}
// HandleSetupInitialize creates the admin account.
func HandleSetupInitialize(r *ghttp.Request) {
var req struct {
Username string `json:"username"`
DisplayName string `json:"displayName"`
Password string `json:"password"`
ConfirmPassword string `json:"confirmPassword"`
}
if err := json.Unmarshal(r.GetBody(), &req); err != nil {
response.ErrorMsg(r, consts.CodeBadRequest, "请求格式错误")
return
}
if req.Username == "" || req.Password == "" {
response.ErrorMsg(r, consts.CodeBadRequest, "用户名和密码不能为空")
return
}
if req.Password != req.ConfirmPassword {
response.ErrorMsg(r, consts.CodeSetupPasswordMismatch, consts.MsgSetupPasswordMismatch)
return
}
if err := admin.CreateAdmin(r.Context(), req.Username, req.Password, req.DisplayName); err != nil {
response.Error(r, err)
return
}
SetSetupComplete()
response.Success(r, nil)
}