protected override async Task HandleRequirementAsync(LinksHandlerContext context, PagingLinksRequirement <TResource> requirement) { var condition = requirement.Condition; if (!context.AssertAll(condition)) { context.Skipped(requirement, LinkRequirementSkipReason.Assertion); return; } var pagingResource = context.Resource as IPagedLinkContainer; if (pagingResource == null) { throw new InvalidOperationException($"PagingLinkRequirement can only be used by a resource of type IPageLinkContainer. Type: {context.Resource.GetType().FullName}"); } var route = context.CurrentRoute; var values = context.CurrentRouteValues; var queryParams = context.CurrentQueryValues; if (condition != null && condition.RequiresAuthorization) { if (!await context.AuthorizeAsync(route, values, condition)) { context.Skipped(requirement, LinkRequirementSkipReason.Authorization); return; } } context.Links.Add(new LinkSpec(requirement.CurrentId, route, GetPageValues(values, queryParams, pagingResource.PageNumber, pagingResource.PageSize))); var addPrevLink = ShouldAddPreviousPageLink(pagingResource.PageNumber); var addNextLink = ShouldAddNextPageLink(pagingResource.PageNumber, pagingResource.PageCount); if (addPrevLink) { context.Links.Add(new LinkSpec(requirement.PreviousId, route, GetPageValues(values, queryParams, pagingResource.PageNumber - 1, pagingResource.PageSize))); } if (addNextLink) { context.Links.Add(new LinkSpec(requirement.NextId, route, GetPageValues(values, queryParams, pagingResource.PageNumber + 1, pagingResource.PageSize))); } context.Handled(requirement); return; }
protected override async Task HandleRequirementAsync(LinksHandlerContext context, RouteLinkRequirement <TResource> requirement) { var condition = requirement.Condition; if (!context.AssertAll(condition)) { context.Skipped(requirement, LinkRequirementSkipReason.Assertion); return; } if (String.IsNullOrEmpty(requirement.RouteName)) { context.Skipped(requirement, LinkRequirementSkipReason.Error, $"Requirement did not have a RouteName specified for link: {requirement.Id}"); return; } var route = context.RouteMap.GetRoute(requirement.RouteName); if (route == null) { context.Skipped(requirement, LinkRequirementSkipReason.Error, $"No route was found for route name: {requirement.RouteName}"); return; } var values = new RouteValueDictionary(); if (requirement.GetRouteValues != null) { values = requirement.GetRouteValues((TResource)context.Resource); } if (condition != null && condition.RequiresAuthorization) { if (!await context.AuthorizeAsync(route, values, condition)) { context.Skipped(requirement, LinkRequirementSkipReason.Authorization); return; } } context.Links.Add(new LinkSpec(requirement.Id, route, values)); context.Handled(requirement); }