feat(menus): add storefront category permissions
This commit is contained in:
@@ -0,0 +1,81 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
private const MENUS = [
|
||||||
|
'event.category' => [
|
||||||
|
'label' => 'Categoría de eventos',
|
||||||
|
'route' => '/eventos/categoria/:id',
|
||||||
|
],
|
||||||
|
'product.category' => [
|
||||||
|
'label' => 'Categoría de productos',
|
||||||
|
'route' => '/categoria/:id',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
$now = now();
|
||||||
|
|
||||||
|
DB::transaction(function () use ($now): void {
|
||||||
|
foreach (self::MENUS as $code => $menu) {
|
||||||
|
DB::table('menues')->updateOrInsert(
|
||||||
|
['code' => $code],
|
||||||
|
[
|
||||||
|
'label' => $menu['label'],
|
||||||
|
'parent_menu_code' => null,
|
||||||
|
'content_type' => 'dynamic',
|
||||||
|
'static_content_schema' => null,
|
||||||
|
'route' => $menu['route'],
|
||||||
|
'created_at' => $now,
|
||||||
|
'updated_at' => $now,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
DB::table('roles')
|
||||||
|
->whereIn('codigo', ['admin', 'adminapp', 'user'])
|
||||||
|
->pluck('codigo')
|
||||||
|
->each(function (string $roleCode): void {
|
||||||
|
foreach (array_keys(self::MENUS) as $menuCode) {
|
||||||
|
DB::table('roles_menues')->updateOrInsert([
|
||||||
|
'rol_codigo' => $roleCode,
|
||||||
|
'menu_codigo' => $menuCode,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
DB::table('tenants')
|
||||||
|
->pluck('codigo')
|
||||||
|
->each(function (string $tenantCode) use ($now): void {
|
||||||
|
$menuCode = $tenantCode === 'onticket' ? 'event.category' : 'product.category';
|
||||||
|
|
||||||
|
DB::table('tenants_menues')->updateOrInsert(
|
||||||
|
[
|
||||||
|
'tenant_code' => $tenantCode,
|
||||||
|
'menu_code' => $menuCode,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'static_content' => null,
|
||||||
|
'created_at' => $now,
|
||||||
|
'updated_at' => $now,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
DB::transaction(function (): void {
|
||||||
|
$menuCodes = array_keys(self::MENUS);
|
||||||
|
|
||||||
|
DB::table('tenants_menues')->whereIn('menu_code', $menuCodes)->delete();
|
||||||
|
DB::table('roles_menues')->whereIn('menu_codigo', $menuCodes)->delete();
|
||||||
|
DB::table('menues')->whereIn('code', $menuCodes)->delete();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -18,11 +18,21 @@ class MenuSeeder extends Seeder
|
|||||||
$menus = [
|
$menus = [
|
||||||
['code' => 'index', 'label' => 'Inicio', 'route' => '/'],
|
['code' => 'index', 'label' => 'Inicio', 'route' => '/'],
|
||||||
['code' => 'event.index', 'label' => 'Eventos', 'route' => '/'],
|
['code' => 'event.index', 'label' => 'Eventos', 'route' => '/'],
|
||||||
|
[
|
||||||
|
'code' => 'event.category',
|
||||||
|
'label' => 'Categoría de eventos',
|
||||||
|
'route' => '/eventos/categoria/:id',
|
||||||
|
],
|
||||||
[
|
[
|
||||||
'code' => 'event.detail',
|
'code' => 'event.detail',
|
||||||
'label' => 'Detalle de evento',
|
'label' => 'Detalle de evento',
|
||||||
'route' => '/evento/:id',
|
'route' => '/evento/:id',
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
'code' => 'product.category',
|
||||||
|
'label' => 'Categoría de productos',
|
||||||
|
'route' => '/categoria/:id',
|
||||||
|
],
|
||||||
[
|
[
|
||||||
'code' => 'product.detail',
|
'code' => 'product.detail',
|
||||||
'label' => 'Detalle de producto',
|
'label' => 'Detalle de producto',
|
||||||
@@ -299,8 +309,12 @@ class MenuSeeder extends Seeder
|
|||||||
];
|
];
|
||||||
$onTicketMenuCodes = [
|
$onTicketMenuCodes = [
|
||||||
'event.index',
|
'event.index',
|
||||||
|
'event.category',
|
||||||
'event.detail',
|
'event.detail',
|
||||||
];
|
];
|
||||||
|
$catalogMenuCodes = [
|
||||||
|
'product.category',
|
||||||
|
];
|
||||||
$frequentlyAskedQuestions = [
|
$frequentlyAskedQuestions = [
|
||||||
[
|
[
|
||||||
'pregunta' => '¿Hay algún límite de compra?',
|
'pregunta' => '¿Hay algún límite de compra?',
|
||||||
@@ -370,6 +384,8 @@ class MenuSeeder extends Seeder
|
|||||||
|
|
||||||
if ($tenant->codigo !== 'onticket') {
|
if ($tenant->codigo !== 'onticket') {
|
||||||
$menuCodes = array_diff($menuCodes, $onTicketMenuCodes);
|
$menuCodes = array_diff($menuCodes, $onTicketMenuCodes);
|
||||||
|
} else {
|
||||||
|
$menuCodes = array_diff($menuCodes, $catalogMenuCodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Usar sync para asociar los menues al tenant
|
// Usar sync para asociar los menues al tenant
|
||||||
|
|||||||
@@ -193,6 +193,7 @@ class MenuSeederTest extends TestCase
|
|||||||
|
|
||||||
foreach ([
|
foreach ([
|
||||||
'event.index' => '/',
|
'event.index' => '/',
|
||||||
|
'event.category' => '/eventos/categoria/:id',
|
||||||
'event.detail' => '/evento/:id',
|
'event.detail' => '/evento/:id',
|
||||||
] as $code => $route) {
|
] as $code => $route) {
|
||||||
$menu = Menu::query()->where('code', $code)->firstOrFail();
|
$menu = Menu::query()->where('code', $code)->firstOrFail();
|
||||||
@@ -209,6 +210,20 @@ class MenuSeederTest extends TestCase
|
|||||||
->exists()
|
->exists()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$productCategory = Menu::query()->where('code', 'product.category')->firstOrFail();
|
||||||
|
|
||||||
|
$this->assertSame('/categoria/:id', $productCategory->route);
|
||||||
|
$this->assertFalse($onTicket->menues()->where('menues.code', 'product.category')->exists());
|
||||||
|
$this->assertTrue($otherTenant->menues()->where('menues.code', 'product.category')->exists());
|
||||||
|
$this->assertTrue(
|
||||||
|
Role::query()
|
||||||
|
->where('codigo', RoleCode::User->value)
|
||||||
|
->firstOrFail()
|
||||||
|
->menus()
|
||||||
|
->where('menues.code', 'product.category')
|
||||||
|
->exists()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function test_it_seeds_the_account_menu_hierarchy(): void
|
public function test_it_seeds_the_account_menu_hierarchy(): void
|
||||||
|
|||||||
Reference in New Issue
Block a user