From bb4495c6cc7abacd15d60cf66339c739d9ac7527 Mon Sep 17 00:00:00 2001 From: ncoronel Date: Thu, 1 Oct 2026 08:56:35 -0300 Subject: [PATCH] feat(users): add event_id to users table and update related resources --- .../Resources/AdministratorResource.php | 1 + app/Domains/Core/Auth/Models/User.php | 14 ++++- .../Core/Auth/Resources/UserResource.php | 1 + ..._01_000000_add_event_id_to_users_table.php | 28 +++++++++ .../Auth/UserAuthorizationRelationsTest.php | 3 + .../Migrations/AddEventIdToUsersTest.php | 57 +++++++++++++++++++ 6 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 database/migrations/2026_10_01_000000_add_event_id_to_users_table.php create mode 100644 tests/Feature/Migrations/AddEventIdToUsersTest.php diff --git a/app/Domains/Core/Administrator/Resources/AdministratorResource.php b/app/Domains/Core/Administrator/Resources/AdministratorResource.php index 6abf6340..03c9b72e 100644 --- a/app/Domains/Core/Administrator/Resources/AdministratorResource.php +++ b/app/Domains/Core/Administrator/Resources/AdministratorResource.php @@ -18,6 +18,7 @@ class AdministratorResource extends JsonResource 'dni' => $this->dni, 'email' => $this->email, 'rol_codigo' => $this->rol_codigo, + 'event_id' => $this->event_id, 'role' => $this->whenLoaded('role', fn () => [ 'codigo' => $this->role?->codigo, 'nombre' => $this->role?->nombre, diff --git a/app/Domains/Core/Auth/Models/User.php b/app/Domains/Core/Auth/Models/User.php index b01b2125..7282794a 100644 --- a/app/Domains/Core/Auth/Models/User.php +++ b/app/Domains/Core/Auth/Models/User.php @@ -2,11 +2,12 @@ namespace App\Domains\Core\Auth\Models; +use App\Domains\Commerce\Catalog\Models\Category; use App\Domains\Core\Authorization\Enums\RoleCode; use App\Domains\Core\Authorization\Models\Role; -use App\Domains\Commerce\Catalog\Models\Category; -use App\Domains\Ticketing\Event\Models\EventDateChangeView; use App\Domains\Core\Tenant\Models\Tenant; +use App\Domains\Ticketing\Event\Models\Event; +use App\Domains\Ticketing\Event\Models\EventDateChangeView; use App\Domains\Ticketing\Ticket\Models\ScanAttempt; use Database\Factories\UserFactory; use Illuminate\Database\Eloquent\Attributes\Fillable; @@ -20,7 +21,7 @@ use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; -#[Fillable(['nombre_apellido', 'email', 'password', 'dni', 'telefono', 'google_id', 'rol_codigo', 'tenant_codigo'])] +#[Fillable(['nombre_apellido', 'email', 'password', 'dni', 'telefono', 'google_id', 'rol_codigo', 'tenant_codigo', 'event_id'])] #[Hidden(['password', 'remember_token', 'active_email', 'active_google_id'])] class User extends Authenticatable { @@ -86,6 +87,12 @@ class User extends Authenticatable return $this->belongsTo(Tenant::class, 'tenant_codigo', 'codigo'); } + /** @return BelongsTo */ + public function event(): BelongsTo + { + return $this->belongsTo(Event::class); + } + /** @return BelongsToMany */ public function scanCategories(): BelongsToMany { @@ -103,6 +110,7 @@ class User extends Authenticatable protected function casts(): array { return [ + 'event_id' => 'integer', 'email_verified_at' => 'datetime', 'password' => 'hashed', 'failed_login_attempts' => 'integer', diff --git a/app/Domains/Core/Auth/Resources/UserResource.php b/app/Domains/Core/Auth/Resources/UserResource.php index 8a8ddbac..cc8b4a99 100644 --- a/app/Domains/Core/Auth/Resources/UserResource.php +++ b/app/Domains/Core/Auth/Resources/UserResource.php @@ -24,6 +24,7 @@ class UserResource extends JsonResource 'telefono' => $this->telefono, 'rol_codigo' => $this->rol_codigo, 'tenant_codigo' => $this->tenant_codigo, + 'event_id' => $this->event_id, 'categories' => $this->whenLoaded('scanCategories', fn () => $this->scanCategories ->map(fn ($category) => [ 'id' => $category->id, diff --git a/database/migrations/2026_10_01_000000_add_event_id_to_users_table.php b/database/migrations/2026_10_01_000000_add_event_id_to_users_table.php new file mode 100644 index 00000000..f351604f --- /dev/null +++ b/database/migrations/2026_10_01_000000_add_event_id_to_users_table.php @@ -0,0 +1,28 @@ +foreignId('event_id') + ->nullable() + ->after('tenant_codigo') + ->constrained('events') + ->cascadeOnUpdate() + ->restrictOnDelete(); + }); + } + + public function down(): void + { + Schema::table('users', function (Blueprint $table): void { + $table->dropForeign(['event_id']); + $table->dropColumn('event_id'); + }); + } +}; diff --git a/tests/Feature/Auth/UserAuthorizationRelationsTest.php b/tests/Feature/Auth/UserAuthorizationRelationsTest.php index d0719b65..e8ae4373 100644 --- a/tests/Feature/Auth/UserAuthorizationRelationsTest.php +++ b/tests/Feature/Auth/UserAuthorizationRelationsTest.php @@ -17,6 +17,7 @@ class UserAuthorizationRelationsTest extends TestCase $this->assertTrue(Schema::hasColumns('users', [ 'rol_codigo', 'tenant_codigo', + 'event_id', ])); } @@ -28,5 +29,7 @@ class UserAuthorizationRelationsTest extends TestCase $this->assertNull($user->tenant_codigo); $this->assertSame(RoleCode::User->value, $user->role->codigo); $this->assertNull($user->tenant); + $this->assertNull($user->event_id); + $this->assertNull($user->event); } } diff --git a/tests/Feature/Migrations/AddEventIdToUsersTest.php b/tests/Feature/Migrations/AddEventIdToUsersTest.php new file mode 100644 index 00000000..88de36cf --- /dev/null +++ b/tests/Feature/Migrations/AddEventIdToUsersTest.php @@ -0,0 +1,57 @@ +id(); + }); + Schema::create('users', function (Blueprint $table): void { + $table->id(); + $table->string('tenant_codigo')->nullable(); + $table->softDeletes(); + $table->timestamps(); + }); + DB::table('users')->insert(['id' => 1, 'tenant_codigo' => 'legacy']); + DB::table('events')->insert(['id' => 42]); + + $migration = require database_path('migrations/2026_10_01_000000_add_event_id_to_users_table.php'); + $migration->up(); + + $legacy = User::query()->findOrFail(1); + $this->assertNull($legacy->event_id); + $this->assertNull($legacy->event); + $this->assertSame('legacy', $legacy->tenant_codigo); + + $legacy->update(['event_id' => '42']); + $user = $legacy->fresh(); + $this->assertSame(42, $user->event_id); + $this->assertSame(42, $user->event->id); + $this->assertSame(42, UserResource::make($user)->resolve(new Request)['event_id']); + $this->assertSame(42, AdministratorResource::make($user)->resolve(new Request)['event_id']); + + try { + DB::table('events')->where('id', 42)->delete(); + $this->fail('An assigned event must not be deleted.'); + } catch (QueryException $exception) { + $this->assertStringContainsString('FOREIGN KEY', $exception->getMessage()); + } + + $migration->down(); + $this->assertFalse(Schema::hasColumn('users', 'event_id')); + $this->assertSame('legacy', DB::table('users')->where('id', 1)->value('tenant_codigo')); + } +}