public async Task <PagedList <ApplicationUser> > FindAllAsync(ApplicationUserResourceParameter resourceParameter)
        {
            if (resourceParameter is null)
            {
                throw new ArgumentNullException(nameof(resourceParameter));
            }
            var collection = this.userManager.Users as IQueryable <ApplicationUser>;

            if (!string.IsNullOrEmpty(resourceParameter.SearchQuery))
            {
                var searchQuery = resourceParameter.SearchQuery.Trim();
                collection = collection.Where(u => u.Email.Contains(searchQuery, StringComparison.OrdinalIgnoreCase));
            }

            if (!string.IsNullOrEmpty(resourceParameter.OrderBy))
            {
                var propertyMappingDictionary =
                    this.propertyMappingService.GetPropertyMapping <UserDto, ApplicationUser>();

                collection = collection.ApplySort(resourceParameter.OrderBy, propertyMappingDictionary);
            }

            return(await PagedList <ApplicationUser> .CreateAsync(
                       collection,
                       resourceParameter.PageNumber,
                       resourceParameter.PageSize));
        }
Exemple #2
0
        private IEnumerable <LinkDto> CreateLinksForUsers(
            ApplicationUserResourceParameter resourceParameters,
            bool hasNextPage,
            bool hasPreviousPage)
        {
            var links = new List <LinkDto>();

            links.Add(new LinkDto(
                          CreateUsersResourceUri(resourceParameters, ResourceUriType.Current),
                          "self",
                          "GET"));

            if (hasNextPage)
            {
                links.Add(new LinkDto(
                              CreateUsersResourceUri(resourceParameters, ResourceUriType.NextPage),
                              "next_page",
                              "GET"));
            }
            if (hasPreviousPage)
            {
                links.Add(new LinkDto(
                              CreateUsersResourceUri(resourceParameters, ResourceUriType.PreviousPage),
                              "previous_page",
                              "GET"));
            }
            return(links);
        }
        // GET: api/users
        public async Task <IActionResult> GetUsers(
            [FromQuery] ApplicationUserResourceParameter resourceParameter,
            [FromHeader(Name = "Accept")] string mediaType)
        {
            var response = await this.businessLogic.GetUsers(resourceParameter, mediaType);

            if (!response.IsSuccessful)
            {
                return(BadRequest(new { message = response.ErrorMessage }));
            }

            if (response.Result == null)
            {
                return(NotFound());
            }

            Response.Headers.Add("X-Pagination",
                                 JsonSerializer.Serialize(response.Result.PaginationMetaData));

            return(Ok(
                       new
            {
                value = response.Result.Value,
                links = response.Result.Links
            }
                       ));
        }
Exemple #4
0
        private string CreateUsersResourceUri(
            ApplicationUserResourceParameter resourceParameters,
            ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(url.Link("GetUsers",
                                new
                {
                    fields = resourceParameters.Fields,
                    orderBy = resourceParameters.OrderBy,
                    pageNumber = resourceParameters.PageNumber - 1,
                    pageSize = resourceParameters.PageSize,
                    searchQuery = resourceParameters.SearchQuery
                }));

            case ResourceUriType.NextPage:
                return(url.Link("GetUsers",
                                new
                {
                    fields = resourceParameters.Fields,
                    orderBy = resourceParameters.OrderBy,
                    pageNumber = resourceParameters.PageNumber + 1,
                    pageSize = resourceParameters.PageSize,
                    searchQuery = resourceParameters.SearchQuery
                }));

            case ResourceUriType.Current:
            default:
                return(url.Link("GetUsers",
                                new
                {
                    fields = resourceParameters.Fields,
                    orderBy = resourceParameters.OrderBy,
                    pageNumber = resourceParameters.PageNumber,
                    pageSize = resourceParameters.PageSize,
                    searchQuery = resourceParameters.SearchQuery
                }));
            }
        }
Exemple #5
0
        public async Task <GenericResponse <ShapedDataWithLinks> > GetUsers(ApplicationUserResourceParameter resourceParameter, string mediaType)
        {
            try
            {
                if (!MediaTypeHeaderValue.TryParse(mediaType,
                                                   out MediaTypeHeaderValue parsedMediaType))
                {
                    return(GenericResponseBuilder.NoSuccess <ShapedDataWithLinks>(null, "Wrong media type"));
                }

                if (!propertyMappingService.ValidMappingExistsFor <UserDto, ApplicationUser>(resourceParameter.OrderBy))
                {
                    return(GenericResponseBuilder.NoSuccess <ShapedDataWithLinks>(null, "Wrong OrderBy entered"));
                }
                if (!propertyCheckerService.TypeHasProperties <UserDto>(resourceParameter.Fields, true))
                {
                    return(GenericResponseBuilder.NoSuccess <ShapedDataWithLinks>(null, "Wrong fields entered"));
                }

                var users = await this.dataService.UserManagerExtensions.FindAllAsync(resourceParameter);

                if (users.Count == 0)
                {
                    return(GenericResponseBuilder.Success <ShapedDataWithLinks>(null));
                }

                var paginationMetaData = new PaginationMetaData
                {
                    TotalCount  = users.TotalCount,
                    PageSize    = users.PageSize,
                    CurrentPage = users.CurrentPage,
                    TotalPages  = users.TotalPages
                };
                var links = CreateLinksForUsers(resourceParameter, users.HasNext, users.HasPrevious);

                var shapedUsersToReturn = this.mapper
                                          .Map <IEnumerable <UserDto> >(users)
                                          .ShapeData(resourceParameter.Fields);

                var includeLinks = parsedMediaType.SubTypeWithoutSuffix
                                   .EndsWith("hateoas", StringComparison.InvariantCultureIgnoreCase);
                var shapedUsersToReturnWithLinks = shapedUsersToReturn.Select(user =>
                {
                    var userAsDictionary = user as IDictionary <string, object>;
                    if (includeLinks)
                    {
                        var userLinks = CreateLinksForUser((Guid)userAsDictionary["Id"], resourceParameter.Fields);
                        userAsDictionary.Add("links", userLinks);
                    }
                    return(userAsDictionary);
                });

                var usersToReturn = new ShapedDataWithLinks()
                {
                    Value = shapedUsersToReturnWithLinks,
                    Links = links,
                    PaginationMetaData = paginationMetaData
                };

                return(GenericResponseBuilder.Success <ShapedDataWithLinks>(usersToReturn));
            }
            catch (Exception ex)
            {
                logger.LogError(string.Format("Error in BLL - GetUsers. {0}", ex.Message));
                return(GenericResponseBuilder.NoSuccess <ShapedDataWithLinks>(null, ex.Message.ToString()));
            }
        }