Initial commit
CI / test (push) Canceled after 0s

This commit is contained in:
2026-09-12 22:22:17 +02:00
commit 904d14b64c
314 changed files with 31884 additions and 0 deletions
+71
View File
@@ -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
}