diff --git a/README.md b/README.md index 4647997..1eb6c3c 100644 --- a/README.md +++ b/README.md @@ -221,7 +221,65 @@ func main() { fmt.Printf("Status after transition: %+v\n", issue.Fields.Status.Name) } ``` +### Get all the issues for JQL with Pagination +Jira API has limit on maxResults it can return. YOu may have a usecase where you need to get all issues for given JQL. +This example shows reference implementation of GetAllIssues function which does pagination on Jira API to get all the issues for given JQL +```go +package main +import ( + "fmt" + + jira "github.com/andygrunwald/go-jira" +) + +//GetAllIssues takes a jira client and returns all issues for given JQL +func GetAllIssues(client *jira.Client, searchString string) ([]jira.Issue, error) { + last := 0 + var issues []jira.Issue = nil + for { + opt := &jira.SearchOptions{ + MaxResults: 100, + StartAt: last, + } + + chunk, resp, err := client.Issue.Search(searchString, opt) + if err != nil { + return nil, err + } + + total := resp.Total + if issues == nil { + issues = make([]jira.Issue, 0, total) + } + issues = append(issues, chunk...) + last = resp.StartAt + len(chunk) + if last >= total { + break + } + } + return issues, nil +} + +func main() { + jiraClient, _ := jira.NewClient(nil, "https://issues.apache.org/jira/") + + // Jira API has limitation as to maxResults it can return at one time. + // You may have usecase where you need to get all the issues according to jql + // This is where this example comes in. + jql := "project = Mesos and type = Bug and Status NOT IN (Resolved)" + fmt.Printf("Usecase: Running a JQL query '%s'\n", jql) + + issues, err := GetAllIssues(jiraClient, jql) + if err != nil { + panic(err) + } + fmt.Println(issues) + +} + + +``` ### Call a not implemented API endpoint Not all API endpoints of the Jira API are implemented into *go-jira*. diff --git a/examples/pagination/main.go b/examples/pagination/main.go new file mode 100644 index 0000000..8fc8976 --- /dev/null +++ b/examples/pagination/main.go @@ -0,0 +1,52 @@ +package main + +import ( + "fmt" + + jira "github.com/andygrunwald/go-jira" +) + +//GetAllIssues takes a jira client and returns all issues for given JQL +func GetAllIssues(client *jira.Client, searchString string) ([]jira.Issue, error) { + last := 0 + var issues []jira.Issue = nil + for { + opt := &jira.SearchOptions{ + MaxResults: 100, + StartAt: last, + } + + chunk, resp, err := client.Issue.Search(searchString, opt) + if err != nil { + return nil, err + } + + total := resp.Total + if issues == nil { + issues = make([]jira.Issue, 0, total) + } + issues = append(issues, chunk...) + last = resp.StartAt + len(chunk) + if last >= total { + break + } + } + return issues, nil +} + +func main() { + jiraClient, _ := jira.NewClient(nil, "https://issues.apache.org/jira/") + + // Jira API has limitation as to maxResults it can return at one time. + // You may have usecase where you need to get all the issues according to jql + // This is where this example comes in. + jql := "project = Mesos and type = Bug and Status NOT IN (Resolved)" + fmt.Printf("Usecase: Running a JQL query '%s'\n", jql) + + issues, err := GetAllIssues(jiraClient, jql) + if err != nil { + panic(err) + } + fmt.Println(issues) + +}