using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; namespace Octokit.Http { public class ApiConnection : IApiConnection { readonly IApiPagination _pagination; public ApiConnection(IConnection connection) : this(connection, new ApiPagination()) { } protected ApiConnection(IConnection connection, IApiPagination pagination) { Ensure.ArgumentNotNull(connection, "connection"); Ensure.ArgumentNotNull(pagination, "pagination"); Connection = connection; _pagination = pagination; } protected IConnection Connection { get; private set; } public async Task Get(Uri endpoint, IDictionary parameters) { Ensure.ArgumentNotNull(endpoint, "endpoint"); return await GetItem(endpoint, parameters); } public async Task GetItem(Uri endpoint, IDictionary parameters) { Ensure.ArgumentNotNull(endpoint, "endpoint"); var response = await Connection.GetAsync(endpoint, parameters); return response.BodyAsObject; } public async Task GetHtml(Uri endpoint, IDictionary parameters) { Ensure.ArgumentNotNull(endpoint, "endpoint"); var response = await Connection.GetHtml(endpoint, parameters); return response.Body; } public async Task> GetAll(Uri endpoint, IDictionary parameters) { Ensure.ArgumentNotNull(endpoint, "endpoint"); return await _pagination.GetAllPages(async () => await GetPage(endpoint, parameters)); } public async Task Create(Uri endpoint, object data) { Ensure.ArgumentNotNull(endpoint, "endpoint"); Ensure.ArgumentNotNull(data, "data"); var response = await Connection.PostAsync(endpoint, data); return response.BodyAsObject; } public async Task Update(Uri endpoint, object data) { Ensure.ArgumentNotNull(endpoint, "endpoint"); Ensure.ArgumentNotNull(data, "data"); var response = await Connection.PatchAsync(endpoint, data); return response.BodyAsObject; } public async Task Put(Uri endpoint, object data) { Ensure.ArgumentNotNull(endpoint, "endpoint"); Ensure.ArgumentNotNull(data, "data"); var response = await Connection.PostAsync(endpoint, data); return response.BodyAsObject; } public async Task Delete(Uri endpoint) { Ensure.ArgumentNotNull(endpoint, "endpoint"); await Connection.DeleteAsync(endpoint); } public async Task Upload(Uri uri, Stream rawData, string contentType) { Ensure.ArgumentNotNull(uri, "uri"); Ensure.ArgumentNotNull(rawData, "rawData"); Ensure.ArgumentNotNull(contentType, "contentType"); var response = await Connection.PostAsync( uri, rawData, contentType, "application/vnd.github.manifold-preview"); return response.BodyAsObject; } async Task> GetPage(Uri endpoint, IDictionary parameters) { Ensure.ArgumentNotNull(endpoint, "endpoint"); var response = await Connection.GetAsync>(endpoint, parameters); return new ReadOnlyPagedCollection(response, Connection); } } }