|
package clients |
|
|
|
import ( |
|
"bytes" |
|
"encoding/json" |
|
"fmt" |
|
"io" |
|
"net/http" |
|
) |
|
|
|
|
|
type StoreClient struct { |
|
BaseURL string |
|
Client *http.Client |
|
} |
|
|
|
type SetRequest struct { |
|
Keys [][]float32 `json:"keys"` |
|
Values []string `json:"values"` |
|
} |
|
|
|
type GetRequest struct { |
|
Keys [][]float32 `json:"keys"` |
|
} |
|
|
|
type GetResponse struct { |
|
Keys [][]float32 `json:"keys"` |
|
Values []string `json:"values"` |
|
} |
|
|
|
type DeleteRequest struct { |
|
Keys [][]float32 `json:"keys"` |
|
} |
|
|
|
type FindRequest struct { |
|
TopK int `json:"topk"` |
|
Key []float32 `json:"key"` |
|
} |
|
|
|
type FindResponse struct { |
|
Keys [][]float32 `json:"keys"` |
|
Values []string `json:"values"` |
|
Similarities []float32 `json:"similarities"` |
|
} |
|
|
|
|
|
func NewStoreClient(baseUrl string) *StoreClient { |
|
return &StoreClient{ |
|
BaseURL: baseUrl, |
|
Client: &http.Client{}, |
|
} |
|
} |
|
|
|
|
|
func (c *StoreClient) Set(req SetRequest) error { |
|
return c.doRequest("stores/set", req) |
|
} |
|
|
|
|
|
func (c *StoreClient) Get(req GetRequest) (*GetResponse, error) { |
|
body, err := c.doRequestWithResponse("stores/get", req) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
var resp GetResponse |
|
err = json.Unmarshal(body, &resp) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
return &resp, nil |
|
} |
|
|
|
|
|
func (c *StoreClient) Delete(req DeleteRequest) error { |
|
return c.doRequest("stores/delete", req) |
|
} |
|
|
|
|
|
func (c *StoreClient) Find(req FindRequest) (*FindResponse, error) { |
|
body, err := c.doRequestWithResponse("stores/find", req) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
var resp FindResponse |
|
err = json.Unmarshal(body, &resp) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
return &resp, nil |
|
} |
|
|
|
|
|
func (c *StoreClient) doRequest(path string, data interface{}) error { |
|
jsonData, err := json.Marshal(data) |
|
if err != nil { |
|
return err |
|
} |
|
|
|
req, err := http.NewRequest("POST", c.BaseURL+"/"+path, bytes.NewBuffer(jsonData)) |
|
if err != nil { |
|
return err |
|
} |
|
req.Header.Set("Content-Type", "application/json") |
|
|
|
resp, err := c.Client.Do(req) |
|
if err != nil { |
|
return err |
|
} |
|
defer resp.Body.Close() |
|
|
|
if resp.StatusCode != http.StatusOK { |
|
return fmt.Errorf("API request to %s failed with status code %d", path, resp.StatusCode) |
|
} |
|
|
|
return nil |
|
} |
|
|
|
|
|
func (c *StoreClient) doRequestWithResponse(path string, data interface{}) ([]byte, error) { |
|
jsonData, err := json.Marshal(data) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
req, err := http.NewRequest("POST", c.BaseURL+"/"+path, bytes.NewBuffer(jsonData)) |
|
if err != nil { |
|
return nil, err |
|
} |
|
req.Header.Set("Content-Type", "application/json") |
|
|
|
resp, err := c.Client.Do(req) |
|
if err != nil { |
|
return nil, err |
|
} |
|
defer resp.Body.Close() |
|
|
|
if resp.StatusCode != http.StatusOK { |
|
return nil, fmt.Errorf("API request to %s failed with status code %d", path, resp.StatusCode) |
|
} |
|
|
|
body, err := io.ReadAll(resp.Body) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
return body, nil |
|
} |
|
|