public async Task <IHttpActionResult> Post([FromBody] CreateReservationInfo model) { var route = DB.Routes.Find(model.RouteId); var wallet = DB.Wallet.Find(model.WalletId); if (route == null || wallet == null) { return(NotFound()); } if (Helpers.RouteHelpers.Categorize(route.DepartureTime, route.ArrivalTime) != Helpers.BusRouteState.Pending) { return(BadRequest("Reservation cannot be booked at this time!")); } // Check seat has been booked already var seats = model.Seats.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (seats.Length == 0) { return(BadRequest("No seats booked!")); } // Check for already booked seats List <int> bookedSeats = new List <int>(); foreach (var seatBooking in DB.Reservations.Where(x => !x.Cancelled && x.RouteId == model.RouteId).Select(x => x.Seats).ToArray()) { bookedSeats.AddRange(seatBooking.Split(',').Select(x => int.Parse(x)).ToArray()); } // var intersecting = seats.Select(x => int.Parse(x)).Intersect(bookedSeats); if (intersecting.Count() > 0) { return(BadRequest($"The seat(s) {string.Join(",", intersecting)} {(intersecting.Count() == 1 ? "has" : "have")} already been booked!")); } var user = DB.Users.Find(UserId); var rCount = DB.Reservations.Count().ToString(); var reservation = new BookReservation() { RouteId = model.RouteId, Route = route, Seats = model.Seats, ReferenceNo = $"{Guid.NewGuid().ToString("N").Substring(0, 3)}{ (rCount.Length < 3 ? rCount.PadLeft(3, '0') : rCount.Substring(rCount.Length - 3))}", PickupLocation = model.PickupLocation, User = user, }; user.Reservations.Add(reservation); var finalCost = route.Cost * seats.Length; var gatewayCharges = (await payment.CalculateCharges(finalCost, wallet, TransactionType.Charge)); // Charge for reservation here var txn = await payment.Charge(new ChargeOptions() { Amount = finalCost + gatewayCharges, FeesOnCustomer = true, AdditionalToken = model.AdditionalToken, Email = user.Email, Name = user.FullName, RefLocal = $"BKS-{Guid.NewGuid().ToString("N").Substring(0, 12)}", // UnitSeatCost = route.Cost, TotalSeats = seats.Length, GatewayCharges = gatewayCharges }, wallet); // Set reservation txn.Reservation = reservation; reservation.Transactions.Add(txn); DB.SaveChanges(); // if (txn.Status == TransactionStatus.Successful) { await payNotification.OnPaymentSuccessul(reservation, txn); } else if (txn.Status == TransactionStatus.Failed) { await payNotification.OnPaymentFail(reservation, txn); } // return(ResponseMessage(Request.CreateResponse(HttpStatusCode.Created, Map <ReservationInfo>(reservation)))); }
public static IEndpoint CreateReservation(CreateReservationInfo reservation) => new ApiEndpoint(BaseUri, HttpMethod.Post, reservation);