mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-10-03 10:24:26 +08:00
151 lines
4.5 KiB
Go
151 lines
4.5 KiB
Go
package cloudflare
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/goccy/go-json"
|
|
)
|
|
|
|
var (
|
|
ErrMissingHostname = errors.New("required hostname missing")
|
|
ErrMissingService = errors.New("required service missing")
|
|
ErrMissingEnvironment = errors.New("required environment missing")
|
|
)
|
|
|
|
type AttachWorkersDomainParams struct {
|
|
ID string `json:"id,omitempty"`
|
|
ZoneID string `json:"zone_id,omitempty"`
|
|
ZoneName string `json:"zone_name,omitempty"`
|
|
Hostname string `json:"hostname,omitempty"`
|
|
Service string `json:"service,omitempty"`
|
|
Environment string `json:"environment,omitempty"`
|
|
}
|
|
|
|
type WorkersDomain struct {
|
|
ID string `json:"id,omitempty"`
|
|
ZoneID string `json:"zone_id,omitempty"`
|
|
ZoneName string `json:"zone_name,omitempty"`
|
|
Hostname string `json:"hostname,omitempty"`
|
|
Service string `json:"service,omitempty"`
|
|
Environment string `json:"environment,omitempty"`
|
|
}
|
|
|
|
type WorkersDomainResponse struct {
|
|
Response
|
|
Result WorkersDomain `json:"result"`
|
|
}
|
|
|
|
type ListWorkersDomainParams struct {
|
|
ZoneID string `url:"zone_id,omitempty"`
|
|
ZoneName string `url:"zone_name,omitempty"`
|
|
Hostname string `url:"hostname,omitempty"`
|
|
Service string `url:"service,omitempty"`
|
|
Environment string `url:"environment,omitempty"`
|
|
}
|
|
|
|
type WorkersDomainListResponse struct {
|
|
Response
|
|
Result []WorkersDomain `json:"result"`
|
|
}
|
|
|
|
// ListWorkersDomains lists all Worker Domains.
|
|
//
|
|
// API reference: https://developers.cloudflare.com/api/operations/worker-domain-list-domains
|
|
func (api *API) ListWorkersDomains(ctx context.Context, rc *ResourceContainer, params ListWorkersDomainParams) ([]WorkersDomain, error) {
|
|
if rc.Identifier == "" {
|
|
return []WorkersDomain{}, ErrMissingAccountID
|
|
}
|
|
|
|
uri := buildURI(fmt.Sprintf("/accounts/%s/workers/domains", rc.Identifier), params)
|
|
res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
|
|
if err != nil {
|
|
return []WorkersDomain{}, fmt.Errorf("%s: %w", errMakeRequestError, err)
|
|
}
|
|
|
|
var r WorkersDomainListResponse
|
|
if err := json.Unmarshal(res, &r); err != nil {
|
|
return []WorkersDomain{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
|
|
}
|
|
|
|
return r.Result, nil
|
|
}
|
|
|
|
// AttachWorkersDomain attaches a worker to a zone and hostname.
|
|
//
|
|
// API reference: https://developers.cloudflare.com/api/operations/worker-domain-attach-to-domain
|
|
func (api *API) AttachWorkersDomain(ctx context.Context, rc *ResourceContainer, domain AttachWorkersDomainParams) (WorkersDomain, error) {
|
|
if rc.Identifier == "" {
|
|
return WorkersDomain{}, ErrMissingAccountID
|
|
}
|
|
|
|
if domain.ZoneID == "" {
|
|
return WorkersDomain{}, ErrMissingZoneID
|
|
}
|
|
|
|
if domain.Hostname == "" {
|
|
return WorkersDomain{}, ErrMissingHostname
|
|
}
|
|
|
|
if domain.Service == "" {
|
|
return WorkersDomain{}, ErrMissingService
|
|
}
|
|
|
|
if domain.Environment == "" {
|
|
return WorkersDomain{}, ErrMissingEnvironment
|
|
}
|
|
|
|
uri := fmt.Sprintf("/accounts/%s/workers/domains", rc.Identifier)
|
|
res, err := api.makeRequestContext(ctx, http.MethodPut, uri, domain)
|
|
if err != nil {
|
|
return WorkersDomain{}, fmt.Errorf("%s: %w", errMakeRequestError, err)
|
|
}
|
|
|
|
var r WorkersDomainResponse
|
|
if err := json.Unmarshal(res, &r); err != nil {
|
|
return WorkersDomain{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
|
|
}
|
|
|
|
return r.Result, nil
|
|
}
|
|
|
|
// GetWorkersDomain gets a single Worker Domain.
|
|
//
|
|
// API reference: https://developers.cloudflare.com/api/operations/worker-domain-get-a-domain
|
|
func (api *API) GetWorkersDomain(ctx context.Context, rc *ResourceContainer, domainID string) (WorkersDomain, error) {
|
|
if rc.Identifier == "" {
|
|
return WorkersDomain{}, ErrMissingAccountID
|
|
}
|
|
|
|
uri := fmt.Sprintf("/accounts/%s/workers/domains/%s", rc.Identifier, domainID)
|
|
res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
|
|
if err != nil {
|
|
return WorkersDomain{}, fmt.Errorf("%s: %w", errMakeRequestError, err)
|
|
}
|
|
|
|
var r WorkersDomainResponse
|
|
if err := json.Unmarshal(res, &r); err != nil {
|
|
return WorkersDomain{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
|
|
}
|
|
|
|
return r.Result, nil
|
|
}
|
|
|
|
// DetachWorkersDomain detaches a worker from a zone and hostname.
|
|
//
|
|
// API reference: https://developers.cloudflare.com/api/operations/worker-domain-detach-from-domain
|
|
func (api *API) DetachWorkersDomain(ctx context.Context, rc *ResourceContainer, domainID string) error {
|
|
if rc.Identifier == "" {
|
|
return ErrMissingAccountID
|
|
}
|
|
|
|
uri := fmt.Sprintf("/accounts/%s/workers/domains/%s", rc.Identifier, domainID)
|
|
_, err := api.makeRequestContext(ctx, http.MethodDelete, uri, nil)
|
|
if err != nil {
|
|
return fmt.Errorf("%s: %w", errMakeRequestError, err)
|
|
}
|
|
|
|
return nil
|
|
}
|