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 }