Skip to content

Instantly share code, notes, and snippets.

@Grinderofl
Last active February 23, 2017 09:29
Show Gist options
  • Save Grinderofl/77ef4aebed359763274f7e56e71d0642 to your computer and use it in GitHub Desktop.
Save Grinderofl/77ef4aebed359763274f7e56e71d0642 to your computer and use it in GitHub Desktop.
public class AssemblaClientSettings
{
public string BaseUrl { get; set; } = "https://api.assembla.com/";
public string ApiKey { get; set; }
public string ApiSecret { get; set; }
}
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);
}
}
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