Files
H2Master/app/manager.go
2026-03-05 12:21:18 +03:00

82 lines
2.0 KiB
Go

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)
}