72 lines
2.2 KiB
Go
72 lines
2.2 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// Image describes an item in a garden's reusable image library.
|
|
type Image struct {
|
|
ID int `json:"id"`
|
|
GardenID int `json:"garden_id"`
|
|
FileName string `json:"file_name"`
|
|
MediaType string `json:"media_type"`
|
|
Size int64 `json:"size"`
|
|
Source string `json:"source"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
// Images lists a garden's images, optionally filtered by text and source.
|
|
func (c *Client) Images(ctx context.Context, gardenID int, query, source string) ([]Image, *Response, error) {
|
|
values := url.Values{}
|
|
if query != "" {
|
|
values.Set("q", query)
|
|
}
|
|
if source != "" {
|
|
values.Set("source", source)
|
|
}
|
|
path := "v1/gardens/" + strconv.Itoa(gardenID) + "/images"
|
|
if encoded := values.Encode(); encoded != "" {
|
|
path += "?" + encoded
|
|
}
|
|
var envelope struct {
|
|
Images []Image `json:"images"`
|
|
}
|
|
response, err := c.do(ctx, http.MethodGet, path, nil, &envelope)
|
|
return envelope.Images, response, err
|
|
}
|
|
|
|
// ImageData downloads an image body and returns its media type.
|
|
func (c *Client) ImageData(ctx context.Context, gardenID, imageID int) ([]byte, string, *Response, error) {
|
|
path := "v1/gardens/" + strconv.Itoa(gardenID) + "/images/" + strconv.Itoa(imageID)
|
|
relativeURL, err := url.Parse(strings.TrimPrefix(path, "/"))
|
|
if err != nil {
|
|
return nil, "", nil, err
|
|
}
|
|
request, err := http.NewRequestWithContext(ctx, http.MethodGet, c.baseURL.ResolveReference(relativeURL).String(), nil)
|
|
if err != nil {
|
|
return nil, "", nil, err
|
|
}
|
|
request.Header = c.headers.Clone()
|
|
request.Header.Set("Accept", "image/*")
|
|
if c.bearerToken != "" {
|
|
request.Header.Set("Authorization", "Bearer "+c.bearerToken)
|
|
}
|
|
response, err := c.httpClient.Do(request)
|
|
if err != nil {
|
|
return nil, "", nil, err
|
|
}
|
|
defer response.Body.Close()
|
|
wrapped := &Response{Response: response}
|
|
data, err := io.ReadAll(response.Body)
|
|
if err == nil && (response.StatusCode < http.StatusOK || response.StatusCode >= http.StatusMultipleChoices) {
|
|
return nil, response.Header.Get("Content-Type"), wrapped, newAPIError(response, data)
|
|
}
|
|
return data, response.Header.Get("Content-Type"), wrapped, err
|
|
}
|