Skip to content

Commit 3b8428a

Browse files
author
schoetbi
committed
JiraClient: Issues können nun von mehreren Projekten abgefragt werden
1 parent 292f600 commit 3b8428a

File tree

2 files changed

+68
-24
lines changed

2 files changed

+68
-24
lines changed

TechTalk.JiraRestClient/IJiraClient.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ namespace TechTalk.JiraRestClient
99
/// <summary>Returns all issues for the given project</summary>
1010
IEnumerable<Issue<TIssueFields>> GetIssues(String projectKey);
1111
/// <summary>Returns all issues of the specified type for the given project</summary>
12-
IEnumerable<Issue<TIssueFields>> GetIssues(String projectKey, String issueType);
12+
IEnumerable<Issue<TIssueFields>> GetIssues(String projectKey, String issueType);
1313
/// <summary>Returns all issues of the given type and the given project filtered by the given JQL query</summary>
14+
15+
IEnumerable<Issue<TIssueFields>> GetIssuesByQuery(string[] projects, string issueType, string jqlQuery);
16+
1417
IEnumerable<Issue<TIssueFields>> GetIssuesByQuery(String projectKey, String issueType, String jqlQuery);
1518
/// <summary>Enumerates through all issues for the given project</summary>
1619
IEnumerable<Issue<TIssueFields>> EnumerateIssues(String projectKey);

TechTalk.JiraRestClient/JiraClient.cs

Lines changed: 64 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using RestSharp;
99
using RestSharp.Deserializers;
1010
using RestSharp.Extensions;
11+
using static System.String;
1112

1213
namespace TechTalk.JiraRestClient
1314
{
@@ -31,7 +32,7 @@ public JiraClient(string baseUrl, string username, string password)
3132
private RestRequest CreateRequest(Method method, String path)
3233
{
3334
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))));
3536
return request;
3637
}
3738

@@ -65,6 +66,46 @@ public IEnumerable<Issue<TIssueFields>> GetIssuesByQuery(string projectKey, stri
6566
return EnumerateIssuesInternal(projectKey, issueType, jqlQuery);
6667
}
6768

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+
68109
public IEnumerable<Issue<TIssueFields>> EnumerateIssues(String projectKey)
69110
{
70111
return EnumerateIssues(projectKey, null);
@@ -89,12 +130,12 @@ private IEnumerable<Issue<TIssueFields>> EnumerateIssuesInternal(String projectK
89130
var resultCount = 0;
90131
while (true)
91132
{
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);
98139
var request = CreateRequest(Method.GET, path);
99140

100141
var response = ExecuteRequest(request);
@@ -120,7 +161,7 @@ public Issue<TIssueFields> LoadIssue(String issueRef)
120161
{
121162
try
122163
{
123-
var path = String.Format("issue/{0}", issueRef);
164+
var path = Format("issue/{0}", issueRef);
124165
var request = CreateRequest(Method.GET, path);
125166

126167
var response = ExecuteRequest(request);
@@ -201,7 +242,7 @@ public Issue<TIssueFields> UpdateIssue(Issue<TIssueFields> issue)
201242
{
202243
try
203244
{
204-
var path = String.Format("issue/{0}", issue.JiraIdentifier);
245+
var path = Format("issue/{0}", issue.JiraIdentifier);
205246
var request = CreateRequest(Method.PUT, path);
206247
request.AddHeader("ContentType", "application/json");
207248

@@ -240,7 +281,7 @@ public void DeleteIssue(IssueRef issue)
240281
{
241282
try
242283
{
243-
var path = String.Format("issue/{0}?deleteSubtasks=true", issue.id);
284+
var path = Format("issue/{0}?deleteSubtasks=true", issue.id);
244285
var request = CreateRequest(Method.DELETE, path);
245286

246287
var response = ExecuteRequest(request);
@@ -258,7 +299,7 @@ public IEnumerable<Transition> GetTransitions(IssueRef issue)
258299
{
259300
try
260301
{
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);
262303
var request = CreateRequest(Method.GET, path);
263304

264305
var response = ExecuteRequest(request);
@@ -278,7 +319,7 @@ public Issue<TIssueFields> TransitionIssue(IssueRef issue, Transition transition
278319
{
279320
try
280321
{
281-
var path = String.Format("issue/{0}/transitions", issue.id);
322+
var path = Format("issue/{0}/transitions", issue.id);
282323
var request = CreateRequest(Method.POST, path);
283324
request.AddHeader("ContentType", "application/json");
284325

@@ -306,7 +347,7 @@ public IEnumerable<JiraUser> GetWatchers(IssueRef issue)
306347
{
307348
try
308349
{
309-
var path = String.Format("issue/{0}/watchers", issue.id);
350+
var path = Format("issue/{0}/watchers", issue.id);
310351
var request = CreateRequest(Method.GET, path);
311352

312353
var response = ExecuteRequest(request);
@@ -326,7 +367,7 @@ public IEnumerable<Comment> GetComments(IssueRef issue)
326367
{
327368
try
328369
{
329-
var path = String.Format("issue/{0}/comment", issue.id);
370+
var path = Format("issue/{0}/comment", issue.id);
330371
var request = CreateRequest(Method.GET, path);
331372

332373
var response = ExecuteRequest(request);
@@ -346,7 +387,7 @@ public Comment CreateComment(IssueRef issue, String comment)
346387
{
347388
try
348389
{
349-
var path = String.Format("issue/{0}/comment", issue.id);
390+
var path = Format("issue/{0}/comment", issue.id);
350391
var request = CreateRequest(Method.POST, path);
351392
request.AddHeader("ContentType", "application/json");
352393
request.AddBody(new Comment { body = comment });
@@ -367,7 +408,7 @@ public void DeleteComment(IssueRef issue, Comment comment)
367408
{
368409
try
369410
{
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);
371412
var request = CreateRequest(Method.DELETE, path);
372413

373414
var response = ExecuteRequest(request);
@@ -390,7 +431,7 @@ public Attachment CreateAttachment(IssueRef issue, Stream fileStream, String fil
390431
{
391432
try
392433
{
393-
var path = String.Format("issue/{0}/attachments", issue.id);
434+
var path = Format("issue/{0}/attachments", issue.id);
394435
var request = CreateRequest(Method.POST, path);
395436
request.AddHeader("X-Atlassian-Token", "nocheck");
396437
request.AddHeader("ContentType", "multipart/form-data");
@@ -412,7 +453,7 @@ public void DeleteAttachment(Attachment attachment)
412453
{
413454
try
414455
{
415-
var path = String.Format("attachment/{0}", attachment.id);
456+
var path = Format("attachment/{0}", attachment.id);
416457
var request = CreateRequest(Method.DELETE, path);
417458

418459
var response = ExecuteRequest(request);
@@ -482,7 +523,7 @@ public void DeleteIssueLink(IssueLink link)
482523
{
483524
try
484525
{
485-
var path = String.Format("issueLink/{0}", link.id);
526+
var path = Format("issueLink/{0}", link.id);
486527
var request = CreateRequest(Method.DELETE, path);
487528

488529
var response = ExecuteRequest(request);
@@ -500,7 +541,7 @@ public IEnumerable<RemoteLink> GetRemoteLinks(IssueRef issue)
500541
{
501542
try
502543
{
503-
var path = string.Format("issue/{0}/remotelink", issue.id);
544+
var path = Format("issue/{0}/remotelink", issue.id);
504545
var request = CreateRequest(Method.GET, path);
505546
request.AddHeader("ContentType", "application/json");
506547

@@ -521,7 +562,7 @@ public RemoteLink CreateRemoteLink(IssueRef issue, RemoteLink remoteLink)
521562
{
522563
try
523564
{
524-
var path = string.Format("issue/{0}/remotelink", issue.id);
565+
var path = Format("issue/{0}/remotelink", issue.id);
525566
var request = CreateRequest(Method.POST, path);
526567
request.AddHeader("ContentType", "application/json");
527568
request.AddBody(new
@@ -557,7 +598,7 @@ public RemoteLink UpdateRemoteLink(IssueRef issue, RemoteLink remoteLink)
557598
{
558599
try
559600
{
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);
561602
var request = CreateRequest(Method.PUT, path);
562603
request.AddHeader("ContentType", "application/json");
563604

@@ -583,7 +624,7 @@ public void DeleteRemoteLink(IssueRef issue, RemoteLink remoteLink)
583624
{
584625
try
585626
{
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);
587628
var request = CreateRequest(Method.DELETE, path);
588629
request.AddHeader("ContentType", "application/json");
589630

0 commit comments

Comments
 (0)