From 0c62837040921d7370f718e49355c630f3c63463 Mon Sep 17 00:00:00 2001 From: Piper McCorkle Date: Thu, 4 May 2023 16:03:56 -0500 Subject: [PATCH] WR-1279 add waiting room zone-level settings --- .changelog/1277.txt | 3 ++ waiting_room.go | 71 ++++++++++++++++++++++++++++++++++ waiting_room_test.go | 91 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 165 insertions(+) create mode 100644 .changelog/1277.txt diff --git a/.changelog/1277.txt b/.changelog/1277.txt new file mode 100644 index 000000000000..713898c8dbb5 --- /dev/null +++ b/.changelog/1277.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +waiting_room: add support for zone-level settings +``` diff --git a/waiting_room.go b/waiting_room.go index a60b5028e345..35bbb34a4f55 100644 --- a/waiting_room.go +++ b/waiting_room.go @@ -76,6 +76,18 @@ type WaitingRoomRule struct { Enabled *bool `json:"enabled"` } +// WaitingRoomSettings describes zone-level waiting room settings. +type WaitingRoomSettings struct { + // Whether to allow verified search engine crawlers to bypass all waiting rooms on this zone + SearchEngineCrawlerBypass bool `json:"search_engine_crawler_bypass"` +} + +// WaitingRoomSettingsPatch describes zone-level waiting room settings, with optional fields. +type WaitingRoomSettingsPatch struct { + // Whether to allow verified search engine crawlers to bypass all waiting rooms on this zone + SearchEngineCrawlerBypass *bool `json:"search_engine_crawler_bypass,omitempty"` +} + // WaitingRoomPagePreviewURL describes a WaitingRoomPagePreviewURL object. type WaitingRoomPagePreviewURL struct { PreviewURL string `json:"preview_url"` @@ -98,6 +110,12 @@ type WaitingRoomsResponse struct { Result []WaitingRoom `json:"result"` } +// WaitingRoomSettingsResponse is the API response, containing zone-level Waiting Room settings. +type WaitingRoomSettingsResponse struct { + Response + Result WaitingRoomSettings `json:"result"` +} + // WaitingRoomStatusResponse is the API response, containing the status of a waiting room. type WaitingRoomStatusResponse struct { Response @@ -532,3 +550,56 @@ func (api *API) DeleteWaitingRoomRule(ctx context.Context, rc *ResourceContainer return r.Result, nil } + +// WaitingRoomSettings fetches the Waiting Room zone-level settings for a zone. +// +// API reference: https://api.cloudflare.com/#waiting-room-get-zone-settings +func (api *API) WaitingRoomSettings(ctx context.Context, zoneID string) (WaitingRoomSettings, error) { + uri := fmt.Sprintf("/zones/%s/waiting_rooms/settings", zoneID) + res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil) + if err != nil { + return WaitingRoomSettings{}, err + } + var r WaitingRoomSettingsResponse + err = json.Unmarshal(res, &r) + if err != nil { + return WaitingRoomSettings{}, fmt.Errorf("%s: %w", errUnmarshalError, err) + } + return r.Result, nil +} + +// ChangeWaitingRoomSettings lets you change individual zone-level Waiting Room settings. This is +// in contrast to UpdateWaitingRoomSettings which replaces all settings. +// +// API reference: https://api.cloudflare.com/#waiting-room-patch-zone-settings +func (api *API) ChangeWaitingRoomSettings(ctx context.Context, zoneID string, settings WaitingRoomSettingsPatch) (WaitingRoomSettings, error) { + uri := fmt.Sprintf("/zones/%s/waiting_rooms/settings", zoneID) + res, err := api.makeRequestContext(ctx, http.MethodPatch, uri, settings) + if err != nil { + return WaitingRoomSettings{}, err + } + var r WaitingRoomSettingsResponse + err = json.Unmarshal(res, &r) + if err != nil { + return WaitingRoomSettings{}, fmt.Errorf("%s: %w", errUnmarshalError, err) + } + return r.Result, nil +} + +// UpdateWaitingRoomSettings lets you replace all zone-level Waiting Room settings. This is in contrast to +// ChangeWaitingRoomSettings which lets you change individual settings. +// +// API reference: https://api.cloudflare.com/#waiting-room-update-zone-settings +func (api *API) UpdateWaitingRoomSettings(ctx context.Context, zoneID string, settings WaitingRoomSettings) (WaitingRoomSettings, error) { + uri := fmt.Sprintf("/zones/%s/waiting_rooms/settings", zoneID) + res, err := api.makeRequestContext(ctx, http.MethodPut, uri, settings) + if err != nil { + return WaitingRoomSettings{}, err + } + var r WaitingRoomSettingsResponse + err = json.Unmarshal(res, &r) + if err != nil { + return WaitingRoomSettings{}, fmt.Errorf("%s: %w", errUnmarshalError, err) + } + return r.Result, nil +} diff --git a/waiting_room_test.go b/waiting_room_test.go index 902510305d5a..6a0a9d9db3fe 100644 --- a/waiting_room_test.go +++ b/waiting_room_test.go @@ -11,6 +11,8 @@ import ( "github.com/stretchr/testify/assert" ) +var t = true + var waitingRoomID = "699d98642c564d2e855e9661899b7252" var waitingRoomEventID = "25756b2dfe6e378a06b033b670413757" var waitingRoomRuleID = "25756b2dfe6e378a06b033b670413757" @@ -97,6 +99,12 @@ var waitingRoomPagePreviewJSON = ` } ` +var waitingRoomSettingsJSON = ` + { + "search_engine_crawler_bypass": true + } + ` + var waitingRoom = WaitingRoom{ ID: waitingRoomID, CreatedOn: testTimestampWaitingRoom, @@ -160,6 +168,14 @@ var waitingRoomRule = WaitingRoomRule{ LastUpdated: &testTimestampWaitingRoom, } +var waitingRoomSettings = WaitingRoomSettings{ + SearchEngineCrawlerBypass: true, +} + +var waitingRoomSettingsPatch = WaitingRoomSettingsPatch{ + SearchEngineCrawlerBypass: &t, +} + func TestListWaitingRooms(t *testing.T) { setup() defer teardown() @@ -785,3 +801,78 @@ func TestReplaceWaitingRoomRules(t *testing.T) { assert.Equal(t, want, actual) } } + +func TestWaitingRoomSettings(t *testing.T) { + setup() + defer teardown() + + handler := func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) + w.Header().Set("content-type", "application/json") + fmt.Fprintf(w, `{ + "success": true, + "errors": [], + "messages": [], + "result": %s + } + `, waitingRoomSettingsJSON) + } + + mux.HandleFunc("/zones/"+testZoneID+"/waiting_rooms/settings", handler) + want := waitingRoomSettings + + actual, err := client.WaitingRoomSettings(context.Background(), testZoneID) + if assert.NoError(t, err) { + assert.Equal(t, want, actual) + } +} + +func TestUpdateWaitingRoomSettings(t *testing.T) { + setup() + defer teardown() + + handler := func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodPut, r.Method, "Expected method 'PUT', got %s", r.Method) + w.Header().Set("content-type", "application/json") + fmt.Fprintf(w, `{ + "success": true, + "errors": [], + "messages": [], + "result": %s + } + `, waitingRoomSettingsJSON) + } + + mux.HandleFunc("/zones/"+testZoneID+"/waiting_rooms/settings", handler) + want := waitingRoomSettings + + actual, err := client.UpdateWaitingRoomSettings(context.Background(), testZoneID, waitingRoomSettings) + if assert.NoError(t, err) { + assert.Equal(t, want, actual) + } +} + +func TestChangeWaitingRoomSettings(t *testing.T) { + setup() + defer teardown() + + handler := func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodPatch, r.Method, "Expected method 'PATCH', got %s", r.Method) + w.Header().Set("content-type", "application/json") + fmt.Fprintf(w, `{ + "success": true, + "errors": [], + "messages": [], + "result": %s + } + `, waitingRoomSettingsJSON) + } + + mux.HandleFunc("/zones/"+testZoneID+"/waiting_rooms/settings", handler) + want := waitingRoomSettings + + actual, err := client.ChangeWaitingRoomSettings(context.Background(), testZoneID, waitingRoomSettingsPatch) + if assert.NoError(t, err) { + assert.Equal(t, want, actual) + } +}