dnscontrol/pkg/cloudflare-go/images_variants.go
Tom Limoncelli 7fd6a74e0c
CLOUDFLAREAPI: CF_REDIRECT/CF_TEMP_REDIRECT should dtrt using Single Redirects (#3002)
Co-authored-by: Josh Zhang <jzhang1@stackoverflow.com>
2024-06-18 17:38:50 -04:00

164 lines
5.4 KiB
Go

package cloudflare
import (
"context"
"fmt"
"net/http"
"github.com/goccy/go-json"
)
type ImagesVariant struct {
ID string `json:"id,omitempty"`
NeverRequireSignedURLs *bool `json:"neverRequireSignedURLs,omitempty"`
Options ImagesVariantsOptions `json:"options,omitempty"`
}
type ImagesVariantsOptions struct {
Fit string `json:"fit,omitempty"`
Height int `json:"height,omitempty"`
Metadata string `json:"metadata,omitempty"`
Width int `json:"width,omitempty"`
}
type ListImageVariantsParams struct{}
type ListImagesVariantsResponse struct {
Result ListImageVariantsResult `json:"result,omitempty"`
Response
}
type ListImageVariantsResult struct {
ImagesVariants map[string]ImagesVariant `json:"variants,omitempty"`
}
type CreateImagesVariantParams struct {
ID string `json:"id,omitempty"`
NeverRequireSignedURLs *bool `json:"neverRequireSignedURLs,omitempty"`
Options ImagesVariantsOptions `json:"options,omitempty"`
}
type UpdateImagesVariantParams struct {
ID string `json:"-"`
NeverRequireSignedURLs *bool `json:"neverRequireSignedURLs,omitempty"`
Options ImagesVariantsOptions `json:"options,omitempty"`
}
type ImagesVariantResult struct {
Variant ImagesVariant `json:"variant,omitempty"`
}
type ImagesVariantResponse struct {
Result ImagesVariantResult `json:"result,omitempty"`
Response
}
// Lists existing variants.
//
// API Reference: https://developers.cloudflare.com/api/operations/cloudflare-images-variants-list-variants
func (api *API) ListImagesVariants(ctx context.Context, rc *ResourceContainer, params ListImageVariantsParams) (ListImageVariantsResult, error) {
if rc.Identifier == "" {
return ListImageVariantsResult{}, ErrMissingAccountID
}
baseURL := fmt.Sprintf("/accounts/%s/images/v1/variants", rc.Identifier)
res, err := api.makeRequestContext(ctx, http.MethodGet, baseURL, nil)
if err != nil {
return ListImageVariantsResult{}, err
}
var listImageVariantsResponse ListImagesVariantsResponse
err = json.Unmarshal(res, &listImageVariantsResponse)
if err != nil {
return ListImageVariantsResult{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
}
return listImageVariantsResponse.Result, nil
}
// Fetch details for a single variant.
//
// API Reference: https://developers.cloudflare.com/api/operations/cloudflare-images-variants-variant-details
func (api *API) GetImagesVariant(ctx context.Context, rc *ResourceContainer, variantID string) (ImagesVariant, error) {
if rc.Identifier == "" {
return ImagesVariant{}, ErrMissingAccountID
}
baseURL := fmt.Sprintf("/accounts/%s/images/v1/variants/%s", rc.Identifier, variantID)
res, err := api.makeRequestContext(ctx, http.MethodGet, baseURL, nil)
if err != nil {
return ImagesVariant{}, err
}
var imagesVariantDetailResponse ImagesVariantResponse
err = json.Unmarshal(res, &imagesVariantDetailResponse)
if err != nil {
return ImagesVariant{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
}
return imagesVariantDetailResponse.Result.Variant, nil
}
// Specify variants that allow you to resize images for different use cases.
//
// API Reference: https://developers.cloudflare.com/api/operations/cloudflare-images-variants-create-a-variant
func (api *API) CreateImagesVariant(ctx context.Context, rc *ResourceContainer, params CreateImagesVariantParams) (ImagesVariant, error) {
if rc.Identifier == "" {
return ImagesVariant{}, ErrMissingAccountID
}
baseURL := fmt.Sprintf("/accounts/%s/images/v1/variants", rc.Identifier)
res, err := api.makeRequestContext(ctx, http.MethodPost, baseURL, params)
if err != nil {
return ImagesVariant{}, err
}
var createImagesVariantResponse ImagesVariantResponse
err = json.Unmarshal(res, &createImagesVariantResponse)
if err != nil {
return ImagesVariant{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
}
return createImagesVariantResponse.Result.Variant, nil
}
// Deleting a variant purges the cache for all images associated with the variant.
//
// API Reference: https://developers.cloudflare.com/api/operations/cloudflare-images-variants-variant-details
func (api *API) DeleteImagesVariant(ctx context.Context, rc *ResourceContainer, variantID string) error {
if rc.Identifier == "" {
return ErrMissingAccountID
}
baseURL := fmt.Sprintf("/accounts/%s/images/v1/variants/%s", rc.Identifier, variantID)
_, err := api.makeRequestContext(ctx, http.MethodDelete, baseURL, nil)
if err != nil {
return fmt.Errorf("%s: %w", errMakeRequestError, err)
}
return nil
}
// Updating a variant purges the cache for all images associated with the variant.
//
// API Reference: https://developers.cloudflare.com/api/operations/cloudflare-images-variants-variant-details
func (api *API) UpdateImagesVariant(ctx context.Context, rc *ResourceContainer, params UpdateImagesVariantParams) (ImagesVariant, error) {
if rc.Identifier == "" {
return ImagesVariant{}, ErrMissingAccountID
}
baseURL := fmt.Sprintf("/accounts/%s/images/v1/variants/%s", rc.Identifier, params.ID)
res, err := api.makeRequestContext(ctx, http.MethodPatch, baseURL, params)
if err != nil {
return ImagesVariant{}, err
}
var imagesVariantDetailResponse ImagesVariantResponse
err = json.Unmarshal(res, &imagesVariantDetailResponse)
if err != nil {
return ImagesVariant{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
}
return imagesVariantDetailResponse.Result.Variant, nil
}