8
8
using RestSharp ;
9
9
using RestSharp . Deserializers ;
10
10
using RestSharp . Extensions ;
11
+ using static System . String ;
11
12
12
13
namespace TechTalk . JiraRestClient
13
14
{
@@ -31,7 +32,7 @@ public JiraClient(string baseUrl, string username, string password)
31
32
private RestRequest CreateRequest ( Method method , String path )
32
33
{
33
34
var request = new RestRequest { Method = method , Resource = path , RequestFormat = DataFormat . Json } ;
34
- request . AddHeader ( "Authorization" , "Basic " + Convert . ToBase64String ( Encoding . UTF8 . GetBytes ( String . Format ( "{0}:{1}" , username , password ) ) ) ) ;
35
+ request . AddHeader ( "Authorization" , "Basic " + Convert . ToBase64String ( Encoding . UTF8 . GetBytes ( Format ( "{0}:{1}" , username , password ) ) ) ) ;
35
36
return request ;
36
37
}
37
38
@@ -65,6 +66,46 @@ public IEnumerable<Issue<TIssueFields>> GetIssuesByQuery(string projectKey, stri
65
66
return EnumerateIssuesInternal ( projectKey , issueType , jqlQuery ) ;
66
67
}
67
68
69
+ public IEnumerable < Issue < TIssueFields > > GetIssuesByQuery ( string [ ] projectes , string issueType , string jqlQuery )
70
+ {
71
+ return EnumerateIssuesInternal ( projectes , issueType , jqlQuery ) ;
72
+ }
73
+
74
+ private IEnumerable < Issue < TIssueFields > > EnumerateIssuesInternal ( string [ ] projectes , string issueType , string jqlQuery )
75
+ {
76
+ {
77
+ var queryCount = 50 ;
78
+ var resultCount = 0 ;
79
+ while ( true )
80
+ {
81
+ var projectsClause = string . Join ( "%2C+" , projectes . Select ( p => $ "%22{ Uri . EscapeUriString ( p ) } %22") ) ;
82
+ var jql = $ "project+in+({ projectsClause } )";
83
+ if ( ! IsNullOrEmpty ( issueType ) )
84
+ jql += $ "+AND+issueType={ Uri . EscapeUriString ( issueType ) } ";
85
+ if ( ! IsNullOrEmpty ( jqlQuery ) )
86
+ jql += $ "+AND+{ Uri . EscapeUriString ( jqlQuery ) } ";
87
+ var path = $ "search?jql={ jql } &startAt={ resultCount } &maxResults={ queryCount } ";
88
+ var request = CreateRequest ( Method . GET , path ) ;
89
+
90
+ var response = ExecuteRequest ( request ) ;
91
+ AssertStatus ( response , HttpStatusCode . OK ) ;
92
+
93
+ var data = deserializer . Deserialize < IssueContainer < TIssueFields > > ( response ) ;
94
+ var issues = data . issues ? . ToArray ( ) ?? Enumerable . Empty < Issue < TIssueFields > > ( ) . ToArray ( ) ;
95
+
96
+ foreach ( var item in issues )
97
+ {
98
+ yield return item ;
99
+ }
100
+
101
+ resultCount += issues . Length ;
102
+
103
+ if ( resultCount < data . total ) continue ;
104
+ else /* all issues received */ break ;
105
+ }
106
+ }
107
+ }
108
+
68
109
public IEnumerable < Issue < TIssueFields > > EnumerateIssues ( String projectKey )
69
110
{
70
111
return EnumerateIssues ( projectKey , null ) ;
@@ -89,12 +130,12 @@ private IEnumerable<Issue<TIssueFields>> EnumerateIssuesInternal(String projectK
89
130
var resultCount = 0 ;
90
131
while ( true )
91
132
{
92
- var jql = String . Format ( "project={0}" , Uri . EscapeUriString ( projectKey ) ) ;
93
- if ( ! String . IsNullOrEmpty ( issueType ) )
94
- jql += String . Format ( "+AND+issueType={0}" , Uri . EscapeUriString ( issueType ) ) ;
95
- if ( ! String . IsNullOrEmpty ( jqlQuery ) )
96
- jql += String . Format ( "+AND+{0}" , Uri . EscapeUriString ( jqlQuery ) ) ;
97
- var path = String . Format ( "search?jql={0}&startAt={1}&maxResults={2}" , jql , resultCount , queryCount ) ;
133
+ var jql = Format ( "project={0}" , Uri . EscapeUriString ( projectKey ) ) ;
134
+ if ( ! IsNullOrEmpty ( issueType ) )
135
+ jql += Format ( "+AND+issueType={0}" , Uri . EscapeUriString ( issueType ) ) ;
136
+ if ( ! IsNullOrEmpty ( jqlQuery ) )
137
+ jql += Format ( "+AND+{0}" , Uri . EscapeUriString ( jqlQuery ) ) ;
138
+ var path = Format ( "search?jql={0}&startAt={1}&maxResults={2}" , jql , resultCount , queryCount ) ;
98
139
var request = CreateRequest ( Method . GET , path ) ;
99
140
100
141
var response = ExecuteRequest ( request ) ;
@@ -120,7 +161,7 @@ public Issue<TIssueFields> LoadIssue(String issueRef)
120
161
{
121
162
try
122
163
{
123
- var path = String . Format ( "issue/{0}" , issueRef ) ;
164
+ var path = Format ( "issue/{0}" , issueRef ) ;
124
165
var request = CreateRequest ( Method . GET , path ) ;
125
166
126
167
var response = ExecuteRequest ( request ) ;
@@ -201,7 +242,7 @@ public Issue<TIssueFields> UpdateIssue(Issue<TIssueFields> issue)
201
242
{
202
243
try
203
244
{
204
- var path = String . Format ( "issue/{0}" , issue . JiraIdentifier ) ;
245
+ var path = Format ( "issue/{0}" , issue . JiraIdentifier ) ;
205
246
var request = CreateRequest ( Method . PUT , path ) ;
206
247
request . AddHeader ( "ContentType" , "application/json" ) ;
207
248
@@ -240,7 +281,7 @@ public void DeleteIssue(IssueRef issue)
240
281
{
241
282
try
242
283
{
243
- var path = String . Format ( "issue/{0}?deleteSubtasks=true" , issue . id ) ;
284
+ var path = Format ( "issue/{0}?deleteSubtasks=true" , issue . id ) ;
244
285
var request = CreateRequest ( Method . DELETE , path ) ;
245
286
246
287
var response = ExecuteRequest ( request ) ;
@@ -258,7 +299,7 @@ public IEnumerable<Transition> GetTransitions(IssueRef issue)
258
299
{
259
300
try
260
301
{
261
- var path = String . Format ( "issue/{0}/transitions?expand=transitions.fields" , issue . id ) ;
302
+ var path = Format ( "issue/{0}/transitions?expand=transitions.fields" , issue . id ) ;
262
303
var request = CreateRequest ( Method . GET , path ) ;
263
304
264
305
var response = ExecuteRequest ( request ) ;
@@ -278,7 +319,7 @@ public Issue<TIssueFields> TransitionIssue(IssueRef issue, Transition transition
278
319
{
279
320
try
280
321
{
281
- var path = String . Format ( "issue/{0}/transitions" , issue . id ) ;
322
+ var path = Format ( "issue/{0}/transitions" , issue . id ) ;
282
323
var request = CreateRequest ( Method . POST , path ) ;
283
324
request . AddHeader ( "ContentType" , "application/json" ) ;
284
325
@@ -306,7 +347,7 @@ public IEnumerable<JiraUser> GetWatchers(IssueRef issue)
306
347
{
307
348
try
308
349
{
309
- var path = String . Format ( "issue/{0}/watchers" , issue . id ) ;
350
+ var path = Format ( "issue/{0}/watchers" , issue . id ) ;
310
351
var request = CreateRequest ( Method . GET , path ) ;
311
352
312
353
var response = ExecuteRequest ( request ) ;
@@ -326,7 +367,7 @@ public IEnumerable<Comment> GetComments(IssueRef issue)
326
367
{
327
368
try
328
369
{
329
- var path = String . Format ( "issue/{0}/comment" , issue . id ) ;
370
+ var path = Format ( "issue/{0}/comment" , issue . id ) ;
330
371
var request = CreateRequest ( Method . GET , path ) ;
331
372
332
373
var response = ExecuteRequest ( request ) ;
@@ -346,7 +387,7 @@ public Comment CreateComment(IssueRef issue, String comment)
346
387
{
347
388
try
348
389
{
349
- var path = String . Format ( "issue/{0}/comment" , issue . id ) ;
390
+ var path = Format ( "issue/{0}/comment" , issue . id ) ;
350
391
var request = CreateRequest ( Method . POST , path ) ;
351
392
request . AddHeader ( "ContentType" , "application/json" ) ;
352
393
request . AddBody ( new Comment { body = comment } ) ;
@@ -367,7 +408,7 @@ public void DeleteComment(IssueRef issue, Comment comment)
367
408
{
368
409
try
369
410
{
370
- var path = String . Format ( "issue/{0}/comment/{1}" , issue . id , comment . id ) ;
411
+ var path = Format ( "issue/{0}/comment/{1}" , issue . id , comment . id ) ;
371
412
var request = CreateRequest ( Method . DELETE , path ) ;
372
413
373
414
var response = ExecuteRequest ( request ) ;
@@ -390,7 +431,7 @@ public Attachment CreateAttachment(IssueRef issue, Stream fileStream, String fil
390
431
{
391
432
try
392
433
{
393
- var path = String . Format ( "issue/{0}/attachments" , issue . id ) ;
434
+ var path = Format ( "issue/{0}/attachments" , issue . id ) ;
394
435
var request = CreateRequest ( Method . POST , path ) ;
395
436
request . AddHeader ( "X-Atlassian-Token" , "nocheck" ) ;
396
437
request . AddHeader ( "ContentType" , "multipart/form-data" ) ;
@@ -412,7 +453,7 @@ public void DeleteAttachment(Attachment attachment)
412
453
{
413
454
try
414
455
{
415
- var path = String . Format ( "attachment/{0}" , attachment . id ) ;
456
+ var path = Format ( "attachment/{0}" , attachment . id ) ;
416
457
var request = CreateRequest ( Method . DELETE , path ) ;
417
458
418
459
var response = ExecuteRequest ( request ) ;
@@ -482,7 +523,7 @@ public void DeleteIssueLink(IssueLink link)
482
523
{
483
524
try
484
525
{
485
- var path = String . Format ( "issueLink/{0}" , link . id ) ;
526
+ var path = Format ( "issueLink/{0}" , link . id ) ;
486
527
var request = CreateRequest ( Method . DELETE , path ) ;
487
528
488
529
var response = ExecuteRequest ( request ) ;
@@ -500,7 +541,7 @@ public IEnumerable<RemoteLink> GetRemoteLinks(IssueRef issue)
500
541
{
501
542
try
502
543
{
503
- var path = string . Format ( "issue/{0}/remotelink" , issue . id ) ;
544
+ var path = Format ( "issue/{0}/remotelink" , issue . id ) ;
504
545
var request = CreateRequest ( Method . GET , path ) ;
505
546
request . AddHeader ( "ContentType" , "application/json" ) ;
506
547
@@ -521,7 +562,7 @@ public RemoteLink CreateRemoteLink(IssueRef issue, RemoteLink remoteLink)
521
562
{
522
563
try
523
564
{
524
- var path = string . Format ( "issue/{0}/remotelink" , issue . id ) ;
565
+ var path = Format ( "issue/{0}/remotelink" , issue . id ) ;
525
566
var request = CreateRequest ( Method . POST , path ) ;
526
567
request . AddHeader ( "ContentType" , "application/json" ) ;
527
568
request . AddBody ( new
@@ -557,7 +598,7 @@ public RemoteLink UpdateRemoteLink(IssueRef issue, RemoteLink remoteLink)
557
598
{
558
599
try
559
600
{
560
- var path = string . Format ( "issue/{0}/remotelink/{1}" , issue . id , remoteLink . id ) ;
601
+ var path = Format ( "issue/{0}/remotelink/{1}" , issue . id , remoteLink . id ) ;
561
602
var request = CreateRequest ( Method . PUT , path ) ;
562
603
request . AddHeader ( "ContentType" , "application/json" ) ;
563
604
@@ -583,7 +624,7 @@ public void DeleteRemoteLink(IssueRef issue, RemoteLink remoteLink)
583
624
{
584
625
try
585
626
{
586
- var path = string . Format ( "issue/{0}/remotelink/{1}" , issue . id , remoteLink . id ) ;
627
+ var path = Format ( "issue/{0}/remotelink/{1}" , issue . id , remoteLink . id ) ;
587
628
var request = CreateRequest ( Method . DELETE , path ) ;
588
629
request . AddHeader ( "ContentType" , "application/json" ) ;
589
630
0 commit comments