/// <summary> /// The driver confirms that a passenger has boarded the vehicle. /// </summary> /// <param name="rideStatus">The id of the passenger's destination and the driver id.</param> /// <returns></returns> public async Task <bool> Board(RideStatusViewModel rideStatus) { try { var stateCompleted = _context.States.Where(stateSr => stateSr.Name == "Completed").FirstOrDefault(); var stateInTransit = _context.States.Where(stateSr => stateSr.Name == "In Transit").FirstOrDefault(); var ride = await _context.Destinations.FindAsync(rideStatus.RideId); if (ride == null) { return(false); } ride.StateId = stateInTransit.Id; _context.Entry(ride).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { throw; } return(true); } catch (Exception) { return(false); } }
public async Task <IActionResult> PostAcceptRide([FromBody] RideStatusViewModel rideAccept) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var ride = await _rideService.Accept(rideAccept); if (ride) { return(Ok(new { status = "success" })); } else { return(BadRequest()); } }
/// <summary> /// The driver accepts the ride for a passenger. /// We change the ride's state and decrement the current capacity for /// the driver's destination. /// </summary> /// <param name="rideId">The ride from the user.</param> /// <param name="driverId">The driver accepting the ride.</param> /// <returns></returns> public async Task <bool> Accept(RideStatusViewModel acceptRide) { try { var statePickup = _context.States.Where(stateSr => stateSr.Name == "To Pickup").FirstOrDefault(); var stateAwaitingPickup = _context.States.Where(stateSr => stateSr.Name == "Awaiting Pickup").FirstOrDefault(); var ride = await _context.Destinations.FindAsync(acceptRide.RideId); if (ride == null) { return(false); } ride.StateId = stateAwaitingPickup.Id; _context.Entry(ride).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { throw; } var destination = await _context.Destinations .Where(dest => dest.UserId == acceptRide.UserId && (dest.State.Name == "Awaiting Departure" || dest.State.Name == "In Transit" || dest.State.Name == "To Pickup") && dest.AvailableCapacity > 0) .FirstOrDefaultAsync(); if (destination == null) { return(false); } destination.AvailableCapacity -= 1; if (destination.State.Name != "To Pickup") { destination.State = statePickup; } _context.Entry(destination).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { throw; } } catch (Exception) { return(false); } return(true); }