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)); }
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)); }
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 })); } }
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); }