From 31985ee5c66816fb6d81660c26a735a6c169cac4 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Wed, 22 Sep 2021 03:22:04 +0000 Subject: [PATCH] Support pagination --- client/client.go | 4 +++- client/workspaceclient.go | 46 ++++++++++++++++++++++++++++++--------- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/client/client.go b/client/client.go index f41d41b..25cc336 100644 --- a/client/client.go +++ b/client/client.go @@ -23,6 +23,8 @@ type workspacesResponse struct { Data []*workspace `json:"data"` } +const perPage = 100 + func NewClient(token string) *Client { c := &Client{ client: &http.Client{}, @@ -81,7 +83,7 @@ func (c *Client) get(path string, values *url.Values, out interface{}) error { if values == nil { values = &url.Values{} } - values.Add("limit", "100") + values.Set("limit", fmt.Sprintf("%d", perPage)) url := fmt.Sprintf("%s%s?%s", baseURL, path, values.Encode()) diff --git a/client/workspaceclient.go b/client/workspaceclient.go index 47d29f6..5c4ce56 100644 --- a/client/workspaceclient.go +++ b/client/workspaceclient.go @@ -46,6 +46,7 @@ type Tag struct { type Task struct { GID string `json:"gid,omitempty"` Name string `json:"name,omitempty"` + CreatedAt string `json:"created_at,omitempty"` DueOn string `json:"due_on,omitempty"` ParsedDueOn *civil.Date `json:"-"` HTMLNotes string `json:"html_notes,omitempty"` @@ -243,9 +244,12 @@ func (wc *WorkspaceClient) GetMyUserTaskList() (*Project, error) { func (wc *WorkspaceClient) Search(q *SearchQuery) ([]*Task, error) { path := fmt.Sprintf("workspaces/%s/tasks/search", wc.workspace.GID) - values := &url.Values{} + values := &url.Values{ + "sort_by": []string{"created_at"}, + "sort_ascending": []string{"true"}, + } - values.Add("opt_fields", "due_on,html_notes,name") + values.Add("opt_fields", "created_at,due_on,html_notes,name") if len(q.SectionsAny) > 0 { gids := []string{} @@ -295,20 +299,42 @@ func (wc *WorkspaceClient) Search(q *SearchQuery) ([]*Task, error) { values.Add("tags.not", strings.Join(gids, ",")) } - resp := &tasksResponse{} - err := wc.client.get(path, values, resp) - if err != nil { - return nil, err - } + tasksByGID := map[string]*Task{} - for _, task := range resp.Data { - err := task.parse() + for { + resp := &tasksResponse{} + err := wc.client.get(path, values, resp) if err != nil { return nil, err } + + maxCreatedAt := "" + + for _, task := range resp.Data { + err := task.parse() + if err != nil { + return nil, err + } + tasksByGID[task.GID] = task + + if task.CreatedAt > maxCreatedAt { + maxCreatedAt = task.CreatedAt + } + } + + if len(resp.Data) < perPage { + break + } + + values.Set("created_at.after", maxCreatedAt) } - return resp.Data, nil + tasks := []*Task{} + for _, task := range tasksByGID { + tasks = append(tasks, task) + } + + return tasks, nil } func (wc *WorkspaceClient) UpdateTask(task *Task) error {