Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WC-1473: Add support for script content and script settings read/update endpoints #1361

Merged
merged 6 commits into from
Aug 22, 2023
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changelog/1361.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
```release-note:enhancement
workers: Add support for retrieving and uploading only script content.
```

```release-note:enhancement
workers: Add support for retrieving and uploading only script metadata.
```
147 changes: 143 additions & 4 deletions workers.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,12 @@
WorkerScript `json:"result"`
}

// WorkerScriptSettingsResponse wrapper struct for API response to worker script settings calls.
type WorkerScriptSettingsResponse struct {
Response
WorkerMetaData
}

type ListWorkersParams struct{}

type DeleteWorkerParams struct {
Expand All @@ -153,7 +159,7 @@

// DeleteWorker deletes a single Worker.
//
// API reference: https://api.cloudflare.com/#worker-script-delete-worker
// API reference: https://developers.cloudflare.com/api/operations/worker-script-delete-worker
func (api *API) DeleteWorker(ctx context.Context, rc *ResourceContainer, params DeleteWorkerParams) error {
if rc.Level != AccountRouteLevel {
return ErrRequiredAccountLevelResourceContainer
Expand Down Expand Up @@ -182,7 +188,7 @@
// GetWorker fetch raw script content for your worker returns string containing
// worker code js.
//
// API reference: https://developers.cloudflare.com/workers/tooling/api/scripts/
// API reference: https://developers.cloudflare.com/api/operations/worker-script-download-worker
func (api *API) GetWorker(ctx context.Context, rc *ResourceContainer, scriptName string) (WorkerScriptResponse, error) {
if rc.Level != AccountRouteLevel {
return WorkerScriptResponse{}, ErrRequiredAccountLevelResourceContainer
Expand Down Expand Up @@ -225,7 +231,7 @@

// ListWorkers returns list of Workers for given account.
//
// API reference: https://developers.cloudflare.com/workers/tooling/api/scripts/
// API reference: https://developers.cloudflare.com/api/operations/worker-script-list-workers
func (api *API) ListWorkers(ctx context.Context, rc *ResourceContainer, params ListWorkersParams) (WorkerListResponse, *ResultInfo, error) {
if rc.Level != AccountRouteLevel {
return WorkerListResponse{}, &ResultInfo{}, ErrRequiredAccountLevelResourceContainer
Expand All @@ -252,7 +258,7 @@

// UploadWorker pushes raw script content for your Worker.
//
// API reference: https://api.cloudflare.com/#worker-script-upload-worker
// API reference: https://developers.cloudflare.com/api/operations/worker-script-upload-worker-module
func (api *API) UploadWorker(ctx context.Context, rc *ResourceContainer, params CreateWorkerParams) (WorkerScriptResponse, error) {
if rc.Level != AccountRouteLevel {
return WorkerScriptResponse{}, ErrRequiredAccountLevelResourceContainer
Expand Down Expand Up @@ -297,6 +303,139 @@
return r, nil
}

// GetScriptContent returns the pure script content of a worker.
//
// API reference: TODO:
func (api *API) GetScriptContent(ctx context.Context, rc *ResourceContainer, scriptName string) (string, error) {

Check failure on line 309 in workers.go

View workflow job for this annotation

GitHub Actions / lint

Comment should end in a period (godot)
echen67 marked this conversation as resolved.
Show resolved Hide resolved
if rc.Level != AccountRouteLevel {
return "", ErrRequiredAccountLevelResourceContainer
}

if rc.Identifier == "" {
return "", ErrMissingAccountID
}

uri := fmt.Sprintf("/accounts/%s/workers/scripts/%s/content/v2", rc.Identifier, scriptName)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the API docs suggest this is just /accounts/:account_id/workers/scripts/:script/content. is that correct?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, technically both work, but /v2 is preferred for this GET endpoint so I'll update the API docs to match. Thanks for catching this!

res, err := api.makeRequestContextWithHeadersComplete(ctx, http.MethodGet, uri, nil, nil)
if err != nil {
return "", err
}

return string(res.Body), nil
}

// PutScriptContent pushes only script content, no metadata.
//
// API reference: TODO:
func (api *API) PutScriptContent(ctx context.Context, rc *ResourceContainer, params CreateWorkerParams) (WorkerScriptResponse, error) {

Check failure on line 330 in workers.go

View workflow job for this annotation

GitHub Actions / lint

Comment should end in a period (godot)
echen67 marked this conversation as resolved.
Show resolved Hide resolved
if rc.Level != AccountRouteLevel {
return WorkerScriptResponse{}, ErrRequiredAccountLevelResourceContainer
}

if rc.Identifier == "" {
return WorkerScriptResponse{}, ErrMissingAccountID
}

body := []byte(params.Script)
var (
contentType = "application/javascript"
err error
)

if params.Module {
contentType, body, err = formatMultipartBody(params)
if err != nil {
return WorkerScriptResponse{}, err
}
}

uri := fmt.Sprintf("/accounts/%s/workers/scripts/%s/content", rc.Identifier, params.ScriptName)
if params.DispatchNamespaceName != nil {
uri = fmt.Sprintf("/accounts/%s/workers/dispatch_namespaces/%s/scripts/%s/content", rc.Identifier, *params.DispatchNamespaceName, params.ScriptName)
}

headers := make(http.Header)
headers.Set("Content-Type", contentType)
res, err := api.makeRequestContextWithHeaders(ctx, http.MethodPut, uri, body, headers)

var r WorkerScriptResponse
if err != nil {
return r, err
}

err = json.Unmarshal(res, &r)
if err != nil {
return r, fmt.Errorf("%s: %w", errUnmarshalError, err)
}

return r, nil
}

// GetScriptSettings returns the metadata of a worker.
//
// API reference: TODO:
func (api *API) GetScriptSettings(ctx context.Context, rc *ResourceContainer, scriptName string) (WorkerScriptSettingsResponse, error) {

Check failure on line 377 in workers.go

View workflow job for this annotation

GitHub Actions / lint

Comment should end in a period (godot)
echen67 marked this conversation as resolved.
Show resolved Hide resolved
if rc.Level != AccountRouteLevel {
return WorkerScriptSettingsResponse{}, ErrRequiredAccountLevelResourceContainer
}

if rc.Identifier == "" {
return WorkerScriptSettingsResponse{}, ErrMissingAccountID
}

uri := fmt.Sprintf("/accounts/%s/workers/scripts/%s/settings", rc.Identifier, scriptName)
res, err := api.makeRequestContextWithHeaders(ctx, http.MethodGet, uri, nil, nil)
var r WorkerScriptSettingsResponse
if err != nil {
return r, err
}

err = json.Unmarshal(res, &r)
if err != nil {
return r, fmt.Errorf("%s: %w", errUnmarshalError, err)
}

r.Success = true

return r, nil
}

// PatchScriptSettings pushes only script metadata.
//
// API reference: TODO:
func (api *API) PatchScriptSettings(ctx context.Context, rc *ResourceContainer, params CreateWorkerParams) (WorkerScriptSettingsResponse, error) {
echen67 marked this conversation as resolved.
Show resolved Hide resolved
if rc.Level != AccountRouteLevel {
return WorkerScriptSettingsResponse{}, ErrRequiredAccountLevelResourceContainer
}

if rc.Identifier == "" {
return WorkerScriptSettingsResponse{}, ErrMissingAccountID
}

body, err := json.Marshal(params)
if err != nil {
return WorkerScriptSettingsResponse{}, err
}
headers := make(http.Header)
headers.Set("Content-Type", "application/json")

uri := fmt.Sprintf("/accounts/%s/workers/scripts/%s/settings", rc.Identifier, params.ScriptName)
res, err := api.makeRequestContextWithHeaders(ctx, http.MethodPatch, uri, body, headers)
var r WorkerScriptSettingsResponse
if err != nil {
return r, err
}

err = json.Unmarshal(res, &r)
if err != nil {
return r, fmt.Errorf("%s: %w", errUnmarshalError, err)
}

r.Success = true

return r, nil
}

// Returns content-type, body, error.
func formatMultipartBody(params CreateWorkerParams) (string, []byte, error) {
var buf = &bytes.Buffer{}
Expand Down
4 changes: 2 additions & 2 deletions workers_account_settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ type WorkersAccountSettingsResponse struct {

// CreateWorkersAccountSettings sets the account settings for Workers.
//
// API reference: https://api.cloudflare.com/#worker-account-settings-create-worker-account-settings
// API reference: https://developers.cloudflare.com/api/operations/worker-account-settings-create-worker-account-settings
func (api *API) CreateWorkersAccountSettings(ctx context.Context, rc *ResourceContainer, params CreateWorkersAccountSettingsParameters) (WorkersAccountSettings, error) {
if rc.Identifier == "" {
return WorkersAccountSettings{}, ErrMissingAccountID
Expand All @@ -57,7 +57,7 @@ func (api *API) CreateWorkersAccountSettings(ctx context.Context, rc *ResourceCo

// WorkersAccountSettings returns the current account settings for Workers.
//
// API reference: https://api.cloudflare.com/#worker-account-settings-fetch-worker-account-settings
// API reference: https://developers.cloudflare.com/api/operations/worker-account-settings-fetch-worker-account-settings
func (api *API) WorkersAccountSettings(ctx context.Context, rc *ResourceContainer, params WorkersAccountSettingsParameters) (WorkersAccountSettings, error) {
if rc.Identifier == "" {
return WorkersAccountSettings{}, ErrMissingAccountID
Expand Down
4 changes: 2 additions & 2 deletions workers_cron_triggers.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ type UpdateWorkerCronTriggersParams struct {
// ListWorkerCronTriggers fetches all available cron triggers for a single Worker
// script.
//
// API reference: https://api.cloudflare.com/#worker-cron-trigger-get-cron-triggers
// API reference: https://developers.cloudflare.com/api/operations/worker-cron-trigger-get-cron-triggers
func (api *API) ListWorkerCronTriggers(ctx context.Context, rc *ResourceContainer, params ListWorkerCronTriggersParams) ([]WorkerCronTrigger, error) {
if rc.Level != AccountRouteLevel {
return []WorkerCronTrigger{}, ErrRequiredAccountLevelResourceContainer
Expand All @@ -65,7 +65,7 @@ func (api *API) ListWorkerCronTriggers(ctx context.Context, rc *ResourceContaine

// UpdateWorkerCronTriggers updates a single schedule for a Worker cron trigger.
//
// API reference: https://api.cloudflare.com/#worker-cron-trigger-update-cron-triggers
// API reference: https://developers.cloudflare.com/api/operations/worker-cron-trigger-update-cron-triggers
func (api *API) UpdateWorkerCronTriggers(ctx context.Context, rc *ResourceContainer, params UpdateWorkerCronTriggersParams) ([]WorkerCronTrigger, error) {
if rc.Level != AccountRouteLevel {
return []WorkerCronTrigger{}, ErrRequiredAccountLevelResourceContainer
Expand Down
8 changes: 4 additions & 4 deletions workers_domain.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ type WorkersDomainListResponse struct {

// ListWorkersDomains lists all Worker Domains.
//
// API reference: https://api.cloudflare.com/#worker-domain-list-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
Expand All @@ -74,7 +74,7 @@ func (api *API) ListWorkersDomains(ctx context.Context, rc *ResourceContainer, p

// AttachWorkersDomain attaches a worker to a zone and hostname.
//
// API reference: https://api.cloudflare.com/#worker-domain-attach-to-domain
// 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
Expand Down Expand Up @@ -112,7 +112,7 @@ func (api *API) AttachWorkersDomain(ctx context.Context, rc *ResourceContainer,

// GetWorkersDomain gets a single Worker Domain.
//
// API reference: https://api.cloudflare.com/#worker-domain-get-a-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
Expand All @@ -134,7 +134,7 @@ func (api *API) GetWorkersDomain(ctx context.Context, rc *ResourceContainer, dom

// DetachWorkersDomain detaches a worker from a zone and hostname.
//
// API reference: https://api.cloudflare.com/#worker-domain-detach-from-domain
// 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
Expand Down
20 changes: 10 additions & 10 deletions workers_kv.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ type ListWorkersKVsParams struct {
// A 400 is returned if the account already owns a namespace with this title.
// A namespace must be explicitly deleted to be replaced.
//
// API reference: https://api.cloudflare.com/#workers-kv-namespace-create-a-namespace
// API reference: https://developers.cloudflare.com/api/operations/workers-kv-namespace-create-a-namespace
func (api *API) CreateWorkersKVNamespace(ctx context.Context, rc *ResourceContainer, params CreateWorkersKVNamespaceParams) (WorkersKVNamespaceResponse, error) {
if rc.Level != AccountRouteLevel {
return WorkersKVNamespaceResponse{}, ErrRequiredAccountLevelResourceContainer
Expand All @@ -129,7 +129,7 @@ func (api *API) CreateWorkersKVNamespace(ctx context.Context, rc *ResourceContai

// ListWorkersKVNamespaces lists storage namespaces.
//
// API reference: https://api.cloudflare.com/#workers-kv-namespace-list-namespaces
// API reference: https://developers.cloudflare.com/api/operations/workers-kv-namespace-list-namespaces
func (api *API) ListWorkersKVNamespaces(ctx context.Context, rc *ResourceContainer, params ListWorkersKVNamespacesParams) ([]WorkersKVNamespace, *ResultInfo, error) {
if rc.Level != AccountRouteLevel {
return []WorkersKVNamespace{}, &ResultInfo{}, ErrRequiredAccountLevelResourceContainer
Expand Down Expand Up @@ -179,7 +179,7 @@ func (api *API) ListWorkersKVNamespaces(ctx context.Context, rc *ResourceContain

// DeleteWorkersKVNamespace deletes the namespace corresponding to the given ID.
//
// API reference: https://api.cloudflare.com/#workers-kv-namespace-remove-a-namespace
// API reference: https://developers.cloudflare.com/api/operations/workers-kv-namespace-remove-a-namespace
func (api *API) DeleteWorkersKVNamespace(ctx context.Context, rc *ResourceContainer, namespaceID string) (Response, error) {
uri := fmt.Sprintf("/accounts/%s/storage/kv/namespaces/%s", rc.Identifier, namespaceID)
res, err := api.makeRequestContext(ctx, http.MethodDelete, uri, nil)
Expand All @@ -197,7 +197,7 @@ func (api *API) DeleteWorkersKVNamespace(ctx context.Context, rc *ResourceContai

// UpdateWorkersKVNamespace modifies a KV namespace based on the ID.
//
// API reference: https://api.cloudflare.com/#workers-kv-namespace-rename-a-namespace
// API reference: https://developers.cloudflare.com/api/operations/workers-kv-namespace-rename-a-namespace
func (api *API) UpdateWorkersKVNamespace(ctx context.Context, rc *ResourceContainer, params UpdateWorkersKVNamespaceParams) (Response, error) {
if rc.Level != AccountRouteLevel {
return Response{}, ErrRequiredAccountLevelResourceContainer
Expand All @@ -223,7 +223,7 @@ func (api *API) UpdateWorkersKVNamespace(ctx context.Context, rc *ResourceContai

// WriteWorkersKVEntry writes a single KV value based on the key.
//
// API reference: https://api.cloudflare.com/#workers-kv-namespace-write-key-value-pair
// API reference: https://developers.cloudflare.com/api/operations/workers-kv-namespace-write-key-value-pair-with-metadata
func (api *API) WriteWorkersKVEntry(ctx context.Context, rc *ResourceContainer, params WriteWorkersKVEntryParams) (Response, error) {
if rc.Level != AccountRouteLevel {
return Response{}, ErrRequiredAccountLevelResourceContainer
Expand Down Expand Up @@ -251,7 +251,7 @@ func (api *API) WriteWorkersKVEntry(ctx context.Context, rc *ResourceContainer,

// WriteWorkersKVEntries writes multiple KVs at once.
//
// API reference: https://api.cloudflare.com/#workers-kv-namespace-write-multiple-key-value-pairs
// API reference: https://developers.cloudflare.com/api/operations/workers-kv-namespace-write-multiple-key-value-pairs
func (api *API) WriteWorkersKVEntries(ctx context.Context, rc *ResourceContainer, params WriteWorkersKVEntriesParams) (Response, error) {
if rc.Level != AccountRouteLevel {
return Response{}, ErrRequiredAccountLevelResourceContainer
Expand Down Expand Up @@ -280,7 +280,7 @@ func (api *API) WriteWorkersKVEntries(ctx context.Context, rc *ResourceContainer
// GetWorkersKV returns the value associated with the given key in the
// given namespace.
//
// API reference: https://api.cloudflare.com/#workers-kv-namespace-read-key-value-pair
// API reference: https://developers.cloudflare.com/api/operations/workers-kv-namespace-read-key-value-pair
func (api API) GetWorkersKV(ctx context.Context, rc *ResourceContainer, params GetWorkersKVParams) ([]byte, error) {
if rc.Level != AccountRouteLevel {
return []byte(``), ErrRequiredAccountLevelResourceContainer
Expand All @@ -299,7 +299,7 @@ func (api API) GetWorkersKV(ctx context.Context, rc *ResourceContainer, params G

// DeleteWorkersKVEntry deletes a key and value for a provided storage namespace.
//
// API reference: https://api.cloudflare.com/#workers-kv-namespace-delete-key-value-pair
// API reference: https://developers.cloudflare.com/api/operations/workers-kv-namespace-delete-key-value-pair
func (api API) DeleteWorkersKVEntry(ctx context.Context, rc *ResourceContainer, params DeleteWorkersKVEntryParams) (Response, error) {
if rc.Level != AccountRouteLevel {
return Response{}, ErrRequiredAccountLevelResourceContainer
Expand All @@ -323,7 +323,7 @@ func (api API) DeleteWorkersKVEntry(ctx context.Context, rc *ResourceContainer,

// DeleteWorkersKVEntries deletes multiple KVs at once.
//
// API reference: https://api.cloudflare.com/#workers-kv-namespace-delete-multiple-key-value-pairs
// API reference: https://developers.cloudflare.com/api/operations/workers-kv-namespace-delete-multiple-key-value-pairs
func (api *API) DeleteWorkersKVEntries(ctx context.Context, rc *ResourceContainer, params DeleteWorkersKVEntriesParams) (Response, error) {
if rc.Level != AccountRouteLevel {
return Response{}, ErrRequiredAccountLevelResourceContainer
Expand All @@ -350,7 +350,7 @@ func (api *API) DeleteWorkersKVEntries(ctx context.Context, rc *ResourceContaine

// ListWorkersKVKeys lists a namespace's keys.
//
// API Reference: https://api.cloudflare.com/#workers-kv-namespace-list-a-namespace-s-keys
// API Reference: https://developers.cloudflare.com/api/operations/workers-kv-namespace-list-a-namespace'-s-keys
func (api API) ListWorkersKVKeys(ctx context.Context, rc *ResourceContainer, params ListWorkersKVsParams) (ListStorageKeysResponse, error) {
if rc.Level != AccountRouteLevel {
return ListStorageKeysResponse{}, ErrRequiredAccountLevelResourceContainer
Expand Down