You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

127 lines
2.8 KiB

package api
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"git.brettb.xyz/goinv/client/internal/types"
)
const userAgent = "goinv-cli"
type APIClient struct {
Host string
Token string
}
func NewAPIClient(host string) *APIClient {
return &APIClient{
Host: host,
}
}
func makeRequest[T any](c *APIClient, r *http.Request) (*T, error) {
r.Header.Set("User-Agent", userAgent)
//r.Header.Set("Authorization", "Bearer "+c.Token)
r.Header.Set("Accept", "application/json")
r.Header.Set("Content-Type", "application/json")
httpCli := http.Client{}
httpResp, err := httpCli.Do(r)
if err != nil {
return nil, err
}
defer httpResp.Body.Close()
body, err := io.ReadAll(httpResp.Body)
if err != nil {
return nil, err
}
resp, err := unmarshal[T](body)
if err != nil {
return nil, fmt.Errorf("%s", "An unexpected response was received")
}
return resp, nil
}
func (c *APIClient) RetrieveAssetByID(idNumber string) (*types.Asset, error) {
url := fmt.Sprintf("%s/assets/%s", c.Host, idNumber)
req, _ := http.NewRequest("GET", url, bytes.NewBuffer([]byte{}))
resp, err := makeRequest[types.AssetResponse](c, req)
if err != nil {
return nil, err
}
return resp.Asset, nil
}
func (c *APIClient) CreateAsset(request types.CreateAssetRequest) (*types.Asset, error) {
url := fmt.Sprintf("%s/assets", c.Host)
body, err := json.Marshal(request)
if err != nil {
return nil, err
}
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(body))
resp, err := makeRequest[types.AssetResponse](c, req)
if err != nil {
return nil, err
}
return resp.Asset, nil
}
func (c *APIClient) RetrieveAllAssets() ([]*types.Asset, error) {
url := fmt.Sprintf("%s/assets", c.Host)
req, _ := http.NewRequest("GET", url, bytes.NewBuffer([]byte{}))
resp, err := makeRequest[types.MultipleAssetsResponse](c, req)
if err != nil {
return nil, err
}
return resp.Assets, nil
}
func (c *APIClient) DeleteAssetByID(idNumber string) (*types.Asset, error) {
url := fmt.Sprintf("%s/assets/%s", c.Host, idNumber)
req, _ := http.NewRequest("DELETE", url, bytes.NewBuffer([]byte{}))
resp, err := makeRequest[types.AssetResponse](c, req)
if err != nil {
return nil, err
}
return resp.Asset, nil
}
func (c *APIClient) RetrieveAllShelves() ([]*types.ShelfLocation, error) {
url := fmt.Sprintf("%s/shelves", c.Host)
req, _ := http.NewRequest("GET", url, bytes.NewBuffer([]byte{}))
resp, err := makeRequest[types.MultipleShelfResponse](c, req)
if err != nil {
return nil, err
}
return resp.ShelfLocations, nil
}
func (c *APIClient) RetrieveAllCategories() ([]*types.Category, error) {
url := fmt.Sprintf("%s/categories", c.Host)
req, _ := http.NewRequest("GET", url, bytes.NewBuffer([]byte{}))
resp, err := makeRequest[types.MultipleCategoryResponse](c, req)
if err != nil {
return nil, err
}
return resp.Categories, nil
}