private string CreateCoachInfoUri(CoachInfoResourceParameters coachInfoResourceParameters, UriType uriType, string routeName)
        {
            switch (uriType)
            {
            case UriType.PreviousPage:
                return(Url.Link(routeName, new
                {
                    pageNumber = coachInfoResourceParameters.PageNumber - 1,
                    coachInfoResourceParameters.PageSize,
                    coachInfoResourceParameters.SearchQuery,
                    coachInfoResourceParameters.OrderBy,
                    coachInfoResourceParameters.Fields
                }));

            case UriType.NextPage:
                return(Url.Link(routeName, new
                {
                    pageNumber = coachInfoResourceParameters.PageNumber + 1,
                    coachInfoResourceParameters.PageSize,
                    searchQuery = coachInfoResourceParameters.SearchQuery,
                    coachInfoResourceParameters.OrderBy,
                    coachInfoResourceParameters.Fields
                }));

            default:
                return(Url.Link(routeName, new
                {
                    coachInfoResourceParameters.PageNumber,
                    coachInfoResourceParameters.PageSize,
                    coachInfoResourceParameters.SearchQuery,
                    coachInfoResourceParameters.OrderBy,
                    coachInfoResourceParameters.Fields
                }));
            }
        }
        public IActionResult GetCoachInfos([FromQuery] CoachInfoResourceParameters coachInfoReposrceParameters)
        {
            if (!_propertyMapping.ValidMappingExist <CoachInfoOutputDto, CoachInfo>(coachInfoReposrceParameters.OrderBy))
            {
                return(BadRequest());
            }
            if (!_propertyValidation.HasValidProperties <CoachInfoOutputDto>(coachInfoReposrceParameters.Fields))
            {
                return(BadRequest());
            }

            var coachInfoFromRepo = _coachInfosRepository.GetCoachInfos(coachInfoReposrceParameters);

            var previousPageLink = coachInfoFromRepo.HasPrevious ? CreateCoachInfoUri(coachInfoReposrceParameters, UriType.PreviousPage, "GetCoachInfos") : null;
            var nextPageLink     = coachInfoFromRepo.HasNext ? CreateCoachInfoUri(coachInfoReposrceParameters, UriType.NextPage, "GetCoachInfos") : null;

            var metaData = new
            {
                totalCount  = coachInfoFromRepo.TotalCount,
                pageSize    = coachInfoFromRepo.PageSize,
                currentPage = coachInfoFromRepo.CurrentPage,
                totalPages  = coachInfoFromRepo.TotalPages,
                previousPageLink,
                nextPageLink,
            };

            Response.Headers.Add("Pagination", JsonSerializer.Serialize(metaData));

            return(Ok(_mapper.Map <IEnumerable <CoachInfoOutputDto> >(coachInfoFromRepo).ShapeData(coachInfoReposrceParameters.Fields)));
        }
        public PageList <CoachInfo> GetCoachInfos(CoachInfoResourceParameters coachInfoResourceParameters)
        {
            if (coachInfoResourceParameters == null)
            {
                throw new ArgumentNullException(nameof(coachInfoResourceParameters));
            }

            var collection = _context.CoachInfos.Include(c => c.Author) as IQueryable <CoachInfo>;

            if (!string.IsNullOrWhiteSpace(coachInfoResourceParameters.SearchQuery))
            {
                string searchinQuery = coachInfoResourceParameters.SearchQuery.Trim().ToLower();
                collection = collection.Where(c => c.Author.Name.ToLower().Contains(searchinQuery) || c.Author.Email.ToLower().Contains(searchinQuery)); // Do we need includes to do this?
            }

            if (!string.IsNullOrWhiteSpace(coachInfoResourceParameters.OrderBy))
            {
                var postPropertyMappingDictionary = _propertyMapping.GetPropertyMapping <CoachInfoOutputDto, CoachInfo>();
                collection = collection.ApplySort(coachInfoResourceParameters.OrderBy, postPropertyMappingDictionary);
            }

            return(PageList <CoachInfo> .Create(collection, coachInfoResourceParameters.PageNumber, coachInfoResourceParameters.PageSize));
        }