121 lines
2.2 KiB
Go
121 lines
2.2 KiB
Go
package client
|
|
|
|
import "fmt"
|
|
import "net/url"
|
|
import "strings"
|
|
|
|
import "cloud.google.com/go/civil"
|
|
|
|
type SearchQuery struct {
|
|
SectionsAny []*Section
|
|
Completed *bool
|
|
Due *bool
|
|
DueOn *civil.Date
|
|
DueBefore *civil.Date
|
|
DueAfter *civil.Date
|
|
TagsAny []*Tag
|
|
TagsNot []*Tag
|
|
}
|
|
|
|
var _TRUE = true
|
|
var TRUE = &_TRUE
|
|
var _FALSE = false
|
|
var FALSE = &_FALSE
|
|
|
|
func (wc *WorkspaceClient) Search(q *SearchQuery) ([]*Task, error) {
|
|
path := fmt.Sprintf("workspaces/%s/tasks/search", wc.workspace.GID)
|
|
|
|
values := &url.Values{
|
|
"sort_by": []string{"created_at"},
|
|
"sort_ascending": []string{"true"},
|
|
}
|
|
|
|
values.Add("opt_fields", "created_at,due_on,html_notes,name")
|
|
|
|
if len(q.SectionsAny) > 0 {
|
|
gids := []string{}
|
|
for _, sec := range q.SectionsAny {
|
|
gids = append(gids, sec.GID)
|
|
}
|
|
values.Add("sections.any", strings.Join(gids, ","))
|
|
}
|
|
|
|
if q.Completed != nil {
|
|
values.Add("completed", fmt.Sprintf("%t", *q.Completed))
|
|
}
|
|
|
|
if q.Due != nil {
|
|
if *q.Due {
|
|
values.Add("due_on.after", "1970-01-01")
|
|
} else {
|
|
values.Add("due_on", "null")
|
|
}
|
|
}
|
|
|
|
if q.DueOn != nil {
|
|
values.Add("due_on", q.DueOn.String())
|
|
}
|
|
|
|
if q.DueBefore != nil {
|
|
values.Add("due_on.before", q.DueBefore.String())
|
|
}
|
|
|
|
if q.DueAfter != nil {
|
|
values.Add("due_on.after", q.DueAfter.String())
|
|
}
|
|
|
|
if len(q.TagsAny) > 0 {
|
|
gids := []string{}
|
|
for _, sec := range q.TagsAny {
|
|
gids = append(gids, sec.GID)
|
|
}
|
|
values.Add("tags.any", strings.Join(gids, ","))
|
|
}
|
|
|
|
if len(q.TagsNot) > 0 {
|
|
gids := []string{}
|
|
for _, sec := range q.TagsNot {
|
|
gids = append(gids, sec.GID)
|
|
}
|
|
values.Add("tags.not", strings.Join(gids, ","))
|
|
}
|
|
|
|
tasksByGID := map[string]*Task{}
|
|
|
|
for {
|
|
resp := &tasksResponse{}
|
|
wc.rateLimitSearch.Acquire1()
|
|
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)
|
|
}
|
|
|
|
tasks := []*Task{}
|
|
for _, task := range tasksByGID {
|
|
tasks = append(tasks, task)
|
|
}
|
|
|
|
return tasks, nil
|
|
}
|