public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) { var result = context.Result as ObjectResult; if (FiltersHelper.IsResponseSuccesful(result)) { PaginationModel <TEntity> paginationModel = await FiltersHelper.GetParameterFromActionAsync <PaginationModel <TEntity> >(context); IQueryable <TDto> list = result.Value as IQueryable <TDto>; var dtoPagedList = await list.ToPagedListAsync(paginationModel.PageSize, paginationModel.PageNumber); /// Doesn't support many pagination methods for a single controller var paginationMethodInfo = filterConfiguration.ControllerInfoDictionary[context.Controller.GetType()].ControllerActions.Where(t => t.ResourceType == Attributes.ResourceType.Collection).FirstOrDefault(); string mediaType = FiltersHelper.GetValueFromHeader(context, "Accept"); PaginationMetadata paginationMetadata = paginationHelperService.GeneratePaginationMetaData(dtoPagedList, paginationModel, context.Controller.GetType().Name, paginationMethodInfo.ActionName); if (filterConfiguration.SupportsCustomDataType && mediaType.Equals(filterConfiguration.CustomDataType, StringComparison.CurrentCultureIgnoreCase)) { var controllerType = context.Controller.GetType(); var dtoPagedListWithExternalLinks = HateoasHelper.CreateLinksForCollectionResource(dtoPagedList, filterConfiguration, paginationMetadata, context.Controller.GetType()); var shapedDtoPagedListWithLinks = new EnvelopCollection <EnvelopDto <TDto> > { Values = dtoPagedListWithExternalLinks.Values.Select(dto => { return(HateoasHelper .CreateLinksForSingleResource(dto, filterConfiguration, linkGenerator, controllerType)); }), Links = dtoPagedListWithExternalLinks.Links }; result.Value = shapedDtoPagedListWithLinks; } else { result.Value = dtoPagedList; } await next(); } }
public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) { PaginatedResult result = context.Result as PaginatedResult; if (FiltersHelper.IsResponseSuccesful(result)) { PaginationModel paginationModel = await FiltersHelper.GetParameterKnowingBaseTypeFromActionAsync <PaginationModel>(context); var paginationMethodInfo = filterConfiguration.ControllerInfoDictionary[context.Controller.GetType()].ControllerActions. Where(t => t.ResourceType == Attributes.ResourceType.Collection).FirstOrDefault(); PaginationMetadata paginationMetadata = paginationHelperService.GeneratePaginationMetaData( result.PaginationInfo, paginationModel, FiltersHelper.GetControllerName(context), paginationMethodInfo.ActionName); string mediaType = FiltersHelper.GetValueFromHeader(context, "Accept"); IEnumerable <TDto> pagedList = (IEnumerable <TDto>)result.Value; if (filterConfiguration.HateoasConfiguration.SupportsCustomDataType && mediaType.Equals(filterConfiguration.HateoasConfiguration.CustomDataType, StringComparison.CurrentCultureIgnoreCase)) { EnvelopCollection <EnvelopDto <TDto> > pagedListWithLinks = AddInternalAndExternalLinks(context, paginationMetadata, pagedList); result.Value = pagedListWithLinks; } else { result.Value = pagedList; } await next(); } }
internal static EnvelopCollection <TDto> CreateLinksForCollectionResource <TDto>(IEnumerable <TDto> dtoCollection, HateoasScanner filterConfiguration, PaginationMetadata paginationMetadata, Type controllerType) where TDto : IIdentityDto { var action = filterConfiguration.ControllerInfoDictionary[controllerType].ControllerActions.First(t => t.ResourceType == ResourceType.Collection); var envelop = new EnvelopCollection <TDto>(dtoCollection); envelop.Links.Add(new LinkDto(paginationMetadata.NextPageLink, $"{action.MethodName}-next", action.MethodType)); envelop.Links.Add(new LinkDto(paginationMetadata.PreviousPageLink, $"{action.MethodName}-previous", action.MethodType)); envelop.Links.Add(new LinkDto(paginationMetadata.SelfPageLink, $"{action.MethodName}", action.MethodType)); return(envelop); }
private EnvelopCollection <EnvelopDto <TDto> > AddInternalAndExternalLinks(ResultExecutingContext context, PaginationMetadata paginationMetadata, IEnumerable <TDto> pagedList) { Type controllerType = context.Controller.GetType(); EnvelopCollection <TDto> pagedListWithExternalLinks = HateoasHelper.CreateLinksForCollectionResource(pagedList, filterConfiguration, paginationMetadata, context.Controller.GetType()); EnvelopCollection <EnvelopDto <TDto> > shapedPagedListWithLinks = new EnvelopCollection <EnvelopDto <TDto> > { Values = pagedListWithExternalLinks.Values.Select(dto => { return(HateoasHelper .CreateLinksForSingleResource(dto, filterConfiguration, linkGenerator, controllerType)); }), Links = pagedListWithExternalLinks.Links }; return(shapedPagedListWithLinks); }