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

add support for cache reserve #1278

Merged
merged 4 commits into from
May 15, 2023
Merged
Show file tree
Hide file tree
Changes from all 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
3 changes: 3 additions & 0 deletions .changelog/1278.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
zone: Added `GetCacheReserve` and `UpdateacheReserve` to allow setting Cache Reserve for a zone.
```
82 changes: 82 additions & 0 deletions cache_reserve.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package cloudflare

import (
"context"
"encoding/json"
"fmt"
"net/http"
"time"
)

// CacheReserve is the structure of the API object for the cache reserve
// setting.
type CacheReserve struct {
ID string `json:"id,omitempty"`
ModifiedOn time.Time `json:"modified_on,omitempty"`
Value string `json:"value"`
}

// CacheReserveDetailsResponse is the API response for the cache reserve
// setting.
type CacheReserveDetailsResponse struct {
Result CacheReserve `json:"result"`
Response
}

type zoneCacheReserveSingleResponse struct {
Response
Result CacheReserve `json:"result"`
}

type GetCacheReserveParams struct{}

type UpdateCacheReserveParams struct {
Value string `json:"value"`
}

// GetCacheReserve returns information about the current cache reserve settings.
//
// API reference: https://developers.cloudflare.com/api/operations/zone-cache-settings-get-cache-reserve-setting
func (api *API) GetCacheReserve(ctx context.Context, rc *ResourceContainer, params GetCacheReserveParams) (CacheReserve, error) {
if rc.Level != ZoneRouteLevel {
return CacheReserve{}, ErrRequiredZoneLevelResourceContainer
}

uri := fmt.Sprintf("/%s/%s/cache/cache_reserve", rc.Level, rc.Identifier)

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

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

// UpdateCacheReserve updates the cache reserve setting for a zone
//
// API reference: https://developers.cloudflare.com/api/operations/zone-cache-settings-change-cache-reserve-setting
func (api *API) UpdateCacheReserve(ctx context.Context, rc *ResourceContainer, params UpdateCacheReserveParams) (CacheReserve, error) {
if rc.Level != ZoneRouteLevel {
return CacheReserve{}, ErrRequiredZoneLevelResourceContainer
}

uri := fmt.Sprintf("/%s/%s/cache/cache_reserve", rc.Level, rc.Identifier)

res, err := api.makeRequestContext(ctx, http.MethodPatch, uri, params)
if err != nil {
return CacheReserve{}, err
}

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

return response.Result, nil
}
82 changes: 82 additions & 0 deletions cache_reserve_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package cloudflare

import (
"context"
"fmt"
"net/http"
"testing"
"time"

"github.com/stretchr/testify/assert"
)

var cacheReserveTimestampString = "2019-02-20T22:37:07.107449Z"
var cacheReserveTimestamp, _ = time.Parse(time.RFC3339Nano, cacheReserveTimestampString)

func TestCacheReserve(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": {
"id": "cache_reserve",
"value": "on",
"modified_on": "%s"
}
}
`, cacheReserveTimestampString)
}

mux.HandleFunc("/zones/01a7362d577a6c3019a474fd6f485823/cache/cache_reserve", handler)
want := CacheReserve{
ID: "cache_reserve",
Value: "on",
ModifiedOn: cacheReserveTimestamp,
}

actual, err := client.GetCacheReserve(context.Background(), ZoneIdentifier("01a7362d577a6c3019a474fd6f485823"), GetCacheReserveParams{})

if assert.NoError(t, err) {
assert.Equal(t, want, actual)
}
}

func TestUpdateCacheReserve(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": {
"id": "cache_reserve",
"value": "off",
"modified_on": "%s"
}
}
`, cacheReserveTimestampString)
}

mux.HandleFunc("/zones/01a7362d577a6c3019a474fd6f485823/cache/cache_reserve", handler)
want := CacheReserve{
ID: "cache_reserve",
Value: "off",
ModifiedOn: cacheReserveTimestamp,
}

actual, err := client.UpdateCacheReserve(context.Background(), ZoneIdentifier("01a7362d577a6c3019a474fd6f485823"), UpdateCacheReserveParams{Value: "off"})

if assert.NoError(t, err) {
assert.Equal(t, want, actual)
}
}