diff --git a/app/Domains/Menu/Controllers/MenuController.php b/app/Domains/Menu/Controllers/MenuController.php index 5ba4a08..5a8588d 100644 --- a/app/Domains/Menu/Controllers/MenuController.php +++ b/app/Domains/Menu/Controllers/MenuController.php @@ -4,14 +4,16 @@ namespace App\Domains\Menu\Controllers; use App\Domains\Menu\Models\Menu; use App\Http\Controllers\Controller; -use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; +use Illuminate\Validation\Rule; class MenuController extends Controller { public function index(): JsonResponse { $menues = Menu::all(); + return response()->json($menues); } @@ -19,10 +21,19 @@ class MenuController extends Controller { $validated = $request->validate([ 'code' => 'required|string|unique:menues,code', + 'parent_menu_code' => [ + 'nullable', + 'string', + Rule::exists('menues', 'code'), + 'different:code', + ], + 'content_type' => ['sometimes', Rule::in(['static', 'dynamic'])], + 'static_content_schema' => 'nullable|array', 'route' => 'required|string', ]); $menu = Menu::create($validated); + return response()->json($menu, 201); } @@ -34,17 +45,27 @@ class MenuController extends Controller public function update(Request $request, Menu $menu): JsonResponse { $validated = $request->validate([ - 'code' => 'sometimes|required|string|unique:menues,code,' . $menu->id, + 'code' => 'sometimes|required|string|unique:menues,code,'.$menu->id, + 'parent_menu_code' => [ + 'nullable', + 'string', + Rule::exists('menues', 'code'), + Rule::notIn([$menu->code]), + ], + 'content_type' => ['sometimes', Rule::in(['static', 'dynamic'])], + 'static_content_schema' => 'nullable|array', '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 index 33f106b..a767df5 100644 --- a/app/Domains/Menu/Models/Menu.php +++ b/app/Domains/Menu/Models/Menu.php @@ -5,7 +5,9 @@ namespace App\Domains\Menu\Models; use App\Domains\Tenant\Models\Tenant; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\HasMany; class Menu extends Model { @@ -15,18 +17,41 @@ class Menu extends Model protected $fillable = [ 'code', + 'parent_menu_code', + 'content_type', + 'static_content_schema', 'route', ]; + protected function casts(): array + { + return [ + 'static_content_schema' => 'array', + ]; + } + + public function parent(): BelongsTo + { + return $this->belongsTo(self::class, 'parent_menu_code', 'code'); + } + + public function children(): HasMany + { + return $this->hasMany(self::class, 'parent_menu_code', 'code'); + } + public function tenants(): BelongsToMany { return $this->belongsToMany( Tenant::class, - 'tenant_menues', + 'tenants_menues', 'menu_code', - 'tenant_codigo', + 'tenant_code', 'code', 'codigo' - )->withTimestamps(); + ) + ->using(TenantMenu::class) + ->withPivot('static_content') + ->withTimestamps(); } } diff --git a/app/Domains/Menu/Models/TenantMenu.php b/app/Domains/Menu/Models/TenantMenu.php index 4aeb80f..2fb495e 100644 --- a/app/Domains/Menu/Models/TenantMenu.php +++ b/app/Domains/Menu/Models/TenantMenu.php @@ -2,9 +2,36 @@ namespace App\Domains\Menu\Models; +use App\Domains\Tenant\Models\Tenant; +use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\Pivot; class TenantMenu extends Pivot { - protected $table = 'tenant_menues'; + protected $table = 'tenants_menues'; + + public $incrementing = true; + + protected $fillable = [ + 'tenant_code', + 'menu_code', + 'static_content', + ]; + + protected function casts(): array + { + return [ + 'static_content' => 'array', + ]; + } + + public function tenant(): BelongsTo + { + return $this->belongsTo(Tenant::class, 'tenant_code', 'codigo'); + } + + public function menu(): BelongsTo + { + return $this->belongsTo(Menu::class, 'menu_code', 'code'); + } } diff --git a/app/Domains/Tenant/Models/Tenant.php b/app/Domains/Tenant/Models/Tenant.php index 43a1570..1df48df 100644 --- a/app/Domains/Tenant/Models/Tenant.php +++ b/app/Domains/Tenant/Models/Tenant.php @@ -5,6 +5,7 @@ namespace App\Domains\Tenant\Models; use App\Domains\Attachable\Models\Attachment; use App\Domains\Catalog\Models\CatalogItem; use App\Domains\Menu\Models\Menu; +use App\Domains\Menu\Models\TenantMenu; use Illuminate\Database\Eloquent\Attributes\Fillable; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -116,11 +117,14 @@ class Tenant extends Model { return $this->belongsToMany( Menu::class, - 'tenant_menues', - 'tenant_codigo', + 'tenants_menues', + 'tenant_code', 'menu_code', 'codigo', 'code' - )->withTimestamps(); + ) + ->using(TenantMenu::class) + ->withPivot('static_content') + ->withTimestamps(); } } diff --git a/database/migrations/2026_07_23_000400_refactor_menues_content_model.php b/database/migrations/2026_07_23_000400_refactor_menues_content_model.php new file mode 100644 index 0000000..537278e --- /dev/null +++ b/database/migrations/2026_07_23_000400_refactor_menues_content_model.php @@ -0,0 +1,84 @@ +dropForeign(['tenant_codigo']); + $table->dropForeign(['menu_code']); + }); + + Schema::rename('tenant_menues', 'tenants_menues'); + + Schema::table('tenants_menues', function (Blueprint $table) { + $table->renameColumn('tenant_codigo', 'tenant_code'); + $table->json('static_content')->nullable(); + }); + + Schema::table('menues', function (Blueprint $table) { + $table->string('parent_menu_code')->nullable()->after('code'); + $table->enum('content_type', ['static', 'dynamic']) + ->default('dynamic') + ->after('parent_menu_code'); + $table->json('static_content_schema')->nullable()->after('content_type'); + }); + + Schema::table('menues', function (Blueprint $table) { + $table->foreign('parent_menu_code') + ->references('code') + ->on('menues') + ->nullOnDelete(); + }); + + Schema::table('tenants_menues', function (Blueprint $table) { + $table->foreign('tenant_code') + ->references('codigo') + ->on('tenants') + ->cascadeOnDelete(); + $table->foreign('menu_code') + ->references('code') + ->on('menues') + ->cascadeOnDelete(); + }); + } + + public function down(): void + { + Schema::table('tenants_menues', function (Blueprint $table) { + $table->dropForeign(['tenant_code']); + $table->dropForeign(['menu_code']); + }); + + Schema::table('menues', function (Blueprint $table) { + $table->dropForeign(['parent_menu_code']); + $table->dropColumn([ + 'parent_menu_code', + 'content_type', + 'static_content_schema', + ]); + }); + + Schema::table('tenants_menues', function (Blueprint $table) { + $table->dropColumn('static_content'); + $table->renameColumn('tenant_code', 'tenant_codigo'); + }); + + Schema::rename('tenants_menues', 'tenant_menues'); + + Schema::table('tenant_menues', function (Blueprint $table) { + $table->foreign('tenant_codigo') + ->references('codigo') + ->on('tenants') + ->cascadeOnDelete(); + $table->foreign('menu_code') + ->references('code') + ->on('menues') + ->cascadeOnDelete(); + }); + } +};