Beispiel #1
0
        public async Task <IActionResult> GetAllShowtimesAsync([FromRoute] Guid movieId, [FromQuery] RequestParameters requestParameters, [FromHeader(Name = "Accept")] string mediaType)
        {
            if (!await _showtimeRepository.MovieExists(movieId))
            {
                return(NotFound());
            }

            if (string.IsNullOrWhiteSpace(requestParameters.OrderBy))
            {
                //  TODO: change to order by when playing
                requestParameters.OrderBy = "Id";
            }

            if (!_propertyMappingService.ValidMappingExistsFor <ShowtimeDto, Showtime>(requestParameters.Fields))
            {
                return(BadRequest());
            }

            if (!_typeHelperService.TypeHasProperties <ShowtimeDto>(requestParameters.Fields))
            {
                return(BadRequest());
            }

            var showtimesPagedList = await _showtimeRepository.GetAllShowtimesAsync(movieId, requestParameters.OrderBy, requestParameters.PageNumber, requestParameters.PageSize);

            var showtimes = Mapper.Map <IEnumerable <ShowtimeDto> >(showtimesPagedList);

            if (mediaType == "application/vnd.biob.json+hateoas")
            {
                return(Ok(CreateHateoasResponse(showtimesPagedList, requestParameters)));
            }
            else
            {
                var previousPageLink   = showtimesPagedList.HasPrevious ? CreateUrlForResource(requestParameters, PageType.PreviousPage) : null;
                var nextPageLink       = showtimesPagedList.HasNext ? CreateUrlForResource(requestParameters, PageType.NextPage) : null;
                var paginationMetadata = new PaginationMetadata()
                {
                    TotalCount       = showtimesPagedList.TotalCount,
                    PageSize         = showtimesPagedList.PageSize,
                    CurrentPage      = showtimesPagedList.CurrentPage,
                    TotalPages       = showtimesPagedList.TotalPages,
                    PreviousPageLink = previousPageLink,
                    NextPageLink     = nextPageLink
                };

                Response.Headers.Add("X-Pagination", Newtonsoft.Json.JsonConvert.SerializeObject(paginationMetadata));

                if (requestParameters.IncludeMetadata)
                {
                    var showtimesWithMetadata = new EntityWithPaginationMetadataDto <ShowtimeDto>(paginationMetadata, showtimes);
                    return(Ok(showtimesWithMetadata));
                }

                return(Ok(showtimes));
            }
        }
Beispiel #2
0
        public async Task <IActionResult> CreateTicketAsync([FromBody, SwaggerParameter(Description = "Values of the ticket to be created eg. which seat and what price", Required = true)] TicketToCreateDto ticketToCreateDto,
                                                            [FromHeader(Name = "Accept"), SwaggerParameter(Description = "Media type to return eg. json or json+hateoas")] string mediaType,
                                                            [FromRoute, SwaggerParameter(Description = "Id of the related movie", Required = true)] Guid movieId,
                                                            [FromRoute, SwaggerParameter(Description = "Id of the related showtime", Required = true)] Guid showtimeId)
        {
            if (!await _showtimeRepository.MovieExists(movieId))
            {
                return(NotFound());
            }

            if (!await _ticketRepository.ShowtimeExists(showtimeId))
            {
                return(NotFound());
            }



            if (ticketToCreateDto.SeatId == Guid.Empty)
            {
                return(BadRequest());
                //var availableSeat = await _seatRepository.GetFirstAvailableSeatByShowtimeIdAsync(showtimeId);
                //if (availableSeat == null)
                //{
                //    //Not sure if this is enough. Could be tested.
                //    _logger.LogError("No available seats");

                //}
                //ticketToCreateDto.SeatId = availableSeat.Id;
            }

            var ticket = Mapper.Map <Ticket>(ticketToCreateDto);


            ticket.ShowtimeId = showtimeId;

            ticket.Id = Guid.NewGuid();

            _ticketRepository.AddTicket(ticket);

            if (!await _ticketRepository.SaveChangesAsync())
            {
                _logger.LogError("Saving changes to database while creating a showtime failed");
            }

            var ticketDto = Mapper.Map <TicketDto>(ticket);

            if (mediaType == "application/vnd.biob.json+hateoas")
            {
                var links = CreateLinksForTickets(ticketDto.Id, null);

                var linkedTicket = ticketDto.ShapeData(null) as IDictionary <string, object>;

                linkedTicket.Add("links", links);

                return(CreatedAtRoute("GetTicket", new { ticketId = ticketDto.Id }, linkedTicket));
            }
            else
            {
                //Hmm why is dto used here when it's not in the other methods?
                return(CreatedAtRoute("GetTicket", new { ticketId = ticketDto.Id }, ticketDto));
            }
        }