public async Task <IActionResult> Park(ParkParkedVehicleViewModel viewModel) { var parkSpots = ParkingSpotContainer.GetParkSpots(_configuration); if (ModelState.IsValid) { var vehicle = new ParkedVehicle(); vehicle.VehicleTypeId = int.Parse(Request.Form["Type"].ToString()); if (vehicle.VehicleTypeId == 0) { throw new ArgumentException("The value of the SelectItem selected was zero."); } var member = TempDataExtensions.Get <Member>(TempData, "member"); vehicle.MemberId = member.MemberId; PopulateVehicleFromViewModel(viewModel, vehicle); await ParkVehicleInBackend(parkSpots, vehicle); vehicle.IsParked = true; _context.Add(vehicle); await _context.SaveChangesAsync(); return(RedirectToAction(nameof(Index))); } return(View()); }
public async Task <IActionResult> UnParkConfirmed(string RegNum) { var vehicle = await _context.ParkedVehicles.FindAsync(RegNum); var vehicleType = await _context.VehicleTypes.FirstOrDefaultAsync(t => t.Id == vehicle.VehicleTypeId); var spotsRequired = GetRequiredNumberOfSpots(vehicleType); if (vehicle != null) { vehicle.IsParked = false; _context.Update(vehicle); await _context.SaveChangesAsync(); } else { throw new ArgumentNullException(nameof(vehicle), "The vehicle could not be found in the database."); } ParkSpot spot; // TODO: More elegant solution without extra calls to FindSpotByVehicle for (var i = 0; i < spotsRequired; i++) { spot = ParkingSpotContainer.FindSpotByVehicle(vehicle); spot.Unpark(vehicle); } TempDataExtensions.Set(TempData, "vehicle", vehicle); TempData.Keep(); return(RedirectToAction(nameof(ParkingReceipt))); }
private void InitializeParkSpots() { var vehicles = _context.ParkedVehicles.ToList(); for (var i = 0; i < vehicles.Count(); i++) { if (vehicles[i].VehicleTypeId == _context.VehicleTypes.FirstOrDefault(v => v.Name == "Truck").Id) { ParkOnMultipleSpots(vehicles[i], 3); } else { if (vehicles[i].VehicleTypeId == _context.VehicleTypes.FirstOrDefault(v => v.Name == "Bus").Id) { ParkOnMultipleSpots(vehicles[i], 2); } else { var vehicleIsMotorcycle = vehicles[i].VehicleTypeId == _context.VehicleTypes.FirstOrDefault(v => v.Name == "Motorcycle").Id; var spot = ParkingSpotContainer.GetAvailableSpot(parkSpots, vehicleIsMotorcycle); spot.Park(vehicles[i]); spot.VehicleCount += 1; spot.HasMotorcycles = vehicleIsMotorcycle; parkSpots[spot.Id] = spot; } } } ParkingSpotContainer.IsInitialized = true; }
private void ParkOnMultipleSpots(ParkedVehicle vehicle, int spotsRequired) { int startOfSpotSequence; if (ParkingSpotContainer.FindConsecutiveSpots(spotsRequired, out startOfSpotSequence)) { var spots = ParkingSpotContainer.ParkOnMultipleSpots(startOfSpotSequence, spotsRequired, vehicle); var n = 0; for (var i = startOfSpotSequence; i < startOfSpotSequence + spotsRequired; i++) { parkSpots[i] = spots[n]; n++; } } }
public async Task <IActionResult> RePark(string registrationNumber) { var vehicle = await _context.ParkedVehicles.FirstOrDefaultAsync(v => v.RegistrationNumber.Equals(registrationNumber)); if (vehicle == null) { TempData.Keep(); return(RedirectToAction(nameof(Park))); } vehicle.ParkingDate = DateTime.Now; vehicle.IsParked = true; var parkSpots = ParkingSpotContainer.GetParkSpots(_configuration); await ParkVehicleInBackend(parkSpots, vehicle); try { _context.Update(vehicle); await _context.SaveChangesAsync(); return(RedirectToAction(actionName: "Index", controllerName: "Vehicles")); } catch (DbUpdateConcurrencyException) { if (await _context.ParkedVehicles.FirstOrDefaultAsync(v => v.RegistrationNumber == registrationNumber) == null) { TempData.Keep(); return(RedirectToAction(nameof(Park))); } else { throw; } } return(View()); }
private async Task ParkVehicleInBackend(ParkSpot[] parkSpots, ParkedVehicle vehicle) { var vehicleType = await _context.VehicleTypes.Where(v => v.Id == vehicle.VehicleTypeId).FirstOrDefaultAsync(); int numberRequired = GetRequiredNumberOfSpots(vehicleType); int startOfSpotSequence; if (vehicleType.Name == "Motorcycle") { { var spot = ParkingSpotContainer.GetAvailableSpot(parkSpots, true); if (spot != null) { spot.Park(vehicle); spot.VehicleCount++; spot.HasMotorcycles = true; } } } else if (vehicleType.Name != "Motorcycle" && ParkingSpotContainer.FindConsecutiveSpots(numberRequired, out startOfSpotSequence)) { ParkingSpotContainer.ParkOnMultipleSpots(startOfSpotSequence, numberRequired, vehicle); } }
public SpotStatusViewComponent(GarageContext context, IConfiguration configuration) { _context = context; _configuration = configuration; parkSpots = ParkingSpotContainer.GetParkSpots(configuration); }