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 }