Exemple #1
0
        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));
        }
Exemple #2
0
        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);
        }