Esempio n. 1
0
        public async Task <PagedList <Users> > GetUsersAsync(DtoUserParameter parameter)
        {
            var queryExpression = _context.Set <Users>() as IQueryable <Users>;

            if (!string.IsNullOrWhiteSpace(parameter.Username))
            {
                queryExpression = queryExpression.Where(c => c.Username.Contains(parameter.Username));
            }
            if (!string.IsNullOrWhiteSpace(parameter.Account))
            {
                queryExpression = queryExpression.Where(c => c.Account == parameter.Account);
            }
            var mappingDictionary = _propertyMappingService.GetPropertyMapping <UserDto, Users>();

            queryExpression = queryExpression.ApplySort(parameter.OrderBy, mappingDictionary);

            return(await PagedList <Users> .CreateAsync(queryExpression, parameter.PageNumber, parameter.PageSize));
        }
Esempio n. 2
0
        public async Task <IActionResult> GetUsers([FromQuery] DtoUserParameter parameter)
        {
            if (!_propertyCheckerService.TypeHasProperties <UserDto>(parameter.Fields))
            {
                return(BadRequest());
            }
            if (!_propertyMappingService.ValidMappingExistsFor <UserDto, Users>(parameter.OrderBy))
            {
                return(BadRequest());
            }
            var users = await _userRepository.GetUsersAsync(parameter);

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

            Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            }));
            var userDtos   = _mapper.Map <IList <UserDto> >(users);
            var shapedData = userDtos.shapeData(parameter.Fields);
            var links      = CreateLinksForUsers(parameter, users.HasPrevious, users.HasNext);

            var shapedUsersWithLinks = shapedData.Select(c =>
            {
                var userDict  = c as IDictionary <string, object>;
                var userLinks = CreateLinksForUsers((int)userDict["Id"], null);
                userDict.Add("links", userLinks);
                return(userDict);
            });

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

            return(Ok(linkedCollectionResource));
        }
Esempio n. 3
0
        private string CreateUsersResourceUri(DtoUserParameter parameters,
                                              ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(Url.Link(nameof(GetUsers), new
                {
                    fields = parameters.Fields,
                    pageNumber = parameters.PageNumber - 1,
                    pageSize = parameters.PageSize,
                    username = parameters.Username,
                    account = parameters.Account,
                    orderBy = parameters.OrderBy
                }));

            case ResourceUriType.NextPage:

                return(Url.Link(nameof(GetUsers), new
                {
                    fields = parameters.Fields,
                    pageNumber = parameters.PageNumber + 1,
                    pageSize = parameters.PageSize,
                    username = parameters.Username,
                    account = parameters.Account,
                    orderBy = parameters.OrderBy
                }));

            case ResourceUriType.CurrentPage:
            default:
                return(Url.Link(nameof(GetUsers), new
                {
                    fields = parameters.Fields,
                    pageNumber = parameters.PageNumber,
                    pageSize = parameters.PageSize,
                    username = parameters.Username,
                    account = parameters.Account,
                    orderBy = parameters.OrderBy
                }));
            }
        }
Esempio n. 4
0
        private IEnumerable <LinkDto> CreateLinksForUsers(DtoUserParameter 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);
        }