From 5fd4f163ee27e951f62ca3cd125dd9c4cd8d485c Mon Sep 17 00:00:00 2001 From: danischm Date: Sun, 29 Sep 2024 22:43:43 +0200 Subject: [PATCH] Add pagination support if items in response --- client.go | 12 +++++++++++- client_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/client.go b/client.go index 53df34e..bc35574 100644 --- a/client.go +++ b/client.go @@ -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 { @@ -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"), ",") diff --git a/client_test.go b/client_test.go index 82b8665..56de3d1 100644 --- a/client_test.go +++ b/client_test.go @@ -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()