Skip to content

Commit

Permalink
Add pagination support if items in response
Browse files Browse the repository at this point in the history
  • Loading branch information
danischm committed Sep 29, 2024
1 parent 500ad2a commit 5fd4f16
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
12 changes: 11 additions & 1 deletion client.go
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,7 @@ func (client *Client) Do(req Req) (Res, error) {
// Results will be the raw data structure as returned by Meraki API
func (client *Client) Get(path string, mods ...func(*Req)) (Res, error) {
r := ""
hasItems := false
for {
response, err := client.get(path, mods...)
if err != nil {
Expand All @@ -335,8 +336,17 @@ func (client *Client) Get(path string, mods ...func(*Req)) (Res, error) {
return response, nil
}

if response.Get("items").Exists() {
hasItems = true
response = Res{Result: response.Get("items"), Header: response.Header}
}

for _, item := range response.Array() {
r, _ = sjson.SetRaw(r, "response.-1", item.Raw)
if hasItems {
r, _ = sjson.SetRaw(r, "response.items.-1", item.Raw)
} else {
r, _ = sjson.SetRaw(r, "response.-1", item.Raw)
}
}

links := strings.Split(response.Header.Get("Link"), ",")
Expand Down
24 changes: 24 additions & 0 deletions client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,30 @@ func TestClientGetPages(t *testing.T) {
assert.Equal(t, `["1","2","3","4","5","6","7","8"]`, res.Raw)
}

// TestClientGetPages is like TestClientGet, but with basic pagination and "items" response.
func TestClientGetPagesItems(t *testing.T) {
defer gock.Off()
client := testClient()
var err error

gock.New(client.BaseUrl).Get("/url").
Reply(200).
BodyString(`{"items": ["1","2","3"]}`).
Header.Set("Link", `<`+client.BaseUrl+`/url?offset=4>; rel="next"`)
gock.New(client.BaseUrl).Get("/url").MatchParam("offset", "4").
Reply(200).
BodyString(`{"items": ["4","5","6"]}`).
Header.Set("Link", `<`+client.BaseUrl+`/url?offset=7>; rel="next"`)
gock.New(client.BaseUrl).Get("/url").MatchParam("offset", "7").
Reply(200).
BodyString(`{"items": ["7","8"]}`).
Header.Set("Link", `<`+client.BaseUrl+`/url?offset=1>; rel="first"`)

res, err := client.Get("/url")
assert.NoError(t, err)
assert.Equal(t, `{"items":["1","2","3","4","5","6","7","8"]}`, res.Raw)
}

// TestClientDelete tests the Client::Delete method.
func TestClientDelete(t *testing.T) {
defer gock.Off()
Expand Down

0 comments on commit 5fd4f16

Please sign in to comment.