Bläddra i källkod

:wrench: Add simple client API

Ettore Di Giacinto 3 år sedan
förälder
incheckning
f78fe20fb6
1 ändrade filer med 172 tillägg och 0 borttagningar
  1. 172 0
      api/client/client.go

+ 172 - 0
api/client/client.go

@@ -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
+}