|
@@ -0,0 +1,172 @@
|
|
|
+package client
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+ "io/ioutil"
|
|
|
+ "net/http"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "github.com/mudler/edgevpn/pkg/edgevpn/types"
|
|
|
+)
|
|
|
+
|
|
|
+type (
|
|
|
+ Client struct {
|
|
|
+ host string
|
|
|
+ httpClient *http.Client
|
|
|
+ }
|
|
|
+)
|
|
|
+
|
|
|
+const (
|
|
|
+ machineURL = "/api/machines"
|
|
|
+ usersURL = "/api/users"
|
|
|
+ serviceURL = "/api/services"
|
|
|
+ blockchainURL = "/api/blockchain"
|
|
|
+ ledgerURL = "/api/ledger"
|
|
|
+ fileURL = "/api/files"
|
|
|
+)
|
|
|
+
|
|
|
+func WithHost(host string) func(c *Client) error {
|
|
|
+ return func(c *Client) error {
|
|
|
+ c.host = host
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func WithTimeout(d time.Duration) func(c *Client) error {
|
|
|
+ return func(c *Client) error {
|
|
|
+ c.httpClient.Timeout = d
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func WithHTTPClient(cl *http.Client) func(c *Client) error {
|
|
|
+ return func(c *Client) error {
|
|
|
+ c.httpClient = cl
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+type Option func(c *Client) error
|
|
|
+
|
|
|
+func NewClient(o ...Option) *Client {
|
|
|
+ c := &Client{
|
|
|
+ httpClient: &http.Client{},
|
|
|
+ }
|
|
|
+ for _, oo := range o {
|
|
|
+ oo(c)
|
|
|
+ }
|
|
|
+ return c
|
|
|
+}
|
|
|
+
|
|
|
+func (c *Client) do(method, endpoint string, params map[string]string) (*http.Response, error) {
|
|
|
+ baseURL := fmt.Sprintf("%s/%s", c.host, endpoint)
|
|
|
+ req, err := http.NewRequest(method, baseURL, nil)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ req.Header.Add("Content-Type", "application/json")
|
|
|
+ q := req.URL.Query()
|
|
|
+ for key, val := range params {
|
|
|
+ q.Set(key, val)
|
|
|
+ }
|
|
|
+ req.URL.RawQuery = q.Encode()
|
|
|
+ return c.httpClient.Do(req)
|
|
|
+}
|
|
|
+
|
|
|
+// Get methods (Services, Users, Files, Ledger, Blockchain, Machines)
|
|
|
+func (c *Client) Services() (resp []types.Service, err error) {
|
|
|
+ res, err := c.do(http.MethodGet, serviceURL, nil)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer res.Body.Close()
|
|
|
+ body, err := ioutil.ReadAll(res.Body)
|
|
|
+ if err != nil {
|
|
|
+ return resp, err
|
|
|
+ }
|
|
|
+ if err = json.Unmarshal(body, &resp); err != nil {
|
|
|
+ return resp, err
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (c *Client) Files() (data []types.File, err error) {
|
|
|
+ res, err := c.do(http.MethodGet, fileURL, nil)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer res.Body.Close()
|
|
|
+ body, err := ioutil.ReadAll(res.Body)
|
|
|
+ if err != nil {
|
|
|
+ return data, err
|
|
|
+ }
|
|
|
+ if err = json.Unmarshal(body, &data); err != nil {
|
|
|
+ return data, err
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (c *Client) Users() (data []types.User, err error) {
|
|
|
+ res, err := c.do(http.MethodGet, usersURL, nil)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer res.Body.Close()
|
|
|
+ body, err := ioutil.ReadAll(res.Body)
|
|
|
+ if err != nil {
|
|
|
+ return data, err
|
|
|
+ }
|
|
|
+ if err = json.Unmarshal(body, &data); err != nil {
|
|
|
+ return data, err
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (c *Client) Ledger() (data map[string]string, err error) {
|
|
|
+ res, err := c.do(http.MethodGet, ledgerURL, nil)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer res.Body.Close()
|
|
|
+ body, err := ioutil.ReadAll(res.Body)
|
|
|
+ if err != nil {
|
|
|
+ return data, err
|
|
|
+ }
|
|
|
+ if err = json.Unmarshal(body, &data); err != nil {
|
|
|
+ return data, err
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (c *Client) Blockchain() (data []map[string]string, err error) {
|
|
|
+ res, err := c.do(http.MethodGet, blockchainURL, nil)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer res.Body.Close()
|
|
|
+ body, err := ioutil.ReadAll(res.Body)
|
|
|
+ if err != nil {
|
|
|
+ return data, err
|
|
|
+ }
|
|
|
+ if err = json.Unmarshal(body, &data); err != nil {
|
|
|
+ return data, err
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (c *Client) Machines() (resp []types.Machine, err error) {
|
|
|
+ res, err := c.do(http.MethodGet, machineURL, nil)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer res.Body.Close()
|
|
|
+ body, err := ioutil.ReadAll(res.Body)
|
|
|
+ if err != nil {
|
|
|
+ return resp, err
|
|
|
+ }
|
|
|
+ if err = json.Unmarshal(body, &resp); err != nil {
|
|
|
+ return resp, err
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|