public HalClientTestContext() { _fixture = new Fixture().Customize(new AutoRhinoMockCustomization()); _http = _fixture.Freeze <IJsonHttpClient>(); _version = _fixture.Create <Version>(); _order = _fixture.Build <Order>().With(x => x.DeliveryDate, null).Create(); _orderItem = _fixture.Create <OrderItem>(); _paged = _fixture.Create <PagedList>(); OrderAdd = _fixture.Create <OrderAdd>(); OrderEdit = _fixture.Create <OrderEdit>(); _resourceWithJsonAttribute = _fixture.Create <ResourceWithJsonAttribute>(); _sut = new HalClient(_http); _curies = new[] { new { href = "https://retail.com/v1/docs/{rel}", name = Curie, templated = true } }; _hasCurie = true; }
public static async Task <IHalClient> GetAsync( this IHalClient client, IResource resource, string rel, object parameters, string curie) { var relationship = HalClientExtensions.Relationship(rel, curie); if (resource.Embedded.Any(e => e.Rel == relationship)) { var current = resource.Embedded.Where(e => e.Rel == relationship); return(new HalClient(client, current)); } var link = resource.Links.FirstOrDefault(l => l.Rel == relationship); if (link == null) { throw new FailedToResolveRelationship(relationship); } return(await client.ExecuteAsync( HalClientExtensions.Construct(resource.BaseAddress, link, parameters), uri => client.Client.GetAsync(uri))); }
/// <summary> /// Gets the <typeparamref name="T"/> resources that have changed since /// your application's last request. /// </summary> /// <param name="nextLink">The <see cref="Link"/> that was stored from /// your last request.</param> public static Task <ChangedResources <T> > GetChangedResourcesAsync <T>( this IHalClient client, Link nextLink, IDictionary <string, string> parameters, IDictionary <string, IEnumerable <string> > headers, CancellationToken cancellationToken) where T : Resource { var parametersWithResourceVersionSort = new Dictionary <string, string>(parameters ?? new Dictionary <string, string>()); if (parametersWithResourceVersionSort.ContainsKey("sort")) { parametersWithResourceVersionSort["sort"] = "resource_version"; } else { parametersWithResourceVersionSort.Add("sort", "resource_version"); } return(client.GetChangedResourcesInternalAsync <T>( nextLink, parametersWithResourceVersionSort, headers, cancellationToken)); }
private static ReadAllPage ReadAllBackwardsInternal(IHalClient client, bool prefetch) { var resource = client.Current.First(); var pageInfo = resource.Data <HalReadAllPage>(); var streamMessages = Convert( resource.Embedded .Where(r => r.Rel == Constants.Relations.Message) .ToArray(), client, prefetch); var readAllPage = new ReadAllPage( pageInfo.FromPosition, pageInfo.NextPosition, pageInfo.IsEnd, ReadDirection.Backward, async(position, cancellationToken) => ReadAllBackwardsInternal( await client.GetAsync(resource, Constants.Relations.Previous, cancellationToken), prefetch), streamMessages); return(readAllPage); }
public HalClientTestContext() { _fixture = new Fixture().Customize(new AutoRhinoMockCustomization()); _http = _fixture.Freeze<IJsonHttpClient>(); _version = _fixture.Create<Version>(); _order = _fixture.Create<Order>(); _orderItem = _fixture.Create<OrderItem>(); _paged = _fixture.Create<PagedList>(); OrderAdd = _fixture.Create<OrderAdd>(); OrderEdit = _fixture.Create<OrderEdit>(); _sut = new HalClient(_http); _curies = new[] { new { href = "https://retail.com/v1/docs/{rel}", name = Curie, templated = true } }; _hasCurie = true; }
private static void CheckThatApiRootIsAvailable(IHalClient halRoot, string desiredMethod) { if (!halRoot.Has(desiredMethod)) { throw new Exception( $"Could not access the root of the API, either Authentication failed or the URL \"{Constants.GlobalXHost}{Constants.DocumentsRoute}\" could not be reached."); } }
public SellerListingsClient(IHalClient halClient, ILinkFactory linkFactory) { Requires.ArgumentNotNull(halClient, nameof(halClient)); Requires.ArgumentNotNull(linkFactory, nameof(linkFactory)); _halClient = halClient; _linkFactory = linkFactory; }
public PaymentMethodsClient(IUserClient userClient, IHalClient halClient, ILinkFactory linkFactory) { _userClient = userClient; _halClient = halClient; _linkFactory = linkFactory; }
public PurchasesClient(IUserClient userClient, IHalClient halClient, ILinkFactory linkFactory) { _userClient = userClient; _halClient = halClient; _linkFactory = linkFactory; }
public static bool Has(this IHalClient client, string rel, string curie) { var relationship = HalClientExtensions.Relationship(rel, curie); return (client.Current.Any(r => r.Embedded.Any(e => e.Rel == relationship)) || client.Current.Any(r => r.Links.Any(l => l.Rel == relationship))); }
public WebhooksClient( IHalClient halClient, ILinkFactory linkFactory) { _halClient = halClient; _linkFactory = linkFactory; _linkResolver = new LinkResolver(); }
private static async Task <ChangedResources <T> > GetChangedResourcesInternalAsync <T>( this IHalClient client, Link link, IDictionary <string, string> parameters, IDictionary <string, IEnumerable <string> > headers, CancellationToken cancellationToken) where T : Resource { Requires.ArgumentNotNull(client, nameof(client)); Requires.ArgumentNotNull(link, nameof(link)); var currentLink = link; var currentParameters = new Dictionary <string, string>(parameters ?? new Dictionary <string, string>()); // Increase page-size to reduce the number of round-trips var maxPageSize = "10000"; if (currentParameters.ContainsKey("page_size")) { currentParameters["page_size"] = maxPageSize; } else { currentParameters.Add("page_size", maxPageSize); } var items = new List <T>(); var deletedItems = new List <T>(); while (true) { cancellationToken.ThrowIfCancellationRequested(); var currentPage = await client.GetAsync <PagedResource <T> >( currentLink, currentParameters, headers, cancellationToken).ConfigureAwait(client.Configuration); items.AddRange(currentPage.Items); if (currentPage.DeletedItems != null) { deletedItems.AddRange(currentPage.DeletedItems); } if (currentPage.NextLink == null) { // This is the last page break; } // Stop passing parameters on subsequent calls since the "next" links // will already be assembled with all the parameters needed currentParameters = null; currentLink = currentPage.NextLink; } return(new ChangedResources <T>(items, deletedItems, currentLink)); }
public static Task <IReadOnlyList <T> > GetAllPagesAsync <T>( this IHalClient client, Link link, IRequestParameters request) where T : Resource { return(GetAllPagesAsync <T>( client, link, request, CancellationToken.None)); }
/// <summary> /// Gets the <typeparamref name="T"/> resources that have changed since /// your application's last request. /// </summary> /// <param name="nextLink">The <see cref="Link"/> that was stored from /// your last request.</param> public static Task <ChangedResources <T> > GetChangedResourcesAsync <T>( this IHalClient client, Link nextLink, IRequestParameters request, CancellationToken cancellationToken) where T : Resource { return(client.GetChangedResourcesAsync <T>( nextLink, request?.Parameters, request?.Headers, cancellationToken)); }
public static Task <IReadOnlyList <T> > GetAllPagesAsync <T>( this IHalClient client, Link link, IDictionary <string, string> parameters, IDictionary <string, IEnumerable <string> > headers) where T : Resource { return(GetAllPagesAsync <T>( client, link, parameters, headers, CancellationToken.None)); }
private static StreamMessage[] Convert(IResource[] streamMessages, IHalClient client, bool prefetch = false) => Array.ConvertAll( streamMessages, streamMessage => { var httpStreamMessage = streamMessage.Data <HttpStreamMessage>(); return(httpStreamMessage.ToStreamMessage( ct => prefetch ? Task.FromResult(httpStreamMessage.Payload.ToString()) : Task.Run(() => GetPayload(client, streamMessage, ct), ct))); });
public static Task <IHalClient> Delete( this IHalClient client, string rel, object parameters, string curie, IDictionary <string, string[]> headers = null, CancellationToken cancellationToken = default) { var relationship = HalClientExtensions.Relationship(rel, curie); return(client.BuildAndExecuteAsync( relationship, parameters, uri => client.Client.DeleteAsync(uri, headers, cancellationToken))); }
public static async Task <IReadOnlyList <T> > GetAllPagesAsync <T>( this IHalClient client, Link link, IDictionary <string, string> parameters, IDictionary <string, IEnumerable <string> > headers, CancellationToken cancellationToken) where T : Resource { var changedResources = await client.GetChangedResourcesInternalAsync <T>( link, parameters, headers, cancellationToken).ConfigureAwait(client); return(changedResources.NewOrUpdatedResources); }
private static ReadStreamPage ReadStreamBackwardsInternal( IHalClient client, StreamId streamId, int fromVersionInclusive, bool prefetchJsonData) { var resource = client.Current.First(); if (client.StatusCode == HttpStatusCode.NotFound) { return(new ReadStreamPage( streamId, PageReadStatus.StreamNotFound, fromVersionInclusive, -1, -1, -1, ReadDirection.Backward, true)); } var pageInfo = resource.Data <HalReadPage>(); var streamMessages = Convert( resource.Embedded .Where(r => r.Rel == Constants.Relations.Message) .ToArray(), client, prefetchJsonData); var readStreamPage = new ReadStreamPage( streamId, PageReadStatus.Success, pageInfo.FromStreamVersion, pageInfo.NextStreamVersion, pageInfo.LastStreamVersion, pageInfo.LastStreamPosition, ReadDirection.Backward, pageInfo.IsEnd, async(nextVersion, token) => ReadStreamBackwardsInternal( await client.GetAsync(resource, Constants.Relations.Previous), streamId, pageInfo.LastStreamVersion, prefetchJsonData), streamMessages); return(readStreamPage); }
public static Task <IHalClient> BuildAndExecuteAsync( this IHalClient client, string relationship, object parameters, Func <string, Task <HttpResponseMessage> > command) { var resource = client.Current.FirstOrDefault(r => r.Links.Any(l => l.Rel == relationship)); if (resource == null) { throw new FailedToResolveRelationship(relationship); } var link = resource.Links.FirstOrDefault(l => l.Rel == relationship); return(ExecuteAsync(client, Construct(resource.BaseAddress, link, parameters), command)); }
private static void ThrowOnError(IHalClient client) { switch (client.StatusCode ?? default) { case default(HttpStatusCode): return; case HttpStatusCode.Conflict: var resource = client.Current.First(); throw new WrongExpectedVersionException(resource.Data <HttpError>().Detail); case var status when status >= HttpStatusCode.BadRequest: throw new HttpRequestException($"Response status code does not indicate success: {status}"); default: return; } }
public static async Task <IHalClient> ExecuteAsync( this IHalClient client, string uri, Func <string, Task <HttpResponseMessage> > command) { var result = await command(uri); var current = new[] { (result.Content.Headers.ContentLength == 0 ? new Resource() : await result.Content.ReadResource()) .WithBaseAddress(new Uri(client.Client.BaseAddress, uri)) }; return(new HalClient(client, current, result.StatusCode)); }
private static async Task <string> GetPayload( IHalClient client, IResource streamMessage, CancellationToken cancellationToken) => (await client.GetAsync(streamMessage, Constants.Relations.Self, cancellationToken)) .Current.FirstOrDefault()?.Data <HttpStreamMessage>()?.Payload?.ToString();
public void Act(Func<IHalClient, IHalClient> act) { _result = act(_sut); }
public static Task <Root> GetRootAsync(this IHalClient client) { return(client.GetRootAsync(new RootRequest())); }
private static ReadStreamPage ReadStreamForwardsInternal( IHalClient client, StreamId streamId, int fromVersionInclusive, bool prefetchJsonData) { var resource = client.Current.First(); if (client.StatusCode == HttpStatusCode.NotFound) { return(new ReadStreamPage( streamId, PageReadStatus.StreamNotFound, fromVersionInclusive, -1, -1, -1, ReadDirection.Forward, true)); } var pageInfo = resource.Data <HalReadPage>(); var streamMessages = Convert( resource.Embedded .Where(r => r.Rel == Constants.Relations.Message) .Reverse() .ToArray(), client, prefetchJsonData); var readStreamPage = new ReadStreamPage( streamId, PageReadStatus.Success, pageInfo.FromStreamVersion, pageInfo.NextStreamVersion, pageInfo.LastStreamVersion, pageInfo.LastStreamPosition, ReadDirection.Forward, pageInfo.IsEnd, ReadNextStreamPage, streamMessages); return(readStreamPage); async Task <ReadStreamPage> ReadNextStreamPage(int nextVersion, CancellationToken ct) => resource.Links.Any(link => link.Rel == Constants.Relations.Next) ? ReadStreamForwardsInternal( await client.GetAsync(resource, Constants.Relations.Next), streamId, pageInfo.LastStreamVersion, prefetchJsonData) : new ReadStreamPage( streamId, PageReadStatus.Success, pageInfo.LastStreamVersion, nextVersion, pageInfo.LastStreamVersion, pageInfo.LastStreamPosition, ReadDirection.Forward, true, ReadNextStreamPage); }
public CategoriesClient(IHalClient halClient, ILinkFactory linkFactory) { _halClient = halClient; _linkFactory = linkFactory; }
public VenuesClient(IHalClient halClient) { _halClient = halClient; }
public SourceController( IHalClient client) { _client = client; }
public static Task <Root> GetRootAsync(this IHalClient client, RootRequest request) { return(client.GetRootAsync <Root>(request)); }
public static Task <IReadOnlyList <T> > GetAllPagesAsync <T>( this IHalClient client, Link link) where T : Resource { return(GetAllPagesAsync <T>(client, link, null, null)); }
public CurrenciesClient(IHalClient halClient, ILinkFactory linkFactory) { _halClient = halClient; _linkFactory = linkFactory; }