Beispiel #1
0
        public async Task <IActionResult> AddRequest([FromBody] RideRequestDto request)
        {
            if (request == null)
            {
                return(BadRequest("Invalid parameter"));
            }
            var userDto = await _userRepository.GetLoggedInUser(User);

            request.PassengerEmail = userDto.Email;
            string email = _rideLogic.GetRideById(request.RideId).DriverEmail;

            if (email == null)
            {
                return(BadRequest("Invalid parameter"));
            }

            bool result = _requestLogic.AddRequest(request, email);

            if (result)
            {
                return(Ok());
            }
            else
            {
                return(BadRequest("Operation failed"));
            }
        }
Beispiel #2
0
        public bool UpdateRequest(RideRequestDto request)
        {
            request.SeenByPassenger = false;
            var isUpdated = _rideRequestRepository.UpdateRequest(_mapper.Map <RideRequestDto, RideRequest>(request));

            if (isUpdated && request.Status == Dto.Status.ACCEPTED)
            {
                var entityRequest = _rideRequestRepository.GetRequestById(request.RequestId);
                var rideToUpdate  = _rideLogic.GetRideById(request.RideId);
                if (rideToUpdate.NumberOfSeats != 0)
                {
                    var added = _passengerLogic.AddPassenger(new PassengerDto {
                        Email = entityRequest.PassengerEmail, RideId = request.RideId, Completed = false
                    });
                    if (added)
                    {
                        rideToUpdate.NumberOfSeats--;
                        var updatedSeats = _rideLogic.UpdateRide(rideToUpdate);
                    }
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            return(isUpdated);
        }
Beispiel #3
0
        public ActionResult Create([FromBody] RideRequestDto request)
        {
            if (LoggedInUserId == null)
            {
                return(BadRequest("Invalid user id"));
            }

            // check usertype == 'passenger'
            if (LoggedInUserType != Constants.Passenger)
            {
                return(BadRequest("Invalid user type"));
            }

            // todo: put all the Context calls in a try/catch block like in UsersController/Post function

            // Business rule
            var anyActiveRides = RideService.Count(r =>
                                                   r.PassengerId == LoggedInUserId &&
                                                   (r.RideStatus == RideStatus.Requested || r.RideStatus == RideStatus.Accepted || r.RideStatus == RideStatus.PickedUp)) > 0;

            if (anyActiveRides)
            {
                return(BadRequest("User already has an active ride. Can't request another ride."));
            }

            var fromAddress = new Address
            {
                FormattedAddress = request.PickupAddress.FormattedAddress,
                Latitude         = request.PickupAddress.Latitude.Value,
                Longitude        = request.PickupAddress.Longitude.Value
            };

            AddressService.Create(fromAddress);

            var toAddress = new Address
            {
                FormattedAddress = request.DropoffAddress.FormattedAddress,
                Latitude         = request.DropoffAddress.Latitude.Value,
                Longitude        = request.DropoffAddress.Longitude.Value
            };

            AddressService.Create(toAddress);

            var ride = new Ride
            {
                PassengerId = LoggedInUserId.Value,
                FromAddress = fromAddress,
                ToAddress   = toAddress,
                Requested   = DateTime.UtcNow,
                RideStatus  = RideStatus.Requested
            };
            var rideId = RideService.Create(ride);

            return(Ok(new CreateResponse {
                Id = rideId
            }));
        }
Beispiel #4
0
        public void AddRequest(RideRequestDto requestDto)
        {
            var ride = _rideLogic.GetRideById(requestDto.RideId);

            if (ride.DriverEmail == requestDto.PassengerEmail)
            {
                throw new UnauthorizedAccessException();
            }

            if (ride == null)
            {
                throw new RideNoLongerExistsException();
            }

            if (ride.NumberOfSeats <= 0)
            {
                throw new NoSeatsInRideException();
            }

            if (ride.RideDateTime < DateTime.Now)
            {
                throw new ArgumentException();
            }

            if (_rideLogic.IsRideRequested(requestDto.RideId, requestDto.PassengerEmail))
            {
                throw new AlreadyRequestedException();
            }

            requestDto.SeenByDriver    = false;
            requestDto.SeenByPassenger = true;
            requestDto.DriverEmail     = ride.DriverEmail;
            int addressId = _addressLogic.GetAddressId(requestDto.Address);

            if (addressId == -1)
            {
                throw new ArgumentException("Failed to get address id");
            }

            requestDto.AddressId = addressId;
            var entity = _rideRequestRepository.AddRequest(_mapper.Map <RideRequestDto, RideRequest>(requestDto));

            var driverNote = _driverNoteLogic.GetNoteByRide(requestDto.RideId);


            _driverSeenNoteReposiotory.AddNote(new DriverSeenNote {
                RideRequestId = entity.RideRequestId, DriverNoteId = driverNote.DriverNoteId
            });

            if (requestDto.RequestNote != null)
            {
                _rideRequestNoteLogic.AddNote(new RideRequestNoteDto {
                    RideRequestId = entity.RideRequestId, Text = requestDto.RequestNote
                });
            }
        }
Beispiel #5
0
        public IActionResult UpdateRequests([FromBody] RideRequestDto request)
        {
            if (request == null)
            {
                return(BadRequest());
            }

            _requestLogic.UpdateRequest(request);

            return(Ok());
        }
        public void UpdateRequest(RideRequestDto request)
        {
            var entityRequest  = _rideRequestRepository.GetRequestById(request.RideRequestId);
            var previousStatus = _mapper.Map <Db.Entities.Status, Dto.Status>(entityRequest.Status);

            if (request.Status == previousStatus)
            {
                return; // Should exception be thrown ? This is unexpected behavior, though returning prevents any undesired consequences
            }

            if (request.Status == Dto.Status.CANCELED)
            {
                request.SeenByDriver    = false;
                request.SeenByPassenger = true;
            }
            else
            {
                request.SeenByDriver    = true;
                request.SeenByPassenger = false;
            }
            var rideToUpdate = _rideLogic.GetRideById(request.RideId);

            if (request.Status == Dto.Status.ACCEPTED && previousStatus == Dto.Status.WAITING)
            {
                if (rideToUpdate.NumberOfSeats != 0)
                {
                    if (_passengerLogic.IsUserAlreadyAPassenger(request.RideId, entityRequest.PassengerEmail))
                    {
                        throw new AlreadyAPassengerException();
                    }
                    else
                    {
                        _passengerLogic.AddPassenger(new PassengerDto {
                            Email = entityRequest.PassengerEmail, RideId = request.RideId, Completed = false
                        });
                        rideToUpdate.NumberOfSeats--;
                        _rideLogic.UpdateRide(rideToUpdate);
                    }
                }
                else
                {
                    throw new NoSeatsInRideException();
                }
            }
            else if (request.Status == Dto.Status.CANCELED && previousStatus == Dto.Status.ACCEPTED)
            {
                _passengerLogic.RemovePassenger(entityRequest.PassengerEmail, request.RideId);
                rideToUpdate.NumberOfSeats++;
                _rideLogic.UpdateRide(rideToUpdate);
            }
            _rideRequestRepository.UpdateRequest(_mapper.Map <RideRequestDto, RideRequest>(request));
        }
Beispiel #7
0
        public bool AddRequest(RideRequestDto requestDto, string driverEmail)
        {
            requestDto.SeenByDriver    = false;
            requestDto.SeenByPassenger = true;
            requestDto.DriverEmail     = driverEmail;
            int addressId = _addressLogic.GetAddressId(new AddressDto {
                City = requestDto.City, Street = requestDto.Street, Number = requestDto.HouseNumber, Longtitude = requestDto.Longtitude, Latitude = requestDto.Latitude
            });

            requestDto.AddressId = addressId;
            var isCreated = _rideRequestRepository.AddRequest(_mapper.Map <RideRequestDto, RideRequest>(requestDto));

            return(isCreated);
        }
        public async Task <IActionResult> AddRequest([FromBody] RideRequestDto request)
        {
            if (request == null)
            {
                return(BadRequest());
            }
            var userDto = await _userLogic.GetLoggedInUser();

            request.PassengerEmail = userDto.Email;

            _requestLogic.AddRequest(request);

            return(Ok());
        }
Beispiel #9
0
        public IActionResult UpdateRequests([FromBody] RideRequestDto request)
        {
            if (request == null)
            {
                return(BadRequest("Invalid parameter"));
            }

            bool result = _requestLogic.UpdateRequest(request);

            if (result)
            {
                return(Ok());
            }
            else
            {
                return(BadRequest("Operation failed"));
            }
        }
Beispiel #10
0
        public async Task <IActionResult> AddRequest([FromBody] RideRequestDto request)
        {
            if (request == null)
            {
                return(BadRequest());
            }
            var userDto = await _userRepository.GetLoggedInUser(User);

            request.PassengerEmail = userDto.Email;
            var ride = _rideLogic.GetRideById(request.RideId);

            if (ride == null)
            {
                throw new RideNoLongerExistsException();
            }

            _requestLogic.AddRequest(request, ride.DriverEmail);

            return(Ok());
        }
Beispiel #11
0
        public void UpdateRequest(RideRequestDto request, string userEmail)
        {
            var entityRequest  = _rideRequestRepository.GetRequestById(request.RideRequestId);
            var previousStatus = _mapper.Map <Db.Entities.Status, Dto.Status>(entityRequest.Status);

            if (entityRequest.DriverEmail != userEmail && entityRequest.PassengerEmail != userEmail)
            {
                throw new UnauthorizedAccessException();
            }

            var driver = userEmail == entityRequest.DriverEmail;

            if (driver)
            {
                if (request.Status == Dto.Status.WAITING ||
                    request.Status == Dto.Status.CANCELED ||
                    previousStatus == Dto.Status.DELETED ||
                    previousStatus == Dto.Status.DENIED ||
                    (previousStatus == Dto.Status.ACCEPTED && request.Status == Dto.Status.DENIED))
                {
                    throw new UnauthorizedAccessException();
                }
            }
            else
            {
                if (request.Status != Dto.Status.CANCELED)
                {
                    throw new UnauthorizedAccessException();
                }
            }

            if (request.Status == previousStatus)
            {
                return;
            }

            if (request.Status == Dto.Status.CANCELED)
            {
                request.SeenByDriver    = false;
                request.SeenByPassenger = true;
            }
            else
            {
                request.SeenByDriver    = true;
                request.SeenByPassenger = false;
            }
            var rideToUpdate = _rideLogic.GetRideById(request.RideId);

            if (request.Status == Dto.Status.ACCEPTED && previousStatus == Dto.Status.WAITING)
            {
                if (rideToUpdate.NumberOfSeats != 0)
                {
                    if (_passengerLogic.IsUserAlreadyAPassenger(request.RideId, entityRequest.PassengerEmail))
                    {
                        throw new AlreadyAPassengerException();
                    }
                    else
                    {
                        _passengerLogic.AddPassenger(new PassengerDto {
                            Email = entityRequest.PassengerEmail, RideId = request.RideId, Completed = false
                        });
                        rideToUpdate.NumberOfSeats--;
                        _rideLogic.UpdateRide(rideToUpdate);
                    }
                }
                else
                {
                    throw new NoSeatsInRideException();
                }
            }
            else if (request.Status == Dto.Status.CANCELED && previousStatus == Dto.Status.ACCEPTED)
            {
                _passengerLogic.RemovePassenger(entityRequest.PassengerEmail, request.RideId);
                rideToUpdate.NumberOfSeats++;
                _rideLogic.UpdateRide(rideToUpdate);
            }
            _rideRequestRepository.UpdateRequest(_mapper.Map <RideRequestDto, RideRequest>(request));
        }