public PagedList <Event> GetEvents(EventsResourceParameters eventsResourceParameters) { if (eventsResourceParameters == null) { throw new ArgumentNullException(nameof(eventsResourceParameters)); } IQueryable <Event> events = _dataContext.Events as IQueryable <Event>; if (!string.IsNullOrWhiteSpace(eventsResourceParameters.Name)) { var name = eventsResourceParameters.Name.Trim(); events = events.Where(x => x.Name == name); } if (!string.IsNullOrWhiteSpace(eventsResourceParameters.SearchQuery)) { var searchQuery = eventsResourceParameters.SearchQuery.Trim(); events = events.Where(x => x.Name.Contains(searchQuery) || x.Purpose.Contains(searchQuery) || x.Note.Contains(searchQuery)); } if (!string.IsNullOrWhiteSpace(eventsResourceParameters.OrderBy)) { var eventPropertyMappingDictionary = _propertyMappingService.GetPropertyMapping <EventDto, Event> (); events = events.ApplySort(eventsResourceParameters.OrderBy, eventPropertyMappingDictionary); } return(PagedList <Event> .Create(events, eventsResourceParameters.PageNumber, eventsResourceParameters.PageSize)); }
public IActionResult GetEvents([FromQuery] EventsResourceParameters eventsResourceParameters, [FromHeader(Name = "Accept")] string mediaType) { if (!MediaTypeHeaderValue.TryParse(mediaType, out MediaTypeHeaderValue parsedMediaType)) { return(BadRequest(new { message = "Accept header mediaType is not allowed" })); } if (!_propertyMappingService.ValidMappingExistsFor <EventDto, Event> (eventsResourceParameters.OrderBy)) { return(BadRequest()); } if (!_propertyCheckerService.TypeHasProperties <EventDto> (eventsResourceParameters.Fields)) { return(BadRequest()); } var events = _eventRepository.GetEvents(eventsResourceParameters); var paginationMetadata = new { totalCount = events.TotalCount, pageSize = events.PageSize, currentPage = events.CurrentPage, totalPages = events.TotalPages }; Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata)); var links = CreateLinksForEvents(eventsResourceParameters, events.HasNext, events.HasPrevious); var shapeEvents = _mapper.Map <IEnumerable <EventDto> > (events).ShapeData(eventsResourceParameters.Fields); if (parsedMediaType.MediaType == "application/vnd.marvin.hateoas+json") { var shapeEventsWithLinks = shapeEvents.Select(evt => { var eventAsDictionary = evt as IDictionary <string, object>; var eventLinks = CreateLinksForEvent((Guid)eventAsDictionary["Id"], null); eventAsDictionary.Add("links", eventLinks); return(eventAsDictionary); }); var linkedCollectionResource = new { value = shapeEventsWithLinks, links, }; return(Ok(linkedCollectionResource)); } return(Ok(shapeEvents)); }
private string CreateEventResourceUri(EventsResourceParameters eventsResourceParameters, ResourceUriType type) { switch (type) { case ResourceUriType.PreviousPage: return(Url.Link("GetEvents", new { fields = eventsResourceParameters.Fields, orderBy = eventsResourceParameters.OrderBy, pageNumber = eventsResourceParameters.PageNumber - 1, pageSize = eventsResourceParameters.PageSize, name = eventsResourceParameters.Name, searchQuery = eventsResourceParameters.SearchQuery })); case ResourceUriType.NextPage: return(Url.Link("GetEvents", new { fields = eventsResourceParameters.Fields, orderBy = eventsResourceParameters.OrderBy, pageNumber = eventsResourceParameters.PageNumber + 1, pageSize = eventsResourceParameters.PageSize, name = eventsResourceParameters.Name, searchQuery = eventsResourceParameters.SearchQuery })); case ResourceUriType.Current: default: return(Url.Link("GetEvents", new { fields = eventsResourceParameters.Fields, orderBy = eventsResourceParameters.OrderBy, pageNumber = eventsResourceParameters.PageNumber, pageSize = eventsResourceParameters.PageSize, name = eventsResourceParameters.Name, searchQuery = eventsResourceParameters.SearchQuery })); } }
private IEnumerable <LinkDto> CreateLinksForEvents(EventsResourceParameters eventsResourceParameters, bool hasNext, bool hasPrevious) { var links = new List <LinkDto> (); // self links.Add( new LinkDto(CreateEventResourceUri( eventsResourceParameters, ResourceUriType.Current), "self", "GET")); if (hasNext) { links.Add( new LinkDto(CreateEventResourceUri(eventsResourceParameters, ResourceUriType.NextPage), "nextPage", "GET")); } if (hasPrevious) { links.Add( new LinkDto(CreateEventResourceUri(eventsResourceParameters, ResourceUriType.PreviousPage), "previousPage", "GET")); } return(links); }