feat: enhance address handling with coordinates and integrate into event resources
This commit is contained in:
@@ -20,6 +20,16 @@ class Address extends Model
|
||||
];
|
||||
}
|
||||
|
||||
/** @return array{latitude: float, longitude: float}|null */
|
||||
public function coordinates(): ?array
|
||||
{
|
||||
if ($this->latitude === null || $this->longitude === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return ['latitude' => (float) $this->latitude, 'longitude' => (float) $this->longitude];
|
||||
}
|
||||
|
||||
/** @return HasMany<Event, $this> */
|
||||
public function events(): HasMany
|
||||
{
|
||||
|
||||
22
app/Domains/Core/Address/Resources/AddressResource.php
Normal file
22
app/Domains/Core/Address/Resources/AddressResource.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Domains\Core\Address\Resources;
|
||||
|
||||
use App\Domains\Core\Address\Models\Address;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
/** @mixin Address */
|
||||
class AddressResource extends JsonResource
|
||||
{
|
||||
public function toArray(Request $request): array
|
||||
{
|
||||
return [
|
||||
'id' => $this->id,
|
||||
'label' => $this->label,
|
||||
'address_text' => $this->address_text,
|
||||
'latitude' => $this->latitude === null ? null : (float) $this->latitude,
|
||||
'longitude' => $this->longitude === null ? null : (float) $this->longitude,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -317,7 +317,8 @@ class Tenant extends Model
|
||||
return $this->belongsToMany(Address::class, 'tenant_addresses', 'tenant_codigo', 'address_id', 'codigo', 'id')
|
||||
->using(TenantAddress::class)
|
||||
->withPivot(['id', 'is_main'])
|
||||
->withTimestamps();
|
||||
->withTimestamps()
|
||||
->orderByPivot('id');
|
||||
}
|
||||
|
||||
/** @return HasOneThrough<Address, TenantAddress, $this> */
|
||||
|
||||
14
app/Domains/Core/Tenant/Resources/TenantAddressResource.php
Normal file
14
app/Domains/Core/Tenant/Resources/TenantAddressResource.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace App\Domains\Core\Tenant\Resources;
|
||||
|
||||
use App\Domains\Core\Address\Resources\AddressResource;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class TenantAddressResource extends AddressResource
|
||||
{
|
||||
public function toArray(Request $request): array
|
||||
{
|
||||
return [...parent::toArray($request), 'is_main' => (bool) $this->pivot->is_main];
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Domains\Core\Tenant\Resources;
|
||||
|
||||
use App\Domains\Commerce\Catalog\Models\Category;
|
||||
use App\Domains\Core\Address\Resources\AddressResource;
|
||||
use App\Domains\Core\Menu\Models\Menu;
|
||||
use App\Domains\Core\Tenant\Models\StorefrontWebsiteType;
|
||||
use App\Domains\Core\Tenant\Models\Tenant;
|
||||
@@ -41,6 +42,8 @@ class TenantResource extends JsonResource
|
||||
'site_title' => $this->site_title ?? 'ShopitFront',
|
||||
'asset_url' => config('filesystems.disks.s3.url'),
|
||||
'address' => $this->address,
|
||||
'addresses' => $this->whenLoaded('addresses', fn () => TenantAddressResource::collection($this->addresses)),
|
||||
'main_address' => $this->whenLoaded('mainAddress', fn () => AddressResource::make($this->mainAddress)),
|
||||
'phone' => $this->phone,
|
||||
'favicon' => $this->favicon?->getTemporaryUrl(1440),
|
||||
'primary_color' => $this->primary_color,
|
||||
@@ -127,6 +130,7 @@ class TenantResource extends JsonResource
|
||||
'subtitle' => $event->subtitle,
|
||||
'description' => $event->description,
|
||||
'location' => $event->location,
|
||||
'address' => AddressResource::make($event->address),
|
||||
'date_text' => $event->date_text,
|
||||
'dates' => $event->dates
|
||||
->filter(fn (EventDate $date): bool => $date->rescheduled_to_event_date_id === null)
|
||||
|
||||
@@ -18,9 +18,12 @@ class TenantInformationService
|
||||
'footerBackgroundImage',
|
||||
'storefrontWebsiteType',
|
||||
'socialMedia',
|
||||
'addresses',
|
||||
'mainAddress',
|
||||
'websiteExtras.websiteTypeExtra',
|
||||
'activeEvent.dates',
|
||||
'activeEvent.socialMedia',
|
||||
'activeEvent.address',
|
||||
];
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user