Beispiel #1
0
        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));
        }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        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
                }));
            }
        }
Beispiel #4
0
        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);
        }