示例#1
0
        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();
            }
        }
示例#2
0
        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();
            }
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }