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}")); } }
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); }
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); }
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)); }