Initial commit
This commit is contained in:
commit
346ca9b449
|
@ -0,0 +1 @@
|
|||
/vendor
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"name": "zoomyboy/osm",
|
||||
"description": "OSM Helper",
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Zoomyboy\\Osm\\": "src/"
|
||||
}
|
||||
},
|
||||
"authors": [
|
||||
{
|
||||
"name": "Philipp Lang",
|
||||
"email": "philipp@zoomyboy.de"
|
||||
}
|
||||
],
|
||||
"require": {}
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
namespace Zoomyboy\Osm;
|
||||
|
||||
use Illuminate\Support\Facades\Http;
|
||||
|
||||
class Address
|
||||
{
|
||||
public function __construct(
|
||||
public ?string $address,
|
||||
public ?string $zip,
|
||||
public ?string $location
|
||||
) {
|
||||
}
|
||||
|
||||
public function getCoordinate(): ?Coordinate
|
||||
{
|
||||
if (!$this->address || !$this->zip || !$this->location) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$response = Http::get('https://nominatim.openstreetmap.org/search/'.rawurlencode($this->queryString()).'?'.http_build_query([
|
||||
'format' => 'json',
|
||||
'addressdetails' => 1,
|
||||
]));
|
||||
|
||||
if (!$response->ok()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$lat = (float) data_get($response, '0.lat');
|
||||
$lon = (float) data_get($response, '0.lon');
|
||||
|
||||
return new Coordinate($lat, $lon);
|
||||
}
|
||||
|
||||
public function queryString(): string
|
||||
{
|
||||
return $this->address.', '.$this->zip.' '.$this->location;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace Zoomyboy\Osm;
|
||||
|
||||
class Coordinate
|
||||
{
|
||||
public function __construct(public float $lat, public float $lon)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
<?php
|
||||
|
||||
namespace Zoomyboy\Osm;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class FillCoordsJob implements ShouldQueue
|
||||
{
|
||||
use Dispatchable;
|
||||
use InteractsWithQueue;
|
||||
use Queueable;
|
||||
use SerializesModels;
|
||||
|
||||
public Geolocatable $model;
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(Geolocatable $model)
|
||||
{
|
||||
$this->model = $model;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$address = $this->model->getAddressForGeolocation();
|
||||
|
||||
if (!$address) {
|
||||
$this->model->destroyCoordinate();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$coordinate = $address->getCoordinate();
|
||||
|
||||
if (!$coordinate) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->model->fillCoordinate($coordinate);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
<?php
|
||||
|
||||
namespace Zoomyboy\Osm;
|
||||
|
||||
interface Geolocatable
|
||||
{
|
||||
public function fillCoordinate(Coordinate $coordinate): void;
|
||||
|
||||
public function getAddressForGeolocation(): ?Address;
|
||||
|
||||
public function destroyCoordinate();
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
namespace Zoomyboy\Osm;
|
||||
|
||||
trait HasGeolocation
|
||||
{
|
||||
public static $geolocationEnabled = true;
|
||||
|
||||
public static function bootHasGeolocation(): void
|
||||
{
|
||||
static::saved(function (Geolocatable $model) {
|
||||
if (!static::$geolocationEnabled) {
|
||||
return;
|
||||
}
|
||||
dispatch(new FillCoordsJob($model));
|
||||
});
|
||||
}
|
||||
|
||||
public static function disableGeolocation(): void
|
||||
{
|
||||
static::$geolocationEnabled = false;
|
||||
}
|
||||
|
||||
public static function enableGeolocation(): void
|
||||
{
|
||||
static::$geolocationEnabled = true;
|
||||
}
|
||||
|
||||
public function destroyCoordinate(): void
|
||||
{
|
||||
$this->updateQuietly([
|
||||
'lat' => null,
|
||||
'lon' => null,
|
||||
]);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue