feat: enhance address handling with coordinates and integrate into event resources
This commit is contained in:
37
app/Domains/Ticketing/Event/Services/EventAddressService.php
Normal file
37
app/Domains/Ticketing/Event/Services/EventAddressService.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Domains\Ticketing\Event\Services;
|
||||
|
||||
use App\Domains\Core\Address\Models\Address;
|
||||
use App\Domains\Ticketing\Event\Models\Event;
|
||||
|
||||
class EventAddressService
|
||||
{
|
||||
/** Called inside the event update transaction, after validating the legacy location fields. */
|
||||
public function syncLocation(Event $event, bool $coordinatesProvided = false): void
|
||||
{
|
||||
$address = $event->address;
|
||||
$coordinates = $coordinatesProvided || $address === null ? $event->exact_location : $address->coordinates();
|
||||
$values = [
|
||||
'address_text' => $event->location,
|
||||
'latitude' => $coordinates['latitude'] ?? null,
|
||||
'longitude' => $coordinates['longitude'] ?? null,
|
||||
];
|
||||
|
||||
if ($address !== null && ! (clone $address)->fill($values)->isDirty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Editing one event must not change the location of another event or a tenant.
|
||||
if ($address === null || $address->tenants()->exists()
|
||||
|| $address->events()->where('events.id', '!=', $event->id)->exists()) {
|
||||
$address = Address::create(['label' => $address?->label ?? 'Ubicación del evento', ...$values]);
|
||||
$event->address()->associate($address);
|
||||
$event->save();
|
||||
} else {
|
||||
$address->update($values);
|
||||
}
|
||||
|
||||
$event->setRelation('address', $address);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user