Пример #1
0
        public static ReadRideDTO InsertRide(CreateRideDTO dto)
        {
            try
            {
                if (!Validate(dto))
                {
                    return(null);
                }

                Ride newRide = CreateRideDTO.FromDTO(dto);
                newRide.Id = Guid.NewGuid().ToString();

                RideRelationship rel = new RideRelationship(newRide, dto.CarrierId);

                var query = DataLayer.Client.Cypher
                            .Create("(ride : Ride {newRide})")
                            .WithParam("newRide", newRide)
                            .With("ride")
                            .Match("(takeOf: Station)", "(arrival: Station)", "(carrier: Carrier)")
                            .Where((Station takeOf) => takeOf.Id == dto.TakeOfStationId)
                            .AndWhere((Station arrival) => arrival.Id == dto.ArrivalStationId)
                            .AndWhere((Carrier carrier) => carrier.Id == dto.CarrierId)
                            .Create("(ride) <- [: TAKES_OF] - (takeOf)")
                            .Create("(ride) - [: ARRIVES] -> (arrival)")
                            .Create("(ride) - [: CARRIER] -> (carrier)")
                            .Create("(takeOf) - [r: RIDE {rideRel}] -> (arrival)")
                            .WithParam("rideRel", rel)
                            .Return((ride, arrival, takeOf, carrier) => new BusinessRide()
                {
                    Ride           = ride.As <Ride>(),
                    Carrier        = carrier.As <Carrier>(),
                    ArrivalStation = arrival.As <Station>(),
                    TakeOfStation  = takeOf.As <Station>()
                }).Results;

                if (query != null && query.Count() > 0)
                {
                    var ride        = query.ToList();
                    var carrierName = ride[0].Carrier.Name;
                    var q           = DataLayer.Client.Cypher
                                      .Match("(takeOf:Station) - [r: RIDE] -> (arrival:Station)")
                                      .Where((RideRelationship r) => r.Id == newRide.Id)
                                      .Set("r.CarrierName = {carrierName}")
                                      .WithParam("carrierName", carrierName)
                                      .Return <RideRelationship>("r")
                                      .Results;

                    if (q != null)
                    {
                        RedisRideDataProvider.InsertRide(newRide.Id, newRide.NumberOfSeats);
                        return(new ReadRideDTO(ride[0]));
                    }
                }
                return(null);
            }
            catch (Exception e)
            {
                return(null);
            }
        }
Пример #2
0
 private static bool Validate(CreateRideDTO dto)
 {
     if (dto.ArrivalStationId == dto.TakeOfStationId)
     {
         return(false);
     }
     //if (StationDataProvider.Get(dto.ArrivalStationId) == null)
     //    return false;
     //if (StationDataProvider.Get(dto.TakeOfStationId) == null)
     //    return false;
     //if (CarrierDataProvider.GetCarrier(dto.CarrierId) == null)
     //    return false;
     if (dto.RidePrice <= 0 || dto.NumberOfSeats <= 0)
     {
         return(false);
     }
     return(true);
 }
Пример #3
0
 // POST: api/Ride
 public ReadRideDTO Post([FromBody] CreateRideDTO value)
 {
     return(RideDataProvider.InsertRide(value));
 }
Пример #4
0
        public RideReturnDTO Post([FromBody] CreateRideDTO rideInfo)
        {
            if (!UserPrincipal.IsCustomer && !UserPrincipal.IsDispatcher)
            {
                throw new HttpResponseException(HttpStatusCode.Unauthorized);
            }

            Ride ride = new Ride()
            {
                CarType       = rideInfo.CarType,
                StartLocation = rideInfo.Location,
                Destination   = new Location(),
                Date          = DateTime.Now,
                Amount        = 0
            };


            if (rideInfo.Location.X == 0 && rideInfo.Location.Y == 0)
            {
                return(new RideReturnDTO()
                {
                    IsSuccess = false,
                    Message = $"Please select location from map"
                });
            }

            if (UserPrincipal.IsDispatcher)
            {
                Driver driver = uow.UserRepository.GetByID(rideInfo.DriverId) as Driver;
                if (driver == null)
                {
                    return(new RideReturnDTO()
                    {
                        IsSuccess = false,
                        Message = $"No driver with {rideInfo.DriverId}"
                    });
                }

                if (!driver.IsFree())
                {
                    return(new RideReturnDTO()
                    {
                        IsSuccess = false,
                        Message = $"Driver is not free to accept new ride"
                    });
                }

                ride.DriverId = driver.Id;
                ride.Driver   = driver;

                ride.DispatcherId = UserPrincipal.CurrentUser.Id;

                ride.Status = RideStatus.Formed;
            }
            else if (UserPrincipal.IsCustomer)
            {
                if (!(uow.UserRepository.GetByID(UserPrincipal.CurrentUser.Id) as Customer).IsFree())
                {
                    return(new RideReturnDTO()
                    {
                        IsSuccess = false,
                        Message = $"Cannot start new ride before current is finished or canceled"
                    });
                }

                ride.Status     = RideStatus.Created;
                ride.CustomerId = UserPrincipal.CurrentUser.Id;
                ride.Customer   = uow.UserRepository.GetByID(UserPrincipal.CurrentUser.Id) as Customer;
            }

            ride = uow.RideRepository.Insert(ride);

            return(new RideReturnDTO()
            {
                IsSuccess = true,
                Ride = ride
            });
        }