@@ -41,12 +41,22 @@ public JiraClient(JiraAccount account)
4141 // Won't throw exception.
4242 var response = client . Execute < T > ( request ) ;
4343
44- if ( response . ResponseStatus != ResponseStatus . Completed || response . ErrorException != null )
45- throw new JiraApiException ( string . Format ( "RestSharp response status: {0} - HTTP response: {1} - {2} - {3}" , response . ResponseStatus , response . StatusCode , response . StatusDescription , response . Content ) ) ;
44+ validateResponse ( response ) ;
4645
4746 return response . Data ;
4847 }
4948
49+ /// <summary>
50+ /// Throws exception with details if request was not unsucessful
51+ /// </summary>
52+ /// <typeparam name="T"></typeparam>
53+ /// <param name="response"></param>
54+ private static void validateResponse ( IRestResponse response )
55+ {
56+ if ( response . ResponseStatus != ResponseStatus . Completed || response . ErrorException != null || response . StatusCode == HttpStatusCode . BadRequest )
57+ throw new JiraApiException ( string . Format ( "RestSharp response status: {0} - HTTP response: {1} - {2} - {3}" , response . ResponseStatus , response . StatusCode , response . StatusDescription , response . Content ) ) ;
58+ }
59+
5060 /// <summary>
5161 /// Returns a comma separated string from the strings in the provided
5262 /// IEnumerable of strings. Returns an empty string if null is provided.
@@ -75,11 +85,11 @@ private static string ToCommaSeparatedString(IEnumerable<string> strings)
7585 public Issue GetIssue ( string issueKey , IEnumerable < string > fields = null )
7686 {
7787 var fieldsString = ToCommaSeparatedString ( fields ) ;
78-
88+
7989 var request = new RestRequest ( ) ;
8090 request . Resource = string . Format ( "{0}?fields={1}" , ResourceUrls . IssueByKey ( issueKey ) , fieldsString ) ;
8191 request . Method = Method . GET ;
82-
92+
8393 var issue = Execute < Issue > ( request , HttpStatusCode . OK ) ;
8494 return issue . fields != null ? issue : null ;
8595 }
@@ -148,7 +158,7 @@ public List<Project> GetProjects()
148158 } ;
149159
150160 return Execute < List < Project > > ( request , HttpStatusCode . OK ) ;
151- }
161+ }
152162
153163 /// <summary>
154164 /// Returns a list of all possible priorities. Throws
@@ -174,10 +184,12 @@ public ProjectMeta GetProjectMeta(string projectKey)
174184 {
175185 var request = new RestRequest ( ) ;
176186 request . Resource = ResourceUrls . CreateMeta ( ) ;
177- request . AddParameter ( new Parameter ( )
178- { Name = "projectKeys" ,
179- Value = projectKey ,
180- Type = ParameterType . GetOrPost } ) ;
187+ request . AddParameter ( new Parameter ( )
188+ {
189+ Name = "projectKeys" ,
190+ Value = projectKey ,
191+ Type = ParameterType . GetOrPost
192+ } ) ;
181193 request . Method = Method . GET ;
182194 var createMeta = Execute < IssueCreateMeta > ( request , HttpStatusCode . OK ) ;
183195 if ( createMeta . projects [ 0 ] . key != projectKey || createMeta . projects . Count != 1 )
@@ -231,7 +243,7 @@ public ApplicationProperty GetApplicationProperty(string propertyKey)
231243 Resource = ResourceUrls . ApplicationProperties ( ) ,
232244 RequestFormat = DataFormat . Json
233245 } ;
234-
246+
235247 request . AddParameter ( new Parameter ( )
236248 {
237249 Name = "key" ,
@@ -274,6 +286,53 @@ public void DeleteAttachment(string attachmentId)
274286 var response = client . Execute ( request ) ;
275287 if ( response . ResponseStatus != ResponseStatus . Completed || response . StatusCode != HttpStatusCode . NoContent )
276288 throw new JiraApiException ( "Failed to delete attachment with id=" + attachmentId ) ;
289+ }
290+
291+ /// <summary>
292+ /// Update time tracking estimates
293+ /// </summary>
294+ /// <param name="issuekey"></param>
295+ /// <param name="orginialEstimateMinutes"></param>
296+ /// <param name="remainingEstimateMinutes"></param>
297+ /// <returns></returns>
298+ public bool UpdateTimetracking ( string issuekey , int orginialEstimateMinutes , int remainingEstimateMinutes )
299+ {
300+ var request = new RestRequest ( )
301+ {
302+ Resource = string . Format ( "{0}" , ResourceUrls . IssueByKey ( issuekey ) ) ,
303+ Method = Method . PUT ,
304+ RequestFormat = DataFormat . Json ,
305+ } ;
306+
307+ // Alternative for "simple" fields
308+ //request.AddBody(
309+ // new { fields = new { summary = issue.fields.summary } }
310+ //);
311+
312+ request . AddBody (
313+ new
314+ {
315+ update = new
316+ {
317+ timetracking = new object [ ] { new
318+ {
319+ edit = new
320+ {
321+ // No entry in seconds possible apparently
322+ originalEstimate = string . Format ( "{0}m" , orginialEstimateMinutes ) ,
323+ remainingEstimate = string . Format ( "{0}m" , remainingEstimateMinutes )
324+ }
325+ } }
326+ }
327+ }
328+ ) ;
329+
330+ // No response expected
331+ var response = client . Execute ( request ) ;
332+
333+ validateResponse ( response ) ;
334+
335+ return response . StatusCode == HttpStatusCode . NoContent ;
277336 }
278337 }
279338}
0 commit comments