feat(menu): implement menu hierarchy and static content for help section in MenuSeeder and related tests

This commit is contained in:
2026-07-23 17:07:55 -03:00
parent 2b1ef5f8a9
commit 460eec3c78
4 changed files with 391 additions and 3 deletions

View File

@@ -2,9 +2,11 @@
namespace App\Domains\Tenant\Resources;
use App\Domains\Menu\Models\Menu;
use App\Domains\Tenant\Models\Tenant;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Collection;
/**
* @mixin Tenant
@@ -55,7 +57,49 @@ class TenantResource extends JsonResource
])
->values()
),
'menues' => $this->whenLoaded('menues'),
'menues' => $this->whenLoaded(
'menues',
fn () => $this->menuTree($this->menues)
),
];
}
/**
* @param Collection<int, Menu> $menus
* @return Collection<int, array<string, mixed>>
*/
private function menuTree(Collection $menus): Collection
{
$menuCodes = $menus->pluck('code')->flip();
$childrenByParent = $menus
->filter(fn (Menu $menu) => $menu->parent_menu_code !== null)
->groupBy('parent_menu_code');
$formatMenu = function (Menu $menu) use (&$formatMenu, $childrenByParent): array {
$formatted = [
'id' => $menu->id,
'code' => $menu->code,
'parent_menu_code' => $menu->parent_menu_code,
'content_type' => $menu->content_type,
'route' => $menu->route,
];
if ($menu->pivot?->static_content !== null) {
$formatted['static_content'] = $menu->pivot->static_content;
}
$formatted['submenues'] = $childrenByParent
->get($menu->code, collect())
->map($formatMenu)
->values();
return $formatted;
};
return $menus
->filter(fn (Menu $menu) => $menu->parent_menu_code === null
|| ! $menuCodes->has($menu->parent_menu_code))
->map($formatMenu)
->values();
}
}