Skip to content

Commit 4e9d5f4

Browse files
authored
Merge pull request #684 from hhaccessibility/issue-168
app: added API for getting ratable location very near specified coord…
2 parents a9113fd + 461bbd6 commit 4e9d5f4

6 files changed

Lines changed: 72 additions & 15 deletions

File tree

app/app/Http/Controllers/DuplicateLocationFinderController.php

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,13 @@
33
use App\BaseUser;
44
use App\User;
55
use App\Libraries\Gis;
6+
use App\Location;
67
use Illuminate\Routing\Controller;
78
use Illuminate\Auth\AuthenticationException;
89
use Illuminate\Http\Request;
910
use Illuminate\Support\Facades\Input;
1011
use DB;
1112

12-
function compareByDistance($loc1, $loc2)
13-
{
14-
if ($loc1->distance < $loc2->distance) {
15-
return -1;
16-
} elseif ($loc1->distance > $loc2->distance) {
17-
return 1;
18-
} else {
19-
return 0;
20-
}
21-
}
22-
2313
class DuplicateLocationFinderController extends Controller
2414
{
2515
public function showDuplicateLocationFinder(Request $request)
@@ -29,8 +19,8 @@ public function showDuplicateLocationFinder(Request $request)
2919
$radiusMeters = intval(Input::get('radius_meters'));
3020
}
3121
$location_id = Input::get('location_id');
32-
$location = DB::table('location')->find($location_id);
33-
$locationQuery = DB::table('location')->where('id', '<>', $location_id);
22+
$location = Location::find($location_id);
23+
$locationQuery = Location::where('id', '<>', $location_id);
3424
$search_results = \App\Libraries\Gis::findLocationsWithinRadius(
3525
$location->latitude,
3626
$location->longitude,
@@ -46,7 +36,7 @@ public function showDuplicateLocationFinder(Request $request)
4636
\App\Libraries\Gis::updateDistancesFromPoint($location->longitude, $location->latitude, $search_results);
4737
$search_results = \App\Libraries\Gis::filterTooDistant($search_results, $radiusMeters / 1000);
4838

49-
usort($search_results, 'App\Http\Controllers\compareByDistance');
39+
usort($search_results, 'App\Libraries\Gis::compareByDistance');
5040

5141
$viewData = [
5242
'radius_meters' => $radiusMeters,

app/app/Http/Controllers/PWAController.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<?php namespace App\Http\Controllers;
22

33
use Illuminate\Routing\Controller;
4+
use App\Libraries\Gis;
5+
use App\Location;
46

57
class PWAController extends Controller
68
{
@@ -34,4 +36,37 @@ public function manifest()
3436
]
3537
]);
3638
}
39+
40+
public function getNearbyLocationToRate(float $longitude, float $latitude)
41+
{
42+
$radiusMeters = 20;
43+
$locationsQuery = Location::query();
44+
$search_results = \App\Libraries\Gis::findLocationsWithinRadius(
45+
$latitude,
46+
$longitude,
47+
$radiusMeters,
48+
$locationsQuery
49+
);
50+
$locations = [];
51+
foreach ($search_results as $search_result) {
52+
$locations []= $search_result;
53+
}
54+
55+
if (empty($locations)) {
56+
return response()->json([
57+
'message' => 'No location found close enough.'
58+
], 404);
59+
}
60+
\App\Libraries\Gis::updateDistancesFromPoint($longitude, $latitude, $locations);
61+
$location = $locations[0];
62+
foreach ($locations as $location_) {
63+
if ($location->distance > $location_->distance) {
64+
$location = $location_;
65+
}
66+
}
67+
return response()->json([
68+
'name' => $location->name,
69+
'id' => $location->id
70+
]);
71+
}
3772
}

app/app/Libraries/Gis.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public static function getLatitudeAndLongitudeRange($lat, $lon, $searchRadiusKm)
5757
'minLon' => $minLon
5858
];
5959
}
60+
6061
public static function filterLatitudeAndLongitudeToRange($locationsQuery, array $range)
6162
{
6263
$locationsQuery = $locationsQuery->
@@ -66,6 +67,7 @@ public static function filterLatitudeAndLongitudeToRange($locationsQuery, array
6667
where('longitude', '<=', $range['maxLon']);
6768
return $locationsQuery;
6869
}
70+
6971
public static function filterTooDistant($locations, $maxDistance)
7072
{
7173
// Remove locations that are too far away.
@@ -77,11 +79,23 @@ public static function filterTooDistant($locations, $maxDistance)
7779
}
7880
return $filtered_locations;
7981
}
82+
8083
public static function findLocationsWithinRadius($latitude, $longitude, $radiusMeters, $locationQuery)
8184
{
8285
$range = self::getLatitudeAndLongitudeRange($latitude, $longitude, (0.7 + ($radiusMeters * 0.001)));
8386
$locationQuery = self::filterLatitudeAndLongitudeToRange($locationQuery, $range);
8487
$search_results = $locationQuery->get();
8588
return $search_results;
8689
}
90+
91+
public static function compareByDistance($loc1, $loc2)
92+
{
93+
if ($loc1->distance < $loc2->distance) {
94+
return -1;
95+
} elseif ($loc1->distance > $loc2->distance) {
96+
return 1;
97+
} else {
98+
return 0;
99+
}
100+
}
87101
}

app/routes/pwa.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
<?php
22

33
Route::get('manifest.json', 'PWAController@manifest');
4+
Route::get('api/location/nearby/{longitude}/{latitude}', 'PWAController@getNearbyLocationToRate');

app/tests/LocationApiTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public function testGet()
2121
$this->assertTrue($location->owner_user_id === null);
2222
$this->assertTrue($location->name === null || is_string($location->name));
2323
$this->assertTrue(is_int($location->longitude) || is_float($location->longitude));
24-
$this->assertTrue(is_int($location->longitude) || is_float($location->longitude));
24+
$this->assertTrue(is_int($location->latitude) || is_float($location->latitude));
2525
}
2626
}
2727
}

app/tests/PWATest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,21 @@ public function testGetManifest()
1616
$response = $this->get('/manifest.json');
1717
$this->assertEquals(200, $response->getStatusCode());
1818
}
19+
20+
public function testGetRatableLocation()
21+
{
22+
// Coordinates of Tim Hortons
23+
$longitude = -83.04508872;
24+
$latitude = 42.31594457;
25+
$response = $this->get('/api/location/nearby/'.$longitude.'/'.$latitude);
26+
$this->assertEquals(200, $response->getStatusCode());
27+
$data = json_decode($response->getContent());
28+
$this->assertTrue($data->name === 'Tim Hortons');
29+
30+
// Coordinates of a random place in the Pacific Ocean.
31+
$longitude = 168.5798541;
32+
$latitude = 31.0437175;
33+
$response = $this->get('/api/location/nearby/'.$longitude.'/'.$latitude);
34+
$this->assertEquals(404, $response->getStatusCode());
35+
}
1936
}

0 commit comments

Comments
 (0)