Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions server/config/geocoder.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

return [
'cache' => [

/*
|-----------------------------------------------------------------------
| Cache Store
Expand All @@ -17,9 +16,12 @@
|
| Default: null
|
| FleetOps geocodes through Fleetbase\FleetOps\Support\Geocoding, so
| this only applies to code that still uses the geocoder-laravel facade.
|
*/

'store' => 'geocode',
'store' => null,

/*
|-----------------------------------------------------------------------
Expand Down Expand Up @@ -56,10 +58,14 @@
*/
'providers' => [
Chain::class => [
// GoogleMaps takes (client, region, apiKey). The settings-backed
// API key is not loaded yet when this file is read, so only the
// environment is consulted here; use Geocoding::geocoder() for a
// geocoder that honours the settings.
GoogleMaps::class => [
config('services.google_maps.locale', env('GOOGLE_MAPS_LOCALE', 'en')),
config('services.google_maps.api_key', env('GOOGLE_MAPS_API_KEY')),
]
env('GOOGLE_MAPS_REGION'),
env('GOOGLE_MAPS_API_KEY'),
],
],
],

Expand Down Expand Up @@ -104,5 +110,4 @@
|
*/
'reader' => null,

];
5 changes: 3 additions & 2 deletions server/src/Http/Controllers/Api/v1/DriverController.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
use Fleetbase\FleetOps\Models\Vehicle;
use Fleetbase\FleetOps\Models\Vendor;
use Fleetbase\FleetOps\Support\ApiCacheThrottle;
use Fleetbase\FleetOps\Support\Geocoding;
use Fleetbase\FleetOps\Support\GeofenceIntersectionService;
use Fleetbase\FleetOps\Support\OSRM;
use Fleetbase\FleetOps\Support\ProfileAccountManager;
Expand All @@ -38,7 +39,7 @@
use Fleetbase\Models\UserDevice;
use Fleetbase\Models\VerificationCode;
use Fleetbase\Support\Auth;
use Geocoder\Laravel\Facades\Geocoder;
use Geocoder\Query\ReverseQuery;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Carbon;
Expand Down Expand Up @@ -368,7 +369,7 @@ public function track(string $id, Request $request)

if ($isGeocodable) {
try {
$geocoded = Geocoder::reverse($latitude, $longitude)->get()->first();
$geocoded = collect(Geocoding::geocoder()->reverseQuery(ReverseQuery::fromCoordinates($latitude, $longitude))->all())->first();
if ($geocoded) {
$driver->updateQuietly([
'city' => $geocoded->getLocality(),
Expand Down
4 changes: 2 additions & 2 deletions server/src/Http/Controllers/Api/v1/PlaceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
use Fleetbase\FleetOps\Http\Resources\v1\DeletedResource;
use Fleetbase\FleetOps\Http\Resources\v1\Place as PlaceResource;
use Fleetbase\FleetOps\Models\Place;
use Fleetbase\FleetOps\Support\Geocoding;
use Fleetbase\FleetOps\Support\PlaceSearch;
use Fleetbase\FleetOps\Support\Utils;
use Fleetbase\Http\Controllers\Controller;
use Fleetbase\LaravelMysqlSpatial\Types\Point;
use Geocoder\Laravel\Facades\Geocoder;
use Illuminate\Http\Request;
use Illuminate\Support\Str;

Expand Down Expand Up @@ -375,7 +375,7 @@ protected function firstOrNewPlace(array $attributes): Place

protected function geocodeAddress(string $address): mixed
{
return Geocoder::geocode($address)->get()->first();
return Geocoding::lookupAddress($address)->first();
}

protected function findPlaceOrFail(string $id): Place
Expand Down
12 changes: 9 additions & 3 deletions server/src/Http/Controllers/Internal/v1/GeocoderController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;

use Fleetbase\FleetOps\Models\Place;
use Fleetbase\FleetOps\Support\Geocoding;
use Fleetbase\FleetOps\Support\Utils;
use Fleetbase\Http\Controllers\Controller;
use Geocoder\Laravel\Facades\Geocoder;
use Geocoder\Query\GeocodeQuery;
use Geocoder\Query\ReverseQuery;
use Illuminate\Http\Request;

class GeocoderController extends Controller
Expand Down Expand Up @@ -97,14 +99,18 @@ function ($googleAddress) {
return response()->json([]);
}

// Both lookups go through the same geocoder places/lookup uses. The
// geocoder-laravel facade built its provider from config/geocoder.php at
// boot, before the settings-backed API key was loaded, and its chain
// provider swallowed the resulting failure into an empty result.
protected function reverseGeocode(float $latitude, float $longitude)
{
return Geocoder::reverse($latitude, $longitude)->get();
return collect(Geocoding::geocoder()->reverseQuery(ReverseQuery::fromCoordinates($latitude, $longitude))->all());
}

protected function forwardGeocode(string $query)
{
return Geocoder::geocode($query)->get();
return collect(Geocoding::geocoder()->geocodeQuery(GeocodeQuery::create($query))->all());
}

protected function placeFromGoogleAddress($googleAddress)
Expand Down
8 changes: 4 additions & 4 deletions server/src/Models/Place.php
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ public static function insertFromGoogleAddress(\Geocoder\Provider\GoogleMaps\Mod
*/
public static function createFromGeocodingLookup(string $address, $saveInstance = false): ?Place
{
$results = \Geocoder\Laravel\Facades\Geocoder::geocode($address)->get();
$results = Geocoding::lookupAddress($address);

if ($results->isEmpty() || !$results->first()) {
$place = (new static())->newInstance(['street1' => $address, 'location' => new SpatialPoint(0, 0)]);
Expand All @@ -386,7 +386,7 @@ public static function createFromGeocodingLookup(string $address, $saveInstance
*/
public static function getValuesFromGeocodingLookup(string $address): array
{
$results = \Geocoder\Laravel\Facades\Geocoder::geocode($address)->get();
$results = Geocoding::lookupAddress($address);

if ($results->isEmpty() || !$results->first()) {
return ['street1' => $address, 'location' => new SpatialPoint(0, 0)];
Expand Down Expand Up @@ -617,7 +617,7 @@ public static function createFromCoordinates($coordinates, array $attributes = [
$instance->setAttribute('location', new SpatialPoint($latitude, $longitude));
$instance->fill($attributes);

$results = \Geocoder\Laravel\Facades\Geocoder::reverse($latitude, $longitude)->get();
$results = Geocoding::lookupCoordinates($latitude, $longitude);

if (!$results->isEmpty()) {
$instance->fillWithGoogleAddress($results->first());
Expand Down Expand Up @@ -653,7 +653,7 @@ public static function insertFromCoordinates($coordinates, array $attributes = [
$longitude = $point->getLng();
}

$results = \Geocoder\Laravel\Facades\Geocoder::reverse($latitude, $longitude)->get();
$results = Geocoding::lookupCoordinates($latitude, $longitude);

if ($results->count() === 0) {
return false;
Expand Down
42 changes: 42 additions & 0 deletions server/src/Support/Geocoding.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Geocoder\StatefulGeocoder;
use GuzzleHttp\Client;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;

/**
* Class Geocoding.
Expand Down Expand Up @@ -233,6 +234,47 @@ public static function getRegion(): ?string
return config('services.google_maps.region') ?: env('GOOGLE_MAPS_REGION', 'us');
}

/**
* The configured geocoder — Google Maps with the settings-backed API key,
* region and locale — for callers that need raw address results rather
* than places.
*/
public static function geocoder(): object
{
return static::makeGeocoder();
}

/**
* Raw address results for a free-text address from the configured
* geocoder. A failed lookup resolves to an empty collection, as it did
* through the geocoder-laravel facade, but is logged rather than hidden.
*/
public static function lookupAddress(string $address): Collection
{
try {
return collect(static::geocoder()->geocodeQuery(GeocodeQuery::create($address))->all());
} catch (\Throwable $e) {
Log::warning('Geocoding lookup failed: ' . $e->getMessage(), ['address' => $address]);

return collect();
}
}

/**
* Raw address results for a coordinate pair from the configured geocoder,
* resolving a failed lookup to an empty collection like lookupAddress().
*/
public static function lookupCoordinates(float $latitude, float $longitude): Collection
{
try {
return collect(static::geocoder()->reverseQuery(ReverseQuery::fromCoordinates($latitude, $longitude))->all());
} catch (\Throwable $e) {
Log::warning('Reverse geocoding lookup failed: ' . $e->getMessage(), ['latitude' => $latitude, 'longitude' => $longitude]);

return collect();
}
}

protected static function makeGeocoder(): object
{
// Allow an alternative geocoder (or test double) to be injected
Expand Down
4 changes: 1 addition & 3 deletions server/src/Support/PlaceSearch.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

use Fleetbase\FleetOps\Models\Place;
use Fleetbase\LaravelMysqlSpatial\Types\Point;
use Geocoder\Laravel\Facades\Geocoder;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
Expand Down Expand Up @@ -69,8 +68,7 @@ public static function geocode(?string $searchQuery = null, $latitude = null, $l
return collect();
}

$results = Geocoder::geocode($searchQuery)
->get()
$results = Geocoding::lookupAddress($searchQuery)
->map(fn ($googleAddress) => Place::createFromGoogleAddress($googleAddress))
->values();

Expand Down
16 changes: 7 additions & 9 deletions server/tests/Feature/Http/Api/DriverControllerTrackTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -267,15 +267,15 @@ public function getPickupOrCurrentWaypoint(): object
$driver->setRelation('vehicle', null);

// Reverse geocoding resolves the locality onto the driver record
app()->instance('geocoder', new class {
public function reverse($lat, $lng)
app()->instance('fleetops.geocoder', new class {
public function reverseQuery($query)
{
return $this;
}

public function get()
public function all()
{
return collect([new class {
return [new class {
public function getLocality()
{
return 'Singapore';
Expand All @@ -290,15 +290,14 @@ public function getCode()
}
};
}
}]);
}];
}

public function __call($method, $arguments)
{
return $this;
}
});
Geocoder\Laravel\Facades\Geocoder::clearResolvedInstance('geocoder');

// Geofence detection failures never block the tracking response
$throwingService = new class extends GeofenceIntersectionService {
Expand Down Expand Up @@ -348,8 +347,8 @@ public function captureException($exception)
};
app()->instance('sentry', $sentry);

app()->instance('geocoder', new class {
public function reverse($lat, $lng)
app()->instance('fleetops.geocoder', new class {
public function reverseQuery($query)
{
throw new RuntimeException('geocoder offline');
}
Expand All @@ -359,7 +358,6 @@ public function __call($method, $arguments)
return $this;
}
});
Geocoder\Laravel\Facades\Geocoder::clearResolvedInstance('geocoder');

$throwingService = new class extends GeofenceIntersectionService {
public function detectDriverCrossings($driver, $location): array
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,15 +116,15 @@ public function __call($method, $arguments)
app()->instance('db.schema', $connection->getSchemaBuilder());
Illuminate\Support\Facades\DB::clearResolvedInstance('db');

app()->instance('geocoder', new class {
public function geocode($query)
app()->instance('fleetops.geocoder', new class {
public function geocodeQuery($query)
{
return $this;
}

public function get()
public function all()
{
return collect();
return [];
}

public function __call($method, $arguments)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,20 +107,20 @@ public function __call($method, $arguments)
});
Illuminate\Support\Facades\DB::clearResolvedInstance('db');

app()->instance('geocoder', new class {
public function geocode($query)
app()->instance('fleetops.geocoder', new class {
public function geocodeQuery($query)
{
return $this;
}

public function reverse($lat, $lng)
public function reverseQuery($query)
{
return $this;
}

public function get()
public function all()
{
return collect();
return [];
}

public function __call($method, $arguments)
Expand Down
Loading
Loading