package app import ( "fmt" "io" "net/http" "strings" "time" ) type NodeManager struct { client *http.Client token string url string } func NewNodeManager(node Node) NodeManager { client := &http.Client{Timeout: time.Second * 15} return NodeManager{ client, node.Token, node.URL, } } func (m *NodeManager) NewRequest(method, path string, body io.Reader) (*http.Request, error) { req, err := http.NewRequest(method, fmt.Sprintf("%s%s", m.url, path), body) if err != nil { return nil, err } req.Header.Add("Authorization", m.token) return req, nil } func (m *NodeManager) Do(req *http.Request) (*http.Response, error) { return m.client.Do(req) } func (m *NodeManager) Request(method, path string, body io.Reader) (*http.Response, error) { req, err := m.NewRequest(method, path, body) if err != nil { return nil, err } return m.Do(req) } func (m *NodeManager) LoadConfig() (NodeConfig, HysteriaConfig, error) { var _cfg NodeConfig var hysteriaCfg HysteriaConfig resp, err := m.Request("GET", "/config", nil) if err != nil { return _cfg, hysteriaCfg, err } defer resp.Body.Close() data, err := ReadResponse[NodeConfigRsp](resp.Body) if err != nil { return _cfg, hysteriaCfg, err } return data.Config, data.HysteriaConfig, nil } func (m *NodeManager) AddUser(username, password string) (User, error) { body := strings.NewReader(fmt.Sprintf(`{"username":"%s","password":"%s"}`, username, password)) resp, err := m.Request("POST", "/users", body) if err != nil { return User{}, err } defer resp.Body.Close() return ReadResponse[User](resp.Body) } func (m *NodeManager) GetUser(id uint64) (User, error) { var user User resp, err := m.Request("GET", fmt.Sprintf("/users/%d", id), nil) if err != nil { return user, err } defer resp.Body.Close() return ReadResponse[User](resp.Body) } func (m *NodeManager) GetUserKey(id uint64) (string, error) { resp, err := m.Request("GET", fmt.Sprintf("/users/%d/key", id), nil) if err != nil { return "", err } defer resp.Body.Close() return ReadResponse[string](resp.Body) }