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) UpdateAsset(id string, request types.CreateAssetRequest) (*types.Asset, error) {
|
|
url := fmt.Sprintf("%s/assets/%s", c.Host, id)
|
|
|
|
body, err := json.Marshal(request)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
req, _ := http.NewRequest("PUT", 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) DeleteShelfByID(idNumber string) (*types.ShelfLocation, error) {
|
|
url := fmt.Sprintf("%s/shelves/%s", c.Host, idNumber)
|
|
req, _ := http.NewRequest("DELETE", url, bytes.NewBuffer([]byte{}))
|
|
|
|
resp, err := makeRequest[types.ShelfResponse](c, req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return resp.ShelfLocation, nil
|
|
}
|
|
|
|
func (c *APIClient) CreateShelf(request types.CreateShelfRequest) (*types.ShelfLocation, error) {
|
|
url := fmt.Sprintf("%s/shelves", 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.ShelfResponse](c, req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return resp.ShelfLocation, nil
|
|
}
|
|
|
|
func (c *APIClient) UpdateShelf(id string, request types.CreateShelfRequest) (*types.ShelfLocation, error) {
|
|
url := fmt.Sprintf("%s/shelves/%s", c.Host, id)
|
|
|
|
body, err := json.Marshal(request)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(body))
|
|
|
|
resp, err := makeRequest[types.ShelfResponse](c, req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return resp.ShelfLocation, nil
|
|
}
|
|
|
|
func (c *APIClient) RetrieveShelfByID(idNumber string) (*types.ShelfLocation, error) {
|
|
url := fmt.Sprintf("%s/shelves/%s", c.Host, idNumber)
|
|
req, _ := http.NewRequest("GET", url, bytes.NewBuffer([]byte{}))
|
|
|
|
resp, err := makeRequest[types.ShelfResponse](c, req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return resp.ShelfLocation, 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
|
|
}
|
|
|
|
func (c *APIClient) RetrieveAllBuildings() ([]*types.Building, error) {
|
|
url := fmt.Sprintf("%s/buildings", c.Host)
|
|
req, _ := http.NewRequest("GET", url, bytes.NewBuffer([]byte{}))
|
|
|
|
resp, err := makeRequest[types.MultipleBuildingResponse](c, req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return resp.Buildings, nil
|
|
}
|