Files
NixMsg/sdk/go/register.go
T

66 lines
1.8 KiB
Go

package nixmsg
import (
"bytes"
"context"
"encoding/json"
"fmt"
"io"
"net/http"
)
// Register 静态方法:HTTP 自助注册。url 可为连接地址或注册地址。
func Register(ctx context.Context, connectOrRegisterURL, registrationCode string, opt RegisterOptions) (RegisterResult, error) {
regURL := connectOrRegisterURL
if u, err := RegisterURLFromConnect(connectOrRegisterURL); err == nil {
regURL = u
}
body := map[string]any{
"registration_code": registrationCode,
"id": opt.ID,
"login_password": opt.LoginPassword,
"name": opt.Name,
"talk_password": opt.TalkPassword,
}
payload, err := marshalJSON(body)
if err != nil {
return RegisterResult{}, err
}
req, err := http.NewRequestWithContext(ctx, http.MethodPost, regURL, bytes.NewReader(payload))
if err != nil {
return RegisterResult{}, err
}
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return RegisterResult{}, err
}
defer resp.Body.Close()
raw, err := io.ReadAll(io.LimitReader(resp.Body, 64<<10))
if err != nil {
return RegisterResult{}, err
}
var wrap struct {
OK bool `json:"ok"`
Data struct {
ID string `json:"id"`
LoginPassword string `json:"login_password"`
} `json:"data"`
Error *struct {
Code string `json:"code"`
Message string `json:"message"`
} `json:"error"`
}
if err := json.Unmarshal(raw, &wrap); err != nil {
return RegisterResult{}, fmt.Errorf("注册响应无效: %w", err)
}
if !wrap.OK {
code, msg := CodeBadRequest, "注册失败"
if wrap.Error != nil {
code, msg = wrap.Error.Code, wrap.Error.Message
}
return RegisterResult{}, apiErr(code, msg)
}
return RegisterResult{ID: wrap.Data.ID, LoginPassword: wrap.Data.LoginPassword}, nil
}