示例#1
0
        public async Task <PagedList <Menus> > GetMenusAsync(DtoMenuParameter parameter)
        {
            var queryExpression = _context.Set <Menus>() as IQueryable <Menus>;

            if (!string.IsNullOrWhiteSpace(parameter.Name))
            {
                queryExpression = queryExpression.Where(c => c.Name.Contains(parameter.Name));
            }
            queryExpression = queryExpression.Where(c => c.Position == (int)parameter.Position);

            var mappingDictionary = _propertyMappingService.GetPropertyMapping <MenuDto, Menus>();

            queryExpression = queryExpression.ApplySort(parameter.OrderBy, mappingDictionary);
            return(await PagedList <Menus> .CreateAsync(queryExpression, parameter.PageNumber, parameter.PageSize));
        }
示例#2
0
        public async Task <IActionResult> GetMenus([FromQuery] DtoMenuParameter parameter)
        {
            if (!_propertyCheckerService.TypeHasProperties <MenuDto>(parameter.Fields))
            {
                return(BadRequest());
            }
            if (!_propertyMappingService.ValidMappingExistsFor <MenuDto, Menus>(parameter.OrderBy))
            {
                return(BadRequest());
            }
            var menus = await _menuRepository.GetMenusAsync(parameter);

            var paginationMetadata = new
            {
                totalCount  = menus.TotalCount,
                pageSize    = menus.PageSize,
                currentPage = menus.CurrentPage,
                totalPages  = menus.TotalPages,
            };

            Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            }));
            var menuDtos      = _mapper.Map <IList <MenuDto> >(menus);
            var menuGenerates = menuDtos.GenerateTree(c => c.Id, u => u.ParentId);

            var shapedData = menuGenerates.shapeData(parameter.Fields);
            var links      = CreateLinksForMenus(parameter, menus.HasPrevious, menus.HasNext);

            //var shapedMenusWithLinks = shapedData.Select(c =>
            //{
            //    var menuDict = c as IDictionary<string, object>;
            //    var menusLinks = CreateLinksForMenus((int)menuDict["Id"], null);
            //    menuDict.Add("links", menusLinks);
            //    return menuDict;
            //});

            var linkedCollectionResource = new
            {
                value = shapedData,
                links
            };

            return(Ok(linkedCollectionResource));
        }
示例#3
0
        private string CreateUsersResourceUri(DtoMenuParameter parameters,
                                              ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(Url.Link(nameof(GetMenus), new
                {
                    fields = parameters.Fields,
                    pageNumber = parameters.PageNumber - 1,
                    pageSize = parameters.PageSize,
                    name = parameters.Name,
                    position = parameters.Position,
                    orderBy = parameters.OrderBy
                }));

            case ResourceUriType.NextPage:

                return(Url.Link(nameof(GetMenus), new
                {
                    fields = parameters.Fields,
                    pageNumber = parameters.PageNumber + 1,
                    pageSize = parameters.PageSize,
                    name = parameters.Name,
                    position = parameters.Position,
                    orderBy = parameters.OrderBy
                }));

            case ResourceUriType.CurrentPage:
            default:
                return(Url.Link(nameof(GetMenus), new
                {
                    fields = parameters.Fields,
                    pageNumber = parameters.PageNumber,
                    pageSize = parameters.PageSize,
                    name = parameters.Name,
                    position = parameters.Position,
                    orderBy = parameters.OrderBy
                }));
            }
        }
示例#4
0
        private IEnumerable <LinkDto> CreateLinksForMenus(DtoMenuParameter parameters, bool hasPrevious, bool hasNext)
        {
            var links = new List <LinkDto>();


            links.Add(new LinkDto(CreateUsersResourceUri(parameters, ResourceUriType.CurrentPage),
                                  "self", "GET"));

            if (hasPrevious)
            {
                links.Add(new LinkDto(CreateUsersResourceUri(parameters, ResourceUriType.PreviousPage),
                                      "previous_page", "GET"));
            }

            if (hasNext)
            {
                links.Add(new LinkDto(CreateUsersResourceUri(parameters, ResourceUriType.NextPage),
                                      "next_page", "GET"));
            }

            return(links);
        }