client.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package client
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. "time"
  8. "github.com/mudler/edgevpn/pkg/edgevpn/types"
  9. )
  10. type (
  11. Client struct {
  12. host string
  13. httpClient *http.Client
  14. }
  15. )
  16. const (
  17. machineURL = "/api/machines"
  18. usersURL = "/api/users"
  19. serviceURL = "/api/services"
  20. blockchainURL = "/api/blockchain"
  21. ledgerURL = "/api/ledger"
  22. fileURL = "/api/files"
  23. )
  24. func WithHost(host string) func(c *Client) error {
  25. return func(c *Client) error {
  26. c.host = host
  27. return nil
  28. }
  29. }
  30. func WithTimeout(d time.Duration) func(c *Client) error {
  31. return func(c *Client) error {
  32. c.httpClient.Timeout = d
  33. return nil
  34. }
  35. }
  36. func WithHTTPClient(cl *http.Client) func(c *Client) error {
  37. return func(c *Client) error {
  38. c.httpClient = cl
  39. return nil
  40. }
  41. }
  42. type Option func(c *Client) error
  43. func NewClient(o ...Option) *Client {
  44. c := &Client{
  45. httpClient: &http.Client{},
  46. }
  47. for _, oo := range o {
  48. oo(c)
  49. }
  50. return c
  51. }
  52. func (c *Client) do(method, endpoint string, params map[string]string) (*http.Response, error) {
  53. baseURL := fmt.Sprintf("%s/%s", c.host, endpoint)
  54. req, err := http.NewRequest(method, baseURL, nil)
  55. if err != nil {
  56. return nil, err
  57. }
  58. req.Header.Add("Content-Type", "application/json")
  59. q := req.URL.Query()
  60. for key, val := range params {
  61. q.Set(key, val)
  62. }
  63. req.URL.RawQuery = q.Encode()
  64. return c.httpClient.Do(req)
  65. }
  66. // Get methods (Services, Users, Files, Ledger, Blockchain, Machines)
  67. func (c *Client) Services() (resp []types.Service, err error) {
  68. res, err := c.do(http.MethodGet, serviceURL, nil)
  69. if err != nil {
  70. return
  71. }
  72. defer res.Body.Close()
  73. body, err := ioutil.ReadAll(res.Body)
  74. if err != nil {
  75. return resp, err
  76. }
  77. if err = json.Unmarshal(body, &resp); err != nil {
  78. return resp, err
  79. }
  80. return
  81. }
  82. func (c *Client) Files() (data []types.File, err error) {
  83. res, err := c.do(http.MethodGet, fileURL, nil)
  84. if err != nil {
  85. return
  86. }
  87. defer res.Body.Close()
  88. body, err := ioutil.ReadAll(res.Body)
  89. if err != nil {
  90. return data, err
  91. }
  92. if err = json.Unmarshal(body, &data); err != nil {
  93. return data, err
  94. }
  95. return
  96. }
  97. func (c *Client) Users() (data []types.User, err error) {
  98. res, err := c.do(http.MethodGet, usersURL, nil)
  99. if err != nil {
  100. return
  101. }
  102. defer res.Body.Close()
  103. body, err := ioutil.ReadAll(res.Body)
  104. if err != nil {
  105. return data, err
  106. }
  107. if err = json.Unmarshal(body, &data); err != nil {
  108. return data, err
  109. }
  110. return
  111. }
  112. func (c *Client) Ledger() (data map[string]string, err error) {
  113. res, err := c.do(http.MethodGet, ledgerURL, nil)
  114. if err != nil {
  115. return
  116. }
  117. defer res.Body.Close()
  118. body, err := ioutil.ReadAll(res.Body)
  119. if err != nil {
  120. return data, err
  121. }
  122. if err = json.Unmarshal(body, &data); err != nil {
  123. return data, err
  124. }
  125. return
  126. }
  127. func (c *Client) Blockchain() (data []map[string]string, err error) {
  128. res, err := c.do(http.MethodGet, blockchainURL, nil)
  129. if err != nil {
  130. return
  131. }
  132. defer res.Body.Close()
  133. body, err := ioutil.ReadAll(res.Body)
  134. if err != nil {
  135. return data, err
  136. }
  137. if err = json.Unmarshal(body, &data); err != nil {
  138. return data, err
  139. }
  140. return
  141. }
  142. func (c *Client) Machines() (resp []types.Machine, err error) {
  143. res, err := c.do(http.MethodGet, machineURL, nil)
  144. if err != nil {
  145. return
  146. }
  147. defer res.Body.Close()
  148. body, err := ioutil.ReadAll(res.Body)
  149. if err != nil {
  150. return resp, err
  151. }
  152. if err = json.Unmarshal(body, &resp); err != nil {
  153. return resp, err
  154. }
  155. return
  156. }