@@ -527,6 +527,63 @@ type SearchOptions struct {
527
527
ValidateQuery string `url:"validateQuery,omitempty"`
528
528
}
529
529
530
+ // SearchOptionsV3 specifies the parameters for the Jira Cloud-specific
531
+ // paramaters to List methods that support pagination
532
+ //
533
+ // Docs: https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-search/#api-rest-api-3-search-jql-get
534
+ type SearchOptionsV3 struct {
535
+ // NextPageToken: The token for a page to fetch that is not the first page.
536
+ // The first page has a nextPageToken of null.
537
+ // Use the nextPageToken to fetch the next page of issues.
538
+ // Note: The nextPageToken field is not included in the response for the last page,
539
+ // indicating there is no next page.
540
+ NextPageToken string `url:"nextPageToken,omitempty"`
541
+
542
+ // MaxResults: The maximum number of items to return per page.
543
+ // To manage page size, API may return fewer items per page where a large number of fields or properties are requested.
544
+ // The greatest number of items returned per page is achieved when requesting id or key only.
545
+ // It returns max 5000 issues.
546
+ // Default: 50
547
+ MaxResults int `url:"maxResults,omitempty"`
548
+
549
+ // Fields: A list of fields to return for each issue
550
+
551
+ // Fields: A list of fields to return for each issue, use it to retrieve a subset of fields.
552
+ // This parameter accepts a comma-separated list. Expand options include:
553
+ //
554
+ // `*all` Returns all fields.
555
+ // `*navigable` Returns navigable fields.
556
+ // `id` Returns only issue IDs.
557
+ // Any issue field, prefixed with a minus to exclude.
558
+ //
559
+ // The default is id.
560
+ //
561
+ // Examples:
562
+ //
563
+ // `summary,comment` Returns only the summary and comments fields only.
564
+ // `-description` Returns all navigable (default) fields except description.
565
+ // `*all,-comment` Returns all fields except comments.
566
+ //
567
+ // Multiple `fields` parameters can be included in a request.
568
+ //
569
+ // Note: By default, this resource returns IDs only. This differs from GET issue where the default is all fields.
570
+ Fields []string
571
+
572
+ // Expand: Use expand to include additional information about issues in the response.
573
+ // TODO add proper docs, see https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-search/#api-rest-api-3-search-jql-get
574
+ Expand string `url:"expand,omitempty"`
575
+ // A list of up to 5 issue properties to include in the results
576
+ Properties []string `url:"properties,omitempty"`
577
+ // FieldsByKeys: Reference fields by their key (rather than ID).
578
+ // The default is false.
579
+ FieldsByKeys bool `url:"fieldsByKeys,omitempty"`
580
+ // FailFast: Fail this request early if we can't retrieve all field data.
581
+ // Default false.
582
+ FailFast bool `url:"failFast,omitempty"`
583
+ // ReconcileIssues: Strong consistency issue ids to be reconciled with search results. Accepts max 50 ids
584
+ ReconcileIssues []int `url:"reconcileIssues,omitempty"`
585
+ }
586
+
530
587
// searchResult is only a small wrapper around the Search (with JQL) method
531
588
// to be able to parse the results
532
589
type searchResult struct {
@@ -536,6 +593,24 @@ type searchResult struct {
536
593
Total int `json:"total" structs:"total"`
537
594
}
538
595
596
+ // searchResult is only a small wrapper around the Jira Cloud-specific SearchV3 (with JQL) method
597
+ // to be able to parse the results
598
+ type searchResultV3 struct {
599
+ // IsLast: Indicates whether this is the last page of the paginated response.
600
+ IsLast bool `json:"isLast" structs:"isLast"`
601
+ // Issues: The list of issues found by the search or reconsiliation.
602
+ Issues []Issue `json:"issues" structs:"issues"`
603
+
604
+ // TODO Missing
605
+ // Field names object
606
+ // Field schema object
607
+
608
+ // NextPageToken: Continuation token to fetch the next page.
609
+ // If this result represents the last or the only page this token will be null.
610
+ // This token will expire in 7 days.
611
+ NextPageToken string `json:"nextPageToken" structs:"nextPageToken"`
612
+ }
613
+
539
614
// GetQueryOptions specifies the optional parameters for the Get Issue methods
540
615
type GetQueryOptions struct {
541
616
// Fields is the list of fields to return for the issue. By default, all fields are returned.
@@ -1134,6 +1209,79 @@ func (s *IssueService) Search(jql string, options *SearchOptions) ([]Issue, *Res
1134
1209
return s .SearchWithContext (context .Background (), jql , options )
1135
1210
}
1136
1211
1212
+ // SearchV3JQL will search for tickets according to the jql for Jira Cloud
1213
+ //
1214
+ // Jira API docs: https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-search/#api-rest-api-3-search-jql-get
1215
+ func (s * IssueService ) SearchV3JQL (jql string , options * SearchOptionsV3 ) ([]Issue , * Response , error ) {
1216
+ return s .SearchV3JQLWithContext (context .Background (), jql , options )
1217
+ }
1218
+
1219
+ func (s * IssueService ) SearchV3JQLWithContext (ctx context.Context , jql string , options * SearchOptionsV3 ) ([]Issue , * Response , error ) {
1220
+ u := url.URL {
1221
+ Path : "rest/api/3/search/jql" ,
1222
+ }
1223
+ uv := url.Values {}
1224
+ if jql != "" {
1225
+ uv .Add ("jql" , jql )
1226
+ }
1227
+
1228
+ // TODO Check this out if this works with addOptions as well
1229
+ if options != nil {
1230
+ if options .NextPageToken != "" {
1231
+ uv .Add ("nextPageToken" , options .NextPageToken )
1232
+ }
1233
+ if options .MaxResults != 0 {
1234
+ uv .Add ("maxResults" , strconv .Itoa (options .MaxResults ))
1235
+ }
1236
+ if strings .Join (options .Fields , "," ) != "" {
1237
+ uv .Add ("fields" , strings .Join (options .Fields , "," ))
1238
+ }
1239
+ if options .Expand != "" {
1240
+ uv .Add ("expand" , options .Expand )
1241
+ }
1242
+ if len (options .Properties ) > 5 {
1243
+ return nil , nil , fmt .Errorf ("Search option Properties accepts maximum five entries" )
1244
+ }
1245
+ if strings .Join (options .Properties , "," ) != "" {
1246
+ uv .Add ("properties" , strings .Join (options .Properties , "," ))
1247
+ }
1248
+ if options .FieldsByKeys {
1249
+ uv .Add ("fieldsByKeys" , "true" )
1250
+ }
1251
+ if options .FailFast {
1252
+ uv .Add ("failFast" , "true" )
1253
+ }
1254
+ if len (options .ReconcileIssues ) > 50 {
1255
+ return nil , nil , fmt .Errorf ("Search option ReconcileIssue accepts maximum 50 entries" )
1256
+ }
1257
+ if len (options .ReconcileIssues ) > 0 {
1258
+ // TODO Extract this
1259
+ // Convert []int to []string for strings.Join
1260
+ reconcileIssuesStr := make ([]string , len (options .ReconcileIssues ))
1261
+ for i , v := range options .ReconcileIssues {
1262
+ reconcileIssuesStr [i ] = strconv .Itoa (v )
1263
+ }
1264
+ uv .Add ("reconcileIssues" , strings .Join (reconcileIssuesStr , "," ))
1265
+ }
1266
+ }
1267
+
1268
+ u .RawQuery = uv .Encode ()
1269
+
1270
+ req , err := s .client .NewRequestWithContext (ctx , http .MethodGet , u .String (), nil )
1271
+ if err != nil {
1272
+ return []Issue {}, nil , err
1273
+ }
1274
+
1275
+ v := new (searchResultV3 )
1276
+ resp , err := s .client .Do (req , v )
1277
+ if err != nil {
1278
+ err = NewJiraError (resp , err )
1279
+ }
1280
+
1281
+ return v .Issues , resp , err
1282
+ }
1283
+
1284
+
1137
1285
// SearchPagesWithContext will get issues from all pages in a search
1138
1286
//
1139
1287
// Jira API docs: https://developer.atlassian.com/jiradev/jira-apis/jira-rest-apis/jira-rest-api-tutorials/jira-rest-api-example-query-issues
0 commit comments