feat(event): add address relationship and migration for event locations
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('events', function (Blueprint $table): void {
|
||||
$table->foreignId('address_id')->nullable()->constrained('addresses')->nullOnDelete();
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('events', function (Blueprint $table): void {
|
||||
$table->dropConstrainedForeignId('address_id');
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
DB::transaction(function (): void {
|
||||
DB::table('events')->whereNull('address_id')->orderBy('id')->lockForUpdate()
|
||||
->chunkById(100, function ($events): void {
|
||||
foreach ($events as $event) {
|
||||
$coordinates = $event->exact_location === null
|
||||
? null
|
||||
: json_decode($event->exact_location, true, flags: JSON_THROW_ON_ERROR);
|
||||
|
||||
if ($coordinates !== null && (! is_array($coordinates)
|
||||
|| ! is_numeric($coordinates['latitude'] ?? null)
|
||||
|| ! is_numeric($coordinates['longitude'] ?? null)
|
||||
|| ! is_finite((float) $coordinates['latitude'])
|
||||
|| ! is_finite((float) $coordinates['longitude'])
|
||||
|| abs((float) $coordinates['latitude']) > 90
|
||||
|| abs((float) $coordinates['longitude']) > 180)) {
|
||||
throw new RuntimeException("Invalid location coordinates for event {$event->id}");
|
||||
}
|
||||
|
||||
if ($event->location === null || trim($event->location) === '') {
|
||||
if ($coordinates !== null) {
|
||||
throw new RuntimeException("Missing address text for event {$event->id}");
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$now = now();
|
||||
$addressId = DB::table('addresses')->insertGetId([
|
||||
'label' => 'Ubicación del evento',
|
||||
'address_text' => $event->location,
|
||||
'latitude' => $coordinates === null ? null : $coordinates['latitude'],
|
||||
'longitude' => $coordinates === null ? null : $coordinates['longitude'],
|
||||
'created_at' => $now,
|
||||
'updated_at' => $now,
|
||||
]);
|
||||
|
||||
// Update only the new link, preserving the original fields and timestamps.
|
||||
DB::table('events')->where('id', $event->id)->update(['address_id' => $addressId]);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
// Copies may already have been edited or shared; keep them and the legacy data.
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user