//this methods helps to create a Url link to previous Resource private string CreateAuthorsResourceUris(AuhtorResourceParameters auhtorResourceParameters, ResourceUriType type) { switch (type) { case ResourceUriType.PreviousPage: return(Url.Link("GetAuthors", new { PageNumber = auhtorResourceParameters.PageNumber - 1, PageSize = auhtorResourceParameters.pageSize, MainCategory = auhtorResourceParameters.mainCategory, SearchQuery = auhtorResourceParameters.searchQuery })); case ResourceUriType.NextPage: return(Url.Link("GetAuthors", new { PageNumber = auhtorResourceParameters.PageNumber + 1, PageSize = auhtorResourceParameters.pageSize, MainCategory = auhtorResourceParameters.mainCategory, SearchQuery = auhtorResourceParameters.searchQuery })); default: return(Url.Link("GetAuthors", new { PageNumber = auhtorResourceParameters.PageNumber, PageSize = auhtorResourceParameters.pageSize, MainCategory = auhtorResourceParameters.mainCategory, SearchQuery = auhtorResourceParameters.searchQuery })); } }
//get Auhtors wth mainCategory for filtering purpose and searching public PagedList<Author> GetAuthors(AuhtorResourceParameters auhtorResourceParameters) { //throw new ArgumentNullException(); //if (string.IsNullOrWhiteSpace(auhtorResourceParameters.mainCategory) && string.IsNullOrWhiteSpace(auhtorResourceParameters.searchQuery)) //{ // return GetAuthors(); //} var collections = _context.Authors as IQueryable<Author>; if (!string.IsNullOrWhiteSpace(auhtorResourceParameters.mainCategory)) { auhtorResourceParameters.mainCategory = auhtorResourceParameters.mainCategory.Trim(); collections = collections.Where(m => m.MainCategory == auhtorResourceParameters.mainCategory); // return collections; } //implemenent searching if (!string.IsNullOrWhiteSpace(auhtorResourceParameters.searchQuery)) { auhtorResourceParameters.searchQuery = auhtorResourceParameters.searchQuery.Trim(); collections = collections.Where(m => m.MainCategory.Contains(auhtorResourceParameters.searchQuery) || m.FirstName.Contains(auhtorResourceParameters.searchQuery) || m.LastName.Contains(auhtorResourceParameters.searchQuery)); } //apply the paging here before TOList is called return PagedList<Author>.Create(collections, auhtorResourceParameters.PageNumber, auhtorResourceParameters.pageSize); //return collections // .Skip(auhtorResourceParameters.pageSize * (auhtorResourceParameters.PageNumber - 1)) // ths // .Take(auhtorResourceParameters.pageSize) // .ToList(); }
public ActionResult <IEnumerable <AuhtorDTO> > GetAuthors([FromQuery] AuhtorResourceParameters auhtorResourceParameters) { try { var GetAllAuthors = _courseLibrary.GetAuthors(auhtorResourceParameters); //checking if there is a previous link, if there is calle dthe method, if not set to null var previousPageLink = GetAllAuthors.HasPrevious ? CreateAuthorsResourceUris(auhtorResourceParameters, ResourceUriType.PreviousPage) : null; var nextPageLink = GetAllAuthors.HasNext ? CreateAuthorsResourceUris(auhtorResourceParameters, ResourceUriType.NextPage) : null; //then we create the MetaData we want to return to the user for guide var paginationMetaData = new { totalCount = GetAllAuthors.Totalcount, pageSize = GetAllAuthors.PageSize, currentPage = GetAllAuthors.CurrentPage, previousPageLink, nextPageLink }; //Adding to the header Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetaData)); //using Automapper for cleaner code instead of select Query,(seee below) //the return type first(destination), then the source var auhtors = _mapper.Map <IEnumerable <AuhtorDTO> >(GetAllAuthors); //var auhtors = GetAllAuthors // .Select(a => new AuhtorDTO // { // ID = a.ID, // Name =$"{a.FirstName} {a.LastName}", // //An extention method written to grab the Authors age // Age = DateTimeOffSetExtensions.GetCurrentAge(a.DateOfBirth), // MainCategory = a.MainCategory, // Courses = a.Courses, // }); // return body format for the Api with right statusCode return(Ok(new JsonResponse <AuhtorDTO>() { Success = true, Results = auhtors })); } catch (Exception ex) { //log ex var path = HttpContext.Request.Path; var query = HttpContext.Request.QueryString; var pathAndQuery = path + query; var messg = _courseLibrary.LogErrorMessage(ex.Message, pathAndQuery); return(Ok(new JsonResponse <string>() { Success = false, ErrorMessage = "Sorry, something just went wrong while processing your request! Pls Try Again." })); //return StatusCode(500, messg); } // return Ok(GetAllAuthors); }