diff --git a/app/Domains/FiestaFutbolInfantil/Controllers/AccommodationController.php b/app/Domains/FiestaFutbolInfantil/Controllers/AccommodationController.php index 24dee94..b3aab5e 100644 --- a/app/Domains/FiestaFutbolInfantil/Controllers/AccommodationController.php +++ b/app/Domains/FiestaFutbolInfantil/Controllers/AccommodationController.php @@ -15,8 +15,6 @@ class AccommodationController extends Controller { $tenant = $request->user()->tenant()->firstOrFail(); - abort_unless($tenant->codigo === 'fiesta_futbol_infantil', 404); - return AccommodationResource::make( $this->accommodationService->upsertMany( $tenant, diff --git a/app/Domains/FiestaFutbolInfantil/Controllers/EntryController.php b/app/Domains/FiestaFutbolInfantil/Controllers/EntryController.php index dd02d65..d7aec23 100644 --- a/app/Domains/FiestaFutbolInfantil/Controllers/EntryController.php +++ b/app/Domains/FiestaFutbolInfantil/Controllers/EntryController.php @@ -16,8 +16,6 @@ class EntryController extends Controller { $tenant = $request->user()->tenant()->firstOrFail(); - abort_unless($tenant->codigo === 'fiesta_futbol_infantil', 404); - $entries = $this->entryService->upsertMany( $tenant, $request->validated('entries'), diff --git a/app/Domains/FiestaFutbolInfantil/Controllers/FoodController.php b/app/Domains/FiestaFutbolInfantil/Controllers/FoodController.php index 6ced376..c9b0513 100644 --- a/app/Domains/FiestaFutbolInfantil/Controllers/FoodController.php +++ b/app/Domains/FiestaFutbolInfantil/Controllers/FoodController.php @@ -15,8 +15,6 @@ class FoodController extends Controller { $tenant = $request->user()->tenant()->firstOrFail(); - abort_unless($tenant->codigo === 'fiesta_futbol_infantil', 404); - return FoodResource::make( $this->foodService->upsertMany( $tenant, diff --git a/app/Domains/FiestaFutbolInfantil/routes/api.php b/app/Domains/FiestaFutbolInfantil/routes/api.php index cbb4750..48209ff 100644 --- a/app/Domains/FiestaFutbolInfantil/routes/api.php +++ b/app/Domains/FiestaFutbolInfantil/routes/api.php @@ -9,9 +9,12 @@ Route::prefix('v1/adminapp/tenant') ->middleware(['auth:sanctum', 'adminapp.tenant']) ->group(function (): void { Route::post('entries', [EntryController::class, 'store']) + ->middleware('tenant.menu:adminapp.fiesta-futbol-infantil.entradas') ->name('adminapp.fiesta-futbol-infantil.entries.store'); Route::post('foods', [FoodController::class, 'store']) + ->middleware('tenant.menu:adminapp.fiesta-futbol-infantil.comida') ->name('adminapp.fiesta-futbol-infantil.foods.store'); Route::post('accommodations', [AccommodationController::class, 'store']) + ->middleware('tenant.menu:adminapp.fiesta-futbol-infantil.alojamientos') ->name('adminapp.fiesta-futbol-infantil.accommodations.store'); }); diff --git a/app/Http/Middleware/EnsureTenantHasMenu.php b/app/Http/Middleware/EnsureTenantHasMenu.php new file mode 100644 index 0000000..659b065 --- /dev/null +++ b/app/Http/Middleware/EnsureTenantHasMenu.php @@ -0,0 +1,22 @@ +user()?->tenant()->first(); + $hasMenu = $tenant?->menues() + ->where('menues.code', $menuCode) + ->exists() ?? false; + + abort_unless($hasMenu, 404); + + return $next($request); + } +} diff --git a/bootstrap/app.php b/bootstrap/app.php index 01e3e9d..1760f1d 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -3,6 +3,7 @@ use App\Domains\Auth\Exceptions\AccountLockedException; use App\Domains\Ticket\Exceptions\TicketNotAvailableException; use App\Http\Middleware\EnsureAdminAppTenant; +use App\Http\Middleware\EnsureTenantHasMenu; use App\Http\Middleware\SetApiLocale; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Auth\AuthenticationException; @@ -24,6 +25,7 @@ return Application::configure(basePath: dirname(__DIR__)) ->withMiddleware(function (Middleware $middleware): void { $middleware->alias([ 'adminapp.tenant' => EnsureAdminAppTenant::class, + 'tenant.menu' => EnsureTenantHasMenu::class, ]); $middleware->encryptCookies(except: [ 'guest_token', diff --git a/tests/Feature/FiestaFutbolInfantil/AccommodationControllerTest.php b/tests/Feature/FiestaFutbolInfantil/AccommodationControllerTest.php index 424c28d..32a98db 100644 --- a/tests/Feature/FiestaFutbolInfantil/AccommodationControllerTest.php +++ b/tests/Feature/FiestaFutbolInfantil/AccommodationControllerTest.php @@ -7,6 +7,7 @@ use App\Domains\Attachable\Models\Attachment; use App\Domains\Auth\Models\User; use App\Domains\Authorization\Enums\RoleCode; use App\Domains\Catalog\Models\Attribute; +use App\Domains\Menu\Models\Menu; use App\Domains\Shared\Enums\FieldType; use App\Domains\Tenant\Models\Tenant; use App\Domains\Tenant\Models\WebsiteType; @@ -135,9 +136,39 @@ class AccommodationControllerTest extends TestCase $this->assertDatabaseCount('attribute_options', 0); } - /** @return array{Tenant, Attribute} */ - private function configuredTenant(): array + public function test_the_tenant_must_have_the_accommodations_menu(): void { + [$tenant] = $this->configuredTenant(withMenu: false); + Sanctum::actingAs($this->createAdminAppUser($tenant)); + + $this->postJson('/api/v1/adminapp/tenant/accommodations', [ + 'variants' => [ + $this->variantPayload('Carpa', null, 10, 35000), + ], + ])->assertNotFound(); + + $this->assertDatabaseCount('catalog_items', 0); + } + + public function test_a_different_tenant_can_use_the_endpoint_when_it_has_the_menu(): void + { + [$tenant] = $this->configuredTenant('another_tenant'); + Sanctum::actingAs($this->createAdminAppUser($tenant)); + + $this->postJson('/api/v1/adminapp/tenant/accommodations', [ + 'variants' => [ + $this->variantPayload('Dormitorio Compartido', null, 30, 25000), + ], + ]) + ->assertOk() + ->assertJsonPath('data.variants.0.value', 'dormitorio_compartido'); + } + + /** @return array{Tenant, Attribute} */ + private function configuredTenant( + string $tenantCode = 'fiesta_futbol_infantil', + bool $withMenu = true, + ): array { $headerLogo = Attachment::query()->create([ 'path' => 'test/header.png', 'filename' => 'header.png', @@ -151,7 +182,7 @@ class AccommodationControllerTest extends TestCase 'mime_type' => 'image/png', ]); $tenant = Tenant::query()->create([ - 'codigo' => 'fiesta_futbol_infantil', + 'codigo' => $tenantCode, 'nombre' => 'Fiesta FĂștbol Infantil', 'dominio' => 'fiesta.test', 'primary_color' => '#112233', @@ -171,6 +202,14 @@ class AccommodationControllerTest extends TestCase 'is_required' => true, ]); + if ($withMenu) { + $menu = Menu::query()->firstOrCreate( + ['code' => 'adminapp.fiesta-futbol-infantil.alojamientos'], + ['label' => 'Alojamientos', 'route' => '/admin/alojamientos'], + ); + $tenant->menues()->syncWithoutDetaching([$menu->code]); + } + return [$tenant, $attribute]; } diff --git a/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php b/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php index 7f8c7b6..a95f9a5 100644 --- a/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php +++ b/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php @@ -7,6 +7,7 @@ use App\Domains\Authorization\Enums\RoleCode; use App\Domains\Catalog\Models\Attribute; use App\Domains\Catalog\Models\CatalogItem; use App\Domains\Catalog\Models\Category; +use App\Domains\Menu\Models\Menu; use App\Domains\Shared\Enums\FieldType; use App\Domains\Tenant\Models\Tenant; use App\Domains\Tenant\Models\WebsiteType; @@ -211,7 +212,15 @@ class EntryControllerTest extends TestCase private function createFiestaTenant(): Tenant { - return $this->createTenant('fiesta_futbol_infantil'); + $tenant = $this->createTenant('fiesta_futbol_infantil'); + $menu = Menu::query()->create([ + 'code' => 'adminapp.fiesta-futbol-infantil.entradas', + 'label' => 'Entradas', + 'route' => '/admin/entradas', + ]); + $tenant->menues()->attach($menu->code); + + return $tenant; } private function createTenant(string $code): Tenant diff --git a/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php b/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php index 623c313..056ab55 100644 --- a/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php +++ b/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php @@ -6,6 +6,7 @@ use App\Domains\Auth\Models\User; use App\Domains\Authorization\Enums\RoleCode; use App\Domains\Catalog\Models\Attribute; use App\Domains\Catalog\Models\Category; +use App\Domains\Menu\Models\Menu; use App\Domains\Shared\Enums\FieldType; use App\Domains\Tenant\Models\Tenant; use App\Domains\Tenant\Models\WebsiteType; @@ -180,6 +181,12 @@ class FoodControllerTest extends TestCase 'time_start' => '00:00', 'time_end' => '23:59', ]); + $menu = Menu::query()->create([ + 'code' => 'adminapp.fiesta-futbol-infantil.comida', + 'label' => 'Comida', + 'route' => '/admin/comidas', + ]); + $tenant->menues()->attach($menu->code); $this->assertNotNull($eventDateAttribute);