/** * Get the matching request for the given request id. * * @param int $id * @return Response */ public function show($id) { //Unique namespace for request PMRequest. $request = PMRequest::find($id); //Not a valid request if (empty($request)) { return parent::InvalidRequestResponseHandler(); exit; } $request_pickup_times = $request->requestPickupTimes->toArray(); $request_pickup_times_array = array(); foreach ($request_pickup_times as $index => $vArray) { $request_pickup_times_array[] = $vArray['pickup_timestamp']; } $request_pickup_times_hash = array_flip($request_pickup_times_array); $time_filtered_requests = RequestPickupTimes::getRequestWithMatchingPickup($request_pickup_times_array, $id, $request->requester_id); //No requests matched, you want to suggest somthing to the user here if (empty($time_filtered_requests)) { return parent::NoRequestMatchResponseHandler(); exit; } $result = array(); foreach ($time_filtered_requests as $index => $request_info) { if (!isset($result[$request_info->request_id])) { $result[$request_info->request_id] = array(); } $result[$request_info->request_id]['pickup_time'][] = $request_info->pickup_timestamp; } $time_filtered_requests_ids = array_keys($result); //get source address for my request $source_address = $request->sourceAddress; //get destination address for my request. $destination_address = $request->destinationAddress; //Get spatial distance from MySQL for source address $requests_by_source_distance = EntityAddress::getDistanceAmongRequestsByTimeFilteredIds($time_filtered_requests_ids, $source_address->lat, $source_address->lng, "source_address_id", $request_pickup_times_hash); $requests_by_destination_distance = EntityAddress::getDistanceAmongRequestsByTimeFilteredIds($time_filtered_requests_ids, $destination_address->lat, $destination_address->lng, "destination_address_id", $request_pickup_times_hash); $gdm_request_source = EntityAddress::getCSVForLatLong($source_address); $gdm_request_destination = EntityAddress::getCSVForLatLong($destination_address); $gdm_request_potential_source_matches = EntityAddress::getCSVForLatLong($requests_by_source_distance); $gdm_request_potential_destination_matches = EntityAddress::getCSVForLatLong($requests_by_destination_distance); $gdm_request_potential_source_matches = GoogleDistanceMatrixManager::get_distance_matrix($gdm_request_source, $gdm_request_potential_source_matches, Config::get('pm_constants.formats.array')); $gdm_request_potential_destination_matches = GoogleDistanceMatrixManager::get_distance_matrix($gdm_request_destination, $gdm_request_potential_destination_matches, Config::get('pm_constants.formats.array')); $api_response = PMRequest::formatAPIResponse($request, $source_address, $destination_address, $requests_by_source_distance, $requests_by_destination_distance, $gdm_request_potential_source_matches, $gdm_request_potential_destination_matches); return parent::ValidResponseHandler($api_response); }
/** * * @param Request $request User Request * @param $source_address User Request source address * @param $destination_address User Request destination address * @param array $source_spatial_data Estimates returned by MySQL spatial query for source matches * @param array $destination_spatial_data Estimates returned by MySQL spatial query for destination matches * @param $gdm_request_potential_source_matches array Estimates returned by Google Distance Matrix API Request for source matches * @param $gdm_request_potential_destination_matches array Estimates returned by Google Distance Matrix API Request for destination matches * @return array */ public static function formatAPIResponse($request, $source_address, $destination_address, array $source_spatial_data, array $destination_spatial_data, $gdm_request_potential_source_matches, $gdm_request_potential_destination_matches) { $api_response = array(); $source_address_matched_request_ids_map = array_flip(array_keys($source_spatial_data)); $destination_address_matched_request_ids_map = array_flip(array_keys($destination_spatial_data)); $ideal_matches = array(); $api_response['request_id'] = $request->id; $api_response['pickup_time'] = RequestPickupTimes::formatPickUpTimesForAPI($request->requestPickupTimes->toArray()); $api_response['request_source_address'] = $source_address->full_address_text; $api_response['request_destination_address'] = $destination_address->full_address_text; $source_matches = self::formatAddressForAPIResponse($source_spatial_data, $gdm_request_potential_source_matches, $ideal_matches); $destination_matches = self::formatAddressForAPIResponse($destination_spatial_data, $gdm_request_potential_destination_matches, $ideal_matches, $source_address_matched_request_ids_map); foreach ($ideal_matches as $index => $match_request_id) { $api_response['best_matches'][$index]['request_id'] = $match_request_id; $api_response['best_matches'][$index]['pickup_times'] = $source_spatial_data[$match_request_id]['request_pickup_times']; //This is really bad, need to change this $api_response['best_matches'][$index]['matched_source'] = $source_matches[$source_address_matched_request_ids_map[$match_request_id]]; $api_response['best_matches'][$index]['matched_destination'] = $destination_matches[$destination_address_matched_request_ids_map[$match_request_id]]; } return $api_response; }
/** * Store a newly created resource in storage. * * @param Request $request * @return Response */ public function store(Request $request) { sleep(3); //id of the user who is making the request $requester_id = Auth::user()->id; //Validate the request. $this->validate($request, array('pick-up-location' => 'required', 'drop-off-location' => 'required', 'pick-up-time' => 'required', 'sourceAddressComponents.lat' => 'required|max:90|min:-90', 'destinationAddressComponents.lat' => 'required|max:90|min:-90', 'sourceAddressComponents.lng' => 'required|max:180|min:-180', 'destinationAddressComponents.lng' => 'required|max:180|min:-180', 'destinationAddressComponents.country' => 'required|max:180|min:-180')); $source_lat = $request->input('sourceAddressComponents.lat', 0); $source_lng = $request->input('sourceAddressComponents.lng', 0); $destination_lat = $request->input('destinationAddressComponents.lat', 0); $destination_lng = $request->input('destinationAddressComponents.lng', 0); //Store mapping of address get the id $source_address = EntityAddress::firstOrCreate(array('full_address_text' => $request->input('pick-up-location', ''), 'street_name' => $request->input('sourceAddressComponents.street_number', ''), 'route' => $request->input('sourceAddressComponents.route', ''), 'locality' => $request->input('sourceAddressComponents.locality', ''), 'neighborhood' => $request->input('sourceAddressComponents.neighborhood', ''), 'administrative_area_level_2' => $request->input('sourceAddressComponents.administrative_area_level_2', ''), 'administrative_area_level_1' => $request->input('sourceAddressComponents.administrative_area_level_1', ''), 'country' => $request->input('sourceAddressComponents.country', ''), 'postal_zip' => $request->input('sourceAddressComponents.postal_code', ''), 'geo_location' => DB::raw("(GeomFromText('POINT({$source_lat} {$source_lng})'))"))); //Store mapping of destination address //if it already exists use that address id. $destination_address = EntityAddress::firstOrCreate(array('full_address_text' => $request->input('drop-off-location', ''), 'street_name' => $request->input('destinationAddressComponents.street_number', ''), 'route' => $request->input('destinationAddressComponents.route', ''), 'locality' => $request->input('destinationAddressComponents.locality', ''), 'neighborhood' => $request->input('destinationAddressComponents.neighborhood', ''), 'administrative_area_level_2' => $request->input('destinationAddressComponents.administrative_area_level_2', ''), 'administrative_area_level_1' => $request->input('destinationAddressComponents.administrative_area_level_1', ''), 'country' => $request->input('destinationAddressComponents.country', ''), 'postal_zip' => $request->input('destinationAddressComponents.postal_code', ''), 'geo_location' => DB::raw("(GeomFromText('POINT({$destination_lat} {$destination_lng})'))"))); //get default status when request is created. $request_status_id = RequestStatuses::getDefaultRequestStatus(); //Store the request. $pool_request = Requests::create(array('requester_id' => $requester_id, 'source_address_id' => $source_address->id, 'destination_address_id' => $destination_address->id, 'request_status_id' => $request_status_id)); //get all values from pickup times table $pickup_times = PickupTimes::all()->toArray(); $lookup_hash = array(); foreach ($pickup_times as $index => $arr) { $lookup_hash[$arr['id']] = $arr['time_value']; } //Store the mapping of times $pickup_times = $request->input('pick-up-time'); $request_pickup_time_array = array(); foreach ($pickup_times as $index => $time) { $timestamp = time(); if (isset($lookup_hash[$time + 1])) { $today_date = date('Y-m-d'); $timestamp = $today_date . ' ' . $lookup_hash[$time + 1]; } $request_pickup_time_array[] = array('request_id' => $pool_request->id, 'pickup_timestamp' => $timestamp); } RequestPickupTimes::insert($request_pickup_time_array); }