From dbeaf19513e56725555da1773ec5ce152f24521d Mon Sep 17 00:00:00 2001 From: ncoronel Date: Fri, 31 Jul 2026 16:11:47 -0300 Subject: [PATCH] feat(auth): implement AdminAppMeController and AdminAppMeResource; add routes and tests for user context retrieval --- .../Auth/Controllers/AdminAppMeController.php | 26 +++++++++++++ .../Auth/Resources/AdminAppMeResource.php | 25 ++++++++++++ .../Auth/Services/AdminAppContextService.php | 26 +++++++++++++ app/Domains/Auth/routes/adminapp.php | 3 ++ .../AdminApp/BootstrapTenantController.php | 34 ----------------- .../AdminApp/BootstrapAdminAppResource.php | 3 -- app/Domains/Tenant/routes/adminapp.php | 2 - .../AdminAppMeControllerTest.php} | 38 ++++++++++--------- .../BootstrapAdminAppControllerTest.php | 7 ++-- 9 files changed, 104 insertions(+), 60 deletions(-) create mode 100644 app/Domains/Auth/Controllers/AdminAppMeController.php create mode 100644 app/Domains/Auth/Resources/AdminAppMeResource.php create mode 100644 app/Domains/Auth/Services/AdminAppContextService.php delete mode 100644 app/Domains/Tenant/Controllers/AdminApp/BootstrapTenantController.php rename tests/Feature/{Tenant/AdminAppBootstrapTenantControllerTest.php => Auth/AdminAppMeControllerTest.php} (64%) diff --git a/app/Domains/Auth/Controllers/AdminAppMeController.php b/app/Domains/Auth/Controllers/AdminAppMeController.php new file mode 100644 index 0000000..129b169 --- /dev/null +++ b/app/Domains/Auth/Controllers/AdminAppMeController.php @@ -0,0 +1,26 @@ +user(); + + return AdminAppMeResource::make( + $this->adminAppContextService->load($user) + ); + } +} diff --git a/app/Domains/Auth/Resources/AdminAppMeResource.php b/app/Domains/Auth/Resources/AdminAppMeResource.php new file mode 100644 index 0000000..3fa9226 --- /dev/null +++ b/app/Domains/Auth/Resources/AdminAppMeResource.php @@ -0,0 +1,25 @@ + + */ + public function toArray(Request $request): array + { + return [ + 'user' => UserResource::make($this->resource), + 'tenant' => TenantResource::make($this->tenant), + ]; + } +} diff --git a/app/Domains/Auth/Services/AdminAppContextService.php b/app/Domains/Auth/Services/AdminAppContextService.php new file mode 100644 index 0000000..29c55ee --- /dev/null +++ b/app/Domains/Auth/Services/AdminAppContextService.php @@ -0,0 +1,26 @@ +tenant() + ->with([ + 'menues' => fn ($query) => $query + ->whereHas( + 'roles', + fn ($query) => $query->where('codigo', RoleCode::AdminApp->value) + ), + ]) + ->firstOrFail(); + + $user->setRelation('tenant', $tenant); + + return $user; + } +} diff --git a/app/Domains/Auth/routes/adminapp.php b/app/Domains/Auth/routes/adminapp.php index 9b33dbb..d3cebbc 100644 --- a/app/Domains/Auth/routes/adminapp.php +++ b/app/Domains/Auth/routes/adminapp.php @@ -1,8 +1,11 @@ group(function (): void { Route::post('login', AdminAppLoginController::class)->middleware('throttle:login'); + Route::middleware(['auth:sanctum', 'adminapp.tenant']) + ->get('me', AdminAppMeController::class); }); diff --git a/app/Domains/Tenant/Controllers/AdminApp/BootstrapTenantController.php b/app/Domains/Tenant/Controllers/AdminApp/BootstrapTenantController.php deleted file mode 100644 index cbaffaf..0000000 --- a/app/Domains/Tenant/Controllers/AdminApp/BootstrapTenantController.php +++ /dev/null @@ -1,34 +0,0 @@ -user(); - $tenant = $user->tenant()->firstOrFail(); - - return TenantResource::make( - $this->tenantInformationService->load($tenant, [ - 'menues' => fn ($query) => $query - ->where('code', 'like', 'admin.%') - ->whereHas( - 'roles', - fn ($query) => $query->where('codigo', $user->rol_codigo) - ), - ]) - ); - } -} diff --git a/app/Domains/Tenant/Resources/AdminApp/BootstrapAdminAppResource.php b/app/Domains/Tenant/Resources/AdminApp/BootstrapAdminAppResource.php index 8f021fe..a5075a9 100644 --- a/app/Domains/Tenant/Resources/AdminApp/BootstrapAdminAppResource.php +++ b/app/Domains/Tenant/Resources/AdminApp/BootstrapAdminAppResource.php @@ -17,10 +17,7 @@ class BootstrapAdminAppResource extends JsonResource public function toArray(Request $request): array { return [ - 'codigo' => $this->codigo, 'website_type_code' => $this->codigo, - 'nombre' => $this->nombre, - 'dominio' => $this->dominio, 'primary_color' => $this->primary_color, 'secondary_color' => $this->secondary_color, 'danger_color' => $this->danger_color, diff --git a/app/Domains/Tenant/routes/adminapp.php b/app/Domains/Tenant/routes/adminapp.php index 08a47e8..01396ba 100644 --- a/app/Domains/Tenant/routes/adminapp.php +++ b/app/Domains/Tenant/routes/adminapp.php @@ -1,7 +1,6 @@ middleware(['auth:sanctum', 'adminapp.tenant']) ->group(function (): void { - Route::get('bootstrap', BootstrapTenantController::class); Route::get('website-extras', [WebsiteExtraController::class, 'show']); Route::get('website-extras/{websiteExtraCode}', [WebsiteExtraController::class, 'showExtra']); Route::put('website-extras/{websiteExtraCode}', [WebsiteExtraController::class, 'update']); diff --git a/tests/Feature/Tenant/AdminAppBootstrapTenantControllerTest.php b/tests/Feature/Auth/AdminAppMeControllerTest.php similarity index 64% rename from tests/Feature/Tenant/AdminAppBootstrapTenantControllerTest.php rename to tests/Feature/Auth/AdminAppMeControllerTest.php index bd000ef..6850b07 100644 --- a/tests/Feature/Tenant/AdminAppBootstrapTenantControllerTest.php +++ b/tests/Feature/Auth/AdminAppMeControllerTest.php @@ -1,6 +1,6 @@ getJson('/api/v1/adminapp/tenant/bootstrap') - ->assertUnauthorized(); + $this->getJson('/api/v1/adminapp/me')->assertUnauthorized(); } - public function test_a_customer_cannot_bootstrap_adminapp(): void + public function test_a_customer_cannot_access_the_adminapp_context(): void { - $userRole = $this->createRole(RoleCode::User); $customer = User::factory()->create([ - 'rol_codigo' => $userRole->codigo, + 'rol_codigo' => $this->createRole(RoleCode::User)->codigo, 'tenant_codigo' => null, ]); Sanctum::actingAs($customer); - $this->getJson('/api/v1/adminapp/tenant/bootstrap') - ->assertForbidden(); + $this->getJson('/api/v1/adminapp/me')->assertForbidden(); } - public function test_it_returns_the_authenticated_users_tenant_and_admin_menus(): void + public function test_it_returns_the_user_tenant_and_authorized_admin_menus(): void { $adminAppRole = $this->createRole(RoleCode::AdminApp); $tenant = $this->createTenant('acme'); @@ -49,18 +46,23 @@ class AdminAppBootstrapTenantControllerTest extends TestCase $tenant->menues()->sync([$catalog->code, $staff->code, $storefront->code]); $otherTenant->menues()->sync([$staff->code]); - Sanctum::actingAs(User::factory()->create([ + $user = User::factory()->create([ + 'nombre_apellido' => 'Admin Acme', + 'email' => 'admin@acme.test', 'rol_codigo' => $adminAppRole->codigo, 'tenant_codigo' => $tenant->codigo, - ])); + ]); + Sanctum::actingAs($user); - $this->getJson('/api/v1/adminapp/tenant/bootstrap') + $this->getJson('/api/v1/adminapp/me') ->assertOk() - ->assertJsonPath('data.codigo', 'acme') - ->assertJsonCount(1, 'data.menues') - ->assertJsonPath('data.menues.0.code', 'admin.catalog') - ->assertJsonPath('data.menues.0.label', 'Catálogo') - ->assertJsonPath('data.menues.0.route', '/admin/catalog') + ->assertJsonPath('data.user.id', $user->id) + ->assertJsonPath('data.user.email', 'admin@acme.test') + ->assertJsonPath('data.tenant.codigo', 'acme') + ->assertJsonCount(1, 'data.tenant.menues') + ->assertJsonPath('data.tenant.menues.0.code', 'admin.catalog') + ->assertJsonPath('data.tenant.menues.0.label', 'Catálogo') + ->assertJsonPath('data.tenant.menues.0.route', '/admin/catalog') ->assertJsonMissing(['code' => 'admin.staff']) ->assertJsonMissing(['code' => 'index']); } diff --git a/tests/Feature/Tenant/BootstrapAdminAppControllerTest.php b/tests/Feature/Tenant/BootstrapAdminAppControllerTest.php index b97c3e0..ba4e20b 100644 --- a/tests/Feature/Tenant/BootstrapAdminAppControllerTest.php +++ b/tests/Feature/Tenant/BootstrapAdminAppControllerTest.php @@ -35,14 +35,15 @@ class BootstrapAdminAppControllerTest extends TestCase $this->getJson('/api/v1/adminapp/bootstrap/ADMIN.SHOPIT.TEST') ->assertOk() - ->assertJsonPath('data.codigo', 'shopit') ->assertJsonPath('data.website_type_code', 'shopit') - ->assertJsonPath('data.dominio', 'admin.shopit.test') ->assertJsonPath('data.primary_color', '#112233') ->assertJsonPath('data.warning_color', '#ffaa00') ->assertJsonPath('data.login_header_footer_color', '#313131') ->assertJsonPath('data.site_logo', null) - ->assertJsonPath('data.footer_logo', $footerLogo->getTemporaryUrl(1440)); + ->assertJsonPath('data.footer_logo', $footerLogo->getTemporaryUrl(1440)) + ->assertJsonMissingPath('data.codigo') + ->assertJsonMissingPath('data.nombre') + ->assertJsonMissingPath('data.dominio'); } public function test_it_returns_not_found_for_an_unknown_domain(): void