|
@@ -0,0 +1,119 @@
|
|
|
|
|
+package state
|
|
|
|
|
+
|
|
|
|
|
+import (
|
|
|
|
|
+ "encoding/json"
|
|
|
|
|
+ "fmt"
|
|
|
|
|
+ resty "github.com/go-resty/resty/v2"
|
|
|
|
|
+ "time"
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+const (
|
|
|
|
|
+ saveUrlFormat = "http://localhost:%d/v1.0/state/%s"
|
|
|
|
|
+ getUrlFormat = "http://localhost:%d/v1.0/state/%s/%s"
|
|
|
|
|
+ getBulkUrlFormat = "http://localhost:%d/v1.0/state/%s/bulk"
|
|
|
|
|
+ deleteUrlFormat = "http://localhost:%d/v1.0/state/%s/%s"
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+type API struct {
|
|
|
|
|
+ port int
|
|
|
|
|
+ client *resty.Client
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func NewAPI(port int, timeout time.Duration) *API {
|
|
|
|
|
+ return &API{
|
|
|
|
|
+ port: port,
|
|
|
|
|
+ client: resty.New().SetTimeout(timeout),
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func DestroyAPI(api *API) {
|
|
|
|
|
+ if api == nil {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ api.port = 0
|
|
|
|
|
+ api.client = nil
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (api *API) SaveState(storeName string, request []SaveStateRequest) error {
|
|
|
|
|
+ saveUrl := fmt.Sprintf(saveUrlFormat, api.port, storeName)
|
|
|
|
|
+
|
|
|
|
|
+ resp, err := api.client.R().
|
|
|
|
|
+ SetHeader("Content-Type", "application/json").
|
|
|
|
|
+ SetBody(request).
|
|
|
|
|
+ Post(saveUrl)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if resp.IsError() {
|
|
|
|
|
+ return fmt.Errorf("Status %d: %s\n", resp.StatusCode(), resp.Body())
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return nil
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (api *API) GetState(storeName string, key string, queryParams map[string]string, result interface{}) (string, error) {
|
|
|
|
|
+ getUrl := fmt.Sprintf(getUrlFormat, api.port, storeName, key)
|
|
|
|
|
+
|
|
|
|
|
+ resp, err := api.client.R().
|
|
|
|
|
+ SetQueryParams(queryParams).
|
|
|
|
|
+ SetResult(result).
|
|
|
|
|
+ Get(getUrl)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return "", err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if resp.IsError() {
|
|
|
|
|
+ return "", fmt.Errorf("Status %d: %s\n", resp.StatusCode(), resp.Body())
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return resp.Header().Get("Etag"), nil
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (api *API) GetStateBulk(storeName string, queryParams map[string]string, request GetStateBulkRequest) ([]GetStateBulkItem, error) {
|
|
|
|
|
+ getBulkUrl := fmt.Sprintf(getBulkUrlFormat, api.port, storeName)
|
|
|
|
|
+
|
|
|
|
|
+ resp, err := api.client.R().
|
|
|
|
|
+ SetQueryParams(queryParams).
|
|
|
|
|
+ SetBody(request).
|
|
|
|
|
+ Post(getBulkUrl)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return nil, err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if resp.IsError() {
|
|
|
|
|
+ return nil, fmt.Errorf("Status %d: %s\n", resp.StatusCode(), resp.Body())
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ items := make([]GetStateBulkItem, 0)
|
|
|
|
|
+ if resp.Body() != nil && len(resp.Body()) != 0 {
|
|
|
|
|
+ err = json.Unmarshal(resp.Body(), &items)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return nil, err
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return items, nil
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (api *API) DeleteState(storeName string, key string, queryParams map[string]string) error {
|
|
|
|
|
+ deleteUrl := fmt.Sprintf(deleteUrlFormat, api.port, storeName, key)
|
|
|
|
|
+
|
|
|
|
|
+ resp, err := api.client.R().
|
|
|
|
|
+ SetQueryParams(queryParams).
|
|
|
|
|
+ Delete(deleteUrl)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if resp.IsError() {
|
|
|
|
|
+ return fmt.Errorf("Status %d: %s\n", resp.StatusCode(), resp.Body())
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return nil
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (api *API) Transaction() {
|
|
|
|
|
+
|
|
|
|
|
+}
|