Last active
February 23, 2017 09:29
-
-
Save Grinderofl/77ef4aebed359763274f7e56e71d0642 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class AssemblaClientSettings | |
{ | |
public string BaseUrl { get; set; } = "https://api.assembla.com/"; | |
public string ApiKey { get; set; } | |
public string ApiSecret { get; set; } | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class AssemblaRestService : IAssemblaRestService | |
{ | |
private readonly AssemblaClientSettings _assemblaClientSettings; | |
public AssemblaRestService(AssemblaClientSettings assemblaClientSettings) | |
{ | |
_assemblaClientSettings = assemblaClientSettings; | |
} | |
public TResponse Get<TResponse>(string resource) where TResponse : class | |
{ | |
using (var client = CreateClient(resource)) | |
{ | |
var response = client.GetAsync(client.BaseAddress).Result; | |
return DeserializeResponse<TResponse>(response); | |
} | |
} | |
public TResponse Post<TResponse>(string resource) where TResponse : class | |
{ | |
using (var client = CreateClient(resource)) | |
{ | |
var response = client.PostAsync(client.BaseAddress, new StringContent("")).Result; | |
return DeserializeResponse<TResponse>(response); | |
} | |
} | |
protected virtual TResponse DeserializeResponse<TResponse>(HttpResponseMessage response) where TResponse : class | |
{ | |
if (!response.IsSuccessStatusCode) | |
return null; | |
var responseJson = response.Content.ReadAsStringAsync().Result; | |
return JsonConvert.DeserializeObject<TResponse>(responseJson); | |
} | |
protected virtual HttpClient CreateClient(string resource) | |
{ | |
var client = new HttpClient {BaseAddress = CreateUrl(resource)}; | |
client.DefaultRequestHeaders.Accept.Clear(); | |
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); | |
client.DefaultRequestHeaders.Add("X-Api-Key", _assemblaClientSettings.ApiKey); | |
client.DefaultRequestHeaders.Add("X-Api-Secret", _assemblaClientSettings.ApiSecret); | |
return client; | |
} | |
private Uri CreateUrl(string resource) | |
{ | |
return new Uri(new Uri(_assemblaClientSettings.BaseUrl), resource); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class AssemblaTicketClient : AssemblaClientBase, IAssemblaTicketClient | |
{ | |
public AssemblaTicketClient(IAssemblaRestService assemblaRestService) : base(assemblaRestService) | |
{ | |
} | |
public virtual Ticket GetTicket(string space, long ticketId) | |
=> AssemblaRestService.Get<Ticket>($"/v1/spaces/{space}/tickets/{ticketId}.json"); | |
public ICollection<Ticket> GetTicketsByMilestone(string space, long milestoneId) | |
{ | |
var allTickets = new List<Ticket>(); | |
var result = GetTicketsByMilestone(space, milestoneId, 1); | |
var page = 1; | |
while (result != null) | |
{ | |
allTickets.AddRange(result); | |
page++; | |
result = GetTicketsByMilestone(space, milestoneId, page); | |
} | |
return allTickets; | |
} | |
private IEnumerable<Ticket> GetTicketsByMilestone(string space, long milestoneId, int page) | |
=> AssemblaRestService.Get<IEnumerable<Ticket>>( | |
$"/v1/spaces/{space}/tickets/milestone/{milestoneId}.json?per_page=100&page={page}&ticket_status=all"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment