From 9c7d0252589eb5be3a0068b992299969c1c5adf3 Mon Sep 17 00:00:00 2001 From: ncoronel Date: Tue, 14 Jul 2026 11:31:30 -0300 Subject: [PATCH] feat: implement Menu management with CRUD operations and database migrations --- .../Menu/Controllers/MenuController.php | 50 +++++++++++++++++++ app/Domains/Menu/Models/Menu.php | 32 ++++++++++++ app/Domains/Menu/Models/TenantMenu.php | 10 ++++ app/Domains/Menu/routes/api.php | 6 +++ app/Domains/Tenant/Models/Tenant.php | 12 +++++ .../2026_07_14_142531_create_menues_table.php | 29 +++++++++++ ...7_14_142539_create_tenant_menues_table.php | 32 ++++++++++++ database/seeders/MenuSeeder.php | 17 +++++++ routes/api.php | 1 + 9 files changed, 189 insertions(+) create mode 100644 app/Domains/Menu/Controllers/MenuController.php create mode 100644 app/Domains/Menu/Models/Menu.php create mode 100644 app/Domains/Menu/Models/TenantMenu.php create mode 100644 app/Domains/Menu/routes/api.php create mode 100644 database/migrations/2026_07_14_142531_create_menues_table.php create mode 100644 database/migrations/2026_07_14_142539_create_tenant_menues_table.php create mode 100644 database/seeders/MenuSeeder.php diff --git a/app/Domains/Menu/Controllers/MenuController.php b/app/Domains/Menu/Controllers/MenuController.php new file mode 100644 index 0000000..5ba4a08 --- /dev/null +++ b/app/Domains/Menu/Controllers/MenuController.php @@ -0,0 +1,50 @@ +json($menues); + } + + public function store(Request $request): JsonResponse + { + $validated = $request->validate([ + 'code' => 'required|string|unique:menues,code', + 'route' => 'required|string', + ]); + + $menu = Menu::create($validated); + return response()->json($menu, 201); + } + + public function show(Menu $menu): JsonResponse + { + return response()->json($menu); + } + + public function update(Request $request, Menu $menu): JsonResponse + { + $validated = $request->validate([ + 'code' => 'sometimes|required|string|unique:menues,code,' . $menu->id, + 'route' => 'sometimes|required|string', + ]); + + $menu->update($validated); + return response()->json($menu); + } + + public function destroy(Menu $menu): JsonResponse + { + $menu->delete(); + return response()->json(null, 204); + } +} diff --git a/app/Domains/Menu/Models/Menu.php b/app/Domains/Menu/Models/Menu.php new file mode 100644 index 0000000..33f106b --- /dev/null +++ b/app/Domains/Menu/Models/Menu.php @@ -0,0 +1,32 @@ +belongsToMany( + Tenant::class, + 'tenant_menues', + 'menu_code', + 'tenant_codigo', + 'code', + 'codigo' + )->withTimestamps(); + } +} diff --git a/app/Domains/Menu/Models/TenantMenu.php b/app/Domains/Menu/Models/TenantMenu.php new file mode 100644 index 0000000..4aeb80f --- /dev/null +++ b/app/Domains/Menu/Models/TenantMenu.php @@ -0,0 +1,10 @@ +hasMany(Product::class, 'tenant_codigo', 'codigo'); } + + public function menues(): \Illuminate\Database\Eloquent\Relations\BelongsToMany + { + return $this->belongsToMany( + \App\Domains\Menu\Models\Menu::class, + 'tenant_menues', + 'tenant_codigo', + 'menu_code', + 'codigo', + 'code' + )->withTimestamps(); + } } diff --git a/database/migrations/2026_07_14_142531_create_menues_table.php b/database/migrations/2026_07_14_142531_create_menues_table.php new file mode 100644 index 0000000..516e7af --- /dev/null +++ b/database/migrations/2026_07_14_142531_create_menues_table.php @@ -0,0 +1,29 @@ +id(); + $table->string('code')->unique(); + $table->string('route'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('menues'); + } +}; diff --git a/database/migrations/2026_07_14_142539_create_tenant_menues_table.php b/database/migrations/2026_07_14_142539_create_tenant_menues_table.php new file mode 100644 index 0000000..715b0a8 --- /dev/null +++ b/database/migrations/2026_07_14_142539_create_tenant_menues_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('tenant_codigo'); + $table->string('menu_code'); + $table->timestamps(); + + $table->foreign('tenant_codigo')->references('codigo')->on('tenants')->onDelete('cascade'); + $table->foreign('menu_code')->references('code')->on('menues')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('tenant_menues'); + } +}; diff --git a/database/seeders/MenuSeeder.php b/database/seeders/MenuSeeder.php new file mode 100644 index 0000000..b3b1793 --- /dev/null +++ b/database/seeders/MenuSeeder.php @@ -0,0 +1,17 @@ +