예제 #1
0
        public async Task <Result <TicketsResult> > HandlePurchase(TicketsOptions options)
        {
            try
            {
                var tickets = await _ticketsService.ReserveTickets(options, true);

                var city = await _cityService.GetCity(options.DepartureCityId);

                var result = new TicketsResult
                {
                    Tickets = tickets.Select(x => _mapper.Map <TicketDto>(x)), PlacesToBuy = city.Stations.Select(x => x.Name)
                };
                return(Result.Ok(result));
            }
            catch (DbUpdateConcurrencyException ex)
            {
                return(Result.Fail <TicketsResult>(HttpStatusCode.InternalServerError,
                                                   $"Sorry! It seems that your seats are already busy."));
            }
            catch (Exception ex)
            {
                return(Result.Fail <TicketsResult>(HttpStatusCode.InternalServerError,
                                                   $"Something went wrong. Please repeat the operation. {ex.Message}"));
            }
        }
예제 #2
0
        public async Task <IEnumerable <Ticket> > ReserveTickets(TicketsOptions options, bool isPurchasing)
        {
            var tickets = new List <Ticket>();

            await using (_context)
            {
                var routePoints = await _context.RoutePoints.AsNoTracking().Include(x => x.Station.City).ToListAsync();

                var run = await _context.Runs.AsNoTracking().FirstOrDefaultAsync(x => x.Id == options.RunId);

                var         arrivalRoutePoint   = routePoints.First(x => x.Station.CityId == options.ArrivalCityId);
                var         departureRoutePoint = routePoints.First(x => x.Station.CityId == options.DepartureCityId);
                Reservation reservation         = null;
                if (!isPurchasing)
                {
                    reservation = new Reservation();
                    DateTime cancelReservationDateTime = DateTime.UtcNow + _context.Configuration.First().CancelReservationOffset;
                    if (cancelReservationDateTime > run.RunTime)
                    {
                        cancelReservationDateTime = run.RunTime;
                    }

                    reservation.CancelReservationDateTime = cancelReservationDateTime;
                    reservation.Number = Guid.NewGuid();
                    await _context.Reservations.AddAsync(reservation);
                }

                foreach (var passenger in options.PassengersData)
                {
                    tickets.Add(new Ticket
                    {
                        PassengerName         = passenger.FullName,
                        SeatId                = passenger.SeatId,
                        Number                = Guid.NewGuid(),
                        RunId                 = options.RunId,
                        HasLinen              = options.HasLinen,
                        ArrivalRoutePointId   = arrivalRoutePoint.Station.CityId,
                        DepartureRoutePointId = departureRoutePoint.Station.CityId,
                        ArrivalDateTime       = run.RunTime + arrivalRoutePoint.ArrivalOffset,
                        DepartureDateTime     = run.RunTime + arrivalRoutePoint.DepartureOffset,
                        ArrivalRoutePoint     = arrivalRoutePoint,
                        DepartureRoutePoint   = departureRoutePoint,
                        Run           = run,
                        IsPurchased   = isPurchasing,
                        Reservation   = reservation,
                        ReservationId = reservation?.Id
                    });
                }

                await _context.Tickets.AddRangeAsync(tickets);

                await _context.SaveChangesAsync();
            }

            return(tickets);
        }
예제 #3
0
        public async Task GetAvailableTickets()
        {
            var options = new TicketsOptions
            {
                RunId          = 1,
                PassengersData = new List <Passenger>()
                {
                    new Passenger()
                    {
                        SeatId = 4, FullName = "First"
                    }, new Passenger()
                    {
                        SeatId = 5, FullName = "Second"
                    }
                },
                DepartureCityId = 3, ArrivalCityId = 5
            };
            var result = await InvokeApi <TicketsResult>(BuildUrl(ApiMethod), "POST", Serialize(options));

            Assert.IsNotEmpty(result.Tickets);
        }
예제 #4
0
        public async Task <IActionResult> PurchaseTickets(TicketsOptions options)
        {
            if (options == null)
            {
                return(ErrorResult(HttpStatusCode.BadRequest, "Options can not be null."));
            }

            if (options.RunId == 0 || options.PassengersData?.Any() == false || options.ArrivalCityId == 0 || options.DepartureCityId == 0)
            {
                return(ErrorResult(HttpStatusCode.BadRequest, "Request parameters missing or have incorrect format"));
            }

            var handler = new TicketsHandler(_ticketsService, _mapper, _cityService);
            var result  = await handler.HandlePurchase(options);

            if (result.IsFailure)
            {
                return(FromResult(result));
            }

            return(Ok(result.Value));
        }