Skip to content

Commit 522be0e

Browse files
authored
Merge pull request #1508 from WalshyDev/walshy/more-wfp-apis
Add Workers for Platforms APIs
2 parents 0f8bb37 + 464995e commit 522be0e

File tree

7 files changed

+415
-5
lines changed

7 files changed

+415
-5
lines changed

.changelog/1508.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
```release-note:enhancement
2+
workers_for_platforms: Add ability to list Workers for Platforms namespaces, get a namespace, create a new namespace or delete a namespace.
3+
```
4+
5+
```release-note:enhancement
6+
workers: Add Workers for Platforms support for getting a Worker, content and bindings
7+
```

workers.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,14 @@ func (api *API) DeleteWorker(ctx context.Context, rc *ResourceContainer, params
262262
//
263263
// API reference: https://developers.cloudflare.com/api/operations/worker-script-download-worker
264264
func (api *API) GetWorker(ctx context.Context, rc *ResourceContainer, scriptName string) (WorkerScriptResponse, error) {
265+
return api.GetWorkerWithDispatchNamespace(ctx, rc, scriptName, "")
266+
}
267+
268+
// GetWorker fetch raw script content for your worker returns string containing
269+
// worker code js.
270+
//
271+
// API reference: https://developers.cloudflare.com/api/operations/worker-script-download-worker
272+
func (api *API) GetWorkerWithDispatchNamespace(ctx context.Context, rc *ResourceContainer, scriptName string, dispatchNamespace string) (WorkerScriptResponse, error) {
265273
if rc.Level != AccountRouteLevel {
266274
return WorkerScriptResponse{}, ErrRequiredAccountLevelResourceContainer
267275
}
@@ -271,6 +279,9 @@ func (api *API) GetWorker(ctx context.Context, rc *ResourceContainer, scriptName
271279
}
272280

273281
uri := fmt.Sprintf("/accounts/%s/workers/scripts/%s", rc.Identifier, scriptName)
282+
if dispatchNamespace != "" {
283+
uri = fmt.Sprintf("/accounts/%s/workers/dispatch/namespaces/%s/scripts/%s/content", rc.Identifier, dispatchNamespace, scriptName)
284+
}
274285
res, err := api.makeRequestContextWithHeadersComplete(ctx, http.MethodGet, uri, nil, nil)
275286
var r WorkerScriptResponse
276287
if err != nil {
@@ -354,7 +365,7 @@ func (api *API) UploadWorker(ctx context.Context, rc *ResourceContainer, params
354365
}
355366

356367
uri := fmt.Sprintf("/accounts/%s/workers/scripts/%s", rc.Identifier, params.ScriptName)
357-
if params.DispatchNamespaceName != nil {
368+
if params.DispatchNamespaceName != nil && *params.DispatchNamespaceName != "" {
358369
uri = fmt.Sprintf("/accounts/%s/workers/dispatch/namespaces/%s/scripts/%s", rc.Identifier, *params.DispatchNamespaceName, params.ScriptName)
359370
}
360371

workers_bindings.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ const (
4949
)
5050

5151
type ListWorkerBindingsParams struct {
52-
ScriptName string
52+
ScriptName string
53+
DispatchNamespace *string
5354
}
5455

5556
// WorkerBindingListItem a struct representing an individual binding in a list of bindings.
@@ -426,9 +427,9 @@ func (b WorkerD1DatabaseBinding) serialize(bindingName string) (workerBindingMet
426427
}
427428

428429
return workerBindingMeta{
429-
"name": bindingName,
430-
"type": b.Type(),
431-
"id": b.DatabaseID,
430+
"name": bindingName,
431+
"type": b.Type(),
432+
"id": b.DatabaseID,
432433
}, nil, nil
433434
}
434435

@@ -468,6 +469,9 @@ func (api *API) ListWorkerBindings(ctx context.Context, rc *ResourceContainer, p
468469
}
469470

470471
uri := fmt.Sprintf("/accounts/%s/workers/scripts/%s/bindings", rc.Identifier, params.ScriptName)
472+
if params.DispatchNamespace != nil && *params.DispatchNamespace != "" {
473+
uri = fmt.Sprintf("/accounts/%s/workers/dispatch/namespaces/%s/scripts/%s/bindings", rc.Identifier, *params.DispatchNamespace, params.ScriptName)
474+
}
471475

472476
var jsonRes struct {
473477
Response

workers_bindings_test.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,91 @@ func TestListWorkerBindings(t *testing.T) {
108108
assert.Equal(t, WorkerD1DataseBindingType, res.BindingList[8].Binding.Type())
109109
}
110110

111+
func TestListWorkerBindings_Wfp(t *testing.T) {
112+
setup()
113+
defer teardown()
114+
115+
mux.HandleFunc("/accounts/"+testAccountID+"/workers/dispatch/namespaces/my-namespace/scripts/my-script/bindings", func(w http.ResponseWriter, r *http.Request) {
116+
assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
117+
w.Header().Set("content-type", "application/json")
118+
fmt.Fprint(w, listBindingsResponseData)
119+
})
120+
121+
res, err := client.ListWorkerBindings(context.Background(), AccountIdentifier(testAccountID), ListWorkerBindingsParams{
122+
ScriptName: "my-script",
123+
DispatchNamespace: &[]string{"my-namespace"}[0],
124+
})
125+
assert.NoError(t, err)
126+
127+
assert.Equal(t, successResponse, res.Response)
128+
assert.Equal(t, 9, len(res.BindingList))
129+
130+
assert.Equal(t, res.BindingList[0], WorkerBindingListItem{
131+
Name: "MY_KV",
132+
Binding: WorkerKvNamespaceBinding{
133+
NamespaceID: "89f5f8fd93f94cb98473f6f421aa3b65",
134+
},
135+
})
136+
assert.Equal(t, WorkerKvNamespaceBindingType, res.BindingList[0].Binding.Type())
137+
138+
// WASM binding - No binding content endpoint exists for WfP
139+
140+
assert.Equal(t, res.BindingList[2], WorkerBindingListItem{
141+
Name: "MY_PLAIN_TEXT",
142+
Binding: WorkerPlainTextBinding{
143+
Text: "text",
144+
},
145+
})
146+
assert.Equal(t, WorkerPlainTextBindingType, res.BindingList[2].Binding.Type())
147+
148+
assert.Equal(t, res.BindingList[3], WorkerBindingListItem{
149+
Name: "MY_SECRET_TEXT",
150+
Binding: WorkerSecretTextBinding{},
151+
})
152+
assert.Equal(t, WorkerSecretTextBindingType, res.BindingList[3].Binding.Type())
153+
154+
environment := "MY_ENVIRONMENT"
155+
assert.Equal(t, res.BindingList[4], WorkerBindingListItem{
156+
Name: "MY_SERVICE_BINDING",
157+
Binding: WorkerServiceBinding{
158+
Service: "MY_SERVICE",
159+
Environment: &environment,
160+
},
161+
})
162+
assert.Equal(t, WorkerServiceBindingType, res.BindingList[4].Binding.Type())
163+
164+
assert.Equal(t, res.BindingList[5], WorkerBindingListItem{
165+
Name: "MY_NEW_BINDING",
166+
Binding: WorkerInheritBinding{},
167+
})
168+
assert.Equal(t, WorkerInheritBindingType, res.BindingList[5].Binding.Type())
169+
170+
assert.Equal(t, res.BindingList[6], WorkerBindingListItem{
171+
Name: "MY_BUCKET",
172+
Binding: WorkerR2BucketBinding{
173+
BucketName: "bucket",
174+
},
175+
})
176+
assert.Equal(t, WorkerR2BucketBindingType, res.BindingList[6].Binding.Type())
177+
178+
assert.Equal(t, res.BindingList[7], WorkerBindingListItem{
179+
Name: "MY_DATASET",
180+
Binding: WorkerAnalyticsEngineBinding{
181+
Dataset: "my_dataset",
182+
},
183+
})
184+
185+
assert.Equal(t, WorkerAnalyticsEngineBindingType, res.BindingList[7].Binding.Type())
186+
187+
assert.Equal(t, res.BindingList[8], WorkerBindingListItem{
188+
Name: "MY_DATABASE",
189+
Binding: WorkerD1DatabaseBinding{
190+
DatabaseID: "cef5331f-e5c7-4c8a-a415-7908ae45f92a",
191+
},
192+
})
193+
assert.Equal(t, WorkerD1DataseBindingType, res.BindingList[8].Binding.Type())
194+
}
195+
111196
func ExampleUnsafeBinding() {
112197
pretty := func(meta workerBindingMeta) string {
113198
buf := bytes.NewBufferString("")

workers_for_platforms.go

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package cloudflare
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/http"
7+
"time"
8+
9+
"github.com/goccy/go-json"
10+
)
11+
12+
type WorkersForPlatformsDispatchNamespace struct {
13+
NamespaceId string `json:"namespace_id"`
14+
NamespaceName string `json:"namespace_name"`
15+
CreatedOn *time.Time `json:"created_on,omitempty"`
16+
CreatedBy string `json:"created_by"`
17+
ModifiedOn *time.Time `json:"modified_on,omitempty"`
18+
ModifiedBy string `json:"modified_by"`
19+
}
20+
21+
type ListWorkersForPlatformsDispatchNamespaceResponse struct {
22+
Response
23+
Result []WorkersForPlatformsDispatchNamespace `json:"result"`
24+
}
25+
26+
type GetWorkersForPlatformsDispatchNamespaceResponse struct {
27+
Response
28+
Result WorkersForPlatformsDispatchNamespace `json:"result"`
29+
}
30+
31+
type CreateWorkersForPlatformsDispatchNamespaceParams struct {
32+
Name string `json:"name"`
33+
}
34+
35+
// ListWorkersForPlatformsDispatchNamespaces lists the dispatch namespaces.
36+
//
37+
// API reference: https://developers.cloudflare.com/api/operations/namespace-worker-list
38+
func (api *API) ListWorkersForPlatformsDispatchNamespaces(ctx context.Context, rc *ResourceContainer) (*ListWorkersForPlatformsDispatchNamespaceResponse, error) {
39+
if rc.Level != AccountRouteLevel {
40+
return nil, ErrRequiredAccountLevelResourceContainer
41+
}
42+
43+
if rc.Identifier == "" {
44+
return nil, ErrMissingAccountID
45+
}
46+
47+
uri := fmt.Sprintf("/accounts/%s/workers/dispatch/namespaces", rc.Identifier)
48+
res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
49+
50+
var r ListWorkersForPlatformsDispatchNamespaceResponse
51+
if err != nil {
52+
return nil, err
53+
}
54+
55+
err = json.Unmarshal(res, &r)
56+
if err != nil {
57+
return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
58+
}
59+
60+
return &r, nil
61+
}
62+
63+
// GetWorkersForPlatformsDispatchNamespace gets a specific dispatch namespace.
64+
//
65+
// API reference: https://developers.cloudflare.com/api/operations/namespace-worker-get-namespace
66+
func (api *API) GetWorkersForPlatformsDispatchNamespace(ctx context.Context, rc *ResourceContainer, name string) (*GetWorkersForPlatformsDispatchNamespaceResponse, error) {
67+
if rc.Level != AccountRouteLevel {
68+
return nil, ErrRequiredAccountLevelResourceContainer
69+
}
70+
71+
if rc.Identifier == "" {
72+
return nil, ErrMissingAccountID
73+
}
74+
75+
uri := fmt.Sprintf("/accounts/%s/workers/dispatch/namespaces/%s", rc.Identifier, name)
76+
res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
77+
78+
var r GetWorkersForPlatformsDispatchNamespaceResponse
79+
if err != nil {
80+
return nil, err
81+
}
82+
83+
err = json.Unmarshal(res, &r)
84+
if err != nil {
85+
return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
86+
}
87+
88+
return &r, nil
89+
}
90+
91+
// CreateWorkersForPlatformsDispatchNamespace creates a new dispatch namespace.
92+
//
93+
// API reference: https://developers.cloudflare.com/api/operations/namespace-worker-create
94+
func (api *API) CreateWorkersForPlatformsDispatchNamespace(ctx context.Context, rc *ResourceContainer, params CreateWorkersForPlatformsDispatchNamespaceParams) (*GetWorkersForPlatformsDispatchNamespaceResponse, error) {
95+
if rc.Level != AccountRouteLevel {
96+
return nil, ErrRequiredAccountLevelResourceContainer
97+
}
98+
99+
if rc.Identifier == "" {
100+
return nil, ErrMissingAccountID
101+
}
102+
103+
uri := fmt.Sprintf("/accounts/%s/workers/dispatch/namespaces", rc.Identifier)
104+
res, err := api.makeRequestContext(ctx, http.MethodPost, uri, params)
105+
106+
var r GetWorkersForPlatformsDispatchNamespaceResponse
107+
if err != nil {
108+
return nil, err
109+
}
110+
111+
err = json.Unmarshal(res, &r)
112+
if err != nil {
113+
return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
114+
}
115+
116+
return &r, nil
117+
}
118+
119+
// DeleteWorkersForPlatformsDispatchNamespace deletes a dispatch namespace.
120+
//
121+
// API reference: https://developers.cloudflare.com/api/operations/namespace-worker-delete-namespace
122+
func (api *API) DeleteWorkersForPlatformsDispatchNamespace(ctx context.Context, rc *ResourceContainer, name string) error {
123+
if rc.Level != AccountRouteLevel {
124+
return ErrRequiredAccountLevelResourceContainer
125+
}
126+
127+
if rc.Identifier == "" {
128+
return ErrMissingAccountID
129+
}
130+
131+
uri := fmt.Sprintf("/accounts/%s/workers/dispatch/namespaces/%s", rc.Identifier, name)
132+
_, err := api.makeRequestContext(ctx, http.MethodDelete, uri, nil)
133+
134+
if err != nil {
135+
return err
136+
}
137+
138+
return nil
139+
}

0 commit comments

Comments
 (0)