@@ -0,0 +1,71 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user