public async Task <IActionResult> StartRental([FromBody] CreateRentalResource resource) { if (!ModelState.IsValid) { return(BadRequest(ModelState.GetErrorMessages())); } try { ValidateToken(resource.UserId.Value, resource.Token); } catch (Exception e) { return(Unauthorized(e.Message)); } Vehicle availableVehicle = await _vehicleRepository.GetAvailableVehicleAsync(resource.VehicleType.Value); if (availableVehicle == null) { return(NotFound("No vehicles available")); } User client = await _userRepository.GetById(resource.UserId.Value); if (client == null) { return(NotFound("User doesn't exist")); } Rental rental = await FillRentalData(resource, availableVehicle); RentalRepositoryResponse result = await _rentalRepository.SaveAsync(rental); if (!result.Success) { return(BadRequest(result.Message)); } SetVehicleAsRented(availableVehicle); RentalStartResource rentalResource = _mapper.Map <Rental, RentalStartResource>(result.Rental); rentalResource.UserName = client.Name; rentalResource.VehicleLincesePlate = availableVehicle.LicensePlate; AddPointsToClient(client, availableVehicle); return(Ok(rentalResource)); }
private async Task <Rental> FillRentalData(CreateRentalResource resource, Vehicle vehicle) { int initialPayment = await CalculateRentalCost(vehicle, resource.Days.Value); Rental rental = _mapper.Map <CreateRentalResource, Rental>(resource); rental.VehicleId = vehicle.Id; rental.UserId = resource.UserId.Value; rental.DaysRented = resource.Days.Value; rental.Returned = false; rental.InitialPayment = initialPayment; rental.StartDate = resource.Date.Value.Date; return(rental); }