user(); $tenantId = request()->attributes->get('tenant_id'); if (! $user) { return $this->error('Unauthenticated', 401); } if ($user->isMasterAdmin()) { $menus = MenuList::query() ->where('is_active', true) ->orderBy('sort_order') ->orderBy('id') ->get() ->map(function (MenuList $menu) { return [ 'id' => $menu->id, 'parent_id' => $menu->parent_id, 'name' => $menu->name, 'slug' => $menu->slug, 'url' => $menu->url, 'icon' => $menu->icon, 'component' => $menu->component, 'sort_order' => $menu->sort_order, 'permissions' => [ 'can_view' => true, 'can_create' => true, 'can_update' => true, 'can_delete' => true, 'can_approve' => true, 'can_export' => true, ], ]; }); } else { $menuRows = DB::table('menu_lists as m') ->join('menu_group_menus as mgm', 'mgm.menu_id', '=', 'm.id') ->join('user_menu_groups as umg', 'umg.menu_group_id', '=', 'mgm.menu_group_id') ->join('menu_groups as mg', 'mg.id', '=', 'umg.menu_group_id') ->where('umg.user_id', $user->id) ->where('umg.tenant_id', $tenantId) ->where('mg.is_active', true) ->where('m.is_active', true) ->where('mgm.can_view', true) ->groupBy( 'm.id', 'm.parent_id', 'm.name', 'm.slug', 'm.url', 'm.icon', 'm.component', 'm.sort_order' ) ->select( 'm.id', 'm.parent_id', 'm.name', 'm.slug', 'm.url', 'm.icon', 'm.component', 'm.sort_order', DB::raw('MAX(CASE WHEN mgm.can_view THEN 1 ELSE 0 END) as can_view'), DB::raw('MAX(CASE WHEN mgm.can_create THEN 1 ELSE 0 END) as can_create'), DB::raw('MAX(CASE WHEN mgm.can_update THEN 1 ELSE 0 END) as can_update'), DB::raw('MAX(CASE WHEN mgm.can_delete THEN 1 ELSE 0 END) as can_delete'), DB::raw('MAX(CASE WHEN mgm.can_approve THEN 1 ELSE 0 END) as can_approve'), DB::raw('MAX(CASE WHEN mgm.can_export THEN 1 ELSE 0 END) as can_export') ) ->orderBy('m.sort_order') ->orderBy('m.id') ->get(); $menus = $menuRows->map(function ($row) { return [ 'id' => (int) $row->id, 'parent_id' => $row->parent_id ? (int) $row->parent_id : null, 'name' => $row->name, 'slug' => $row->slug, 'url' => $row->url, 'icon' => $row->icon, 'component' => $row->component, 'sort_order' => (int) $row->sort_order, 'permissions' => [ 'can_view' => (bool) $row->can_view, 'can_create' => (bool) $row->can_create, 'can_update' => (bool) $row->can_update, 'can_delete' => (bool) $row->can_delete, 'can_approve' => (bool) $row->can_approve, 'can_export' => (bool) $row->can_export, ], ]; }); } $tree = $this->buildMenuTree($menus); return $this->success( [ 'is_master' => (bool) $user->is_master, 'access_level' => $user->access_level->value, 'tenant_id' => $tenantId, 'menus' => $tree, ], 'Menu berhasil diambil' ); } private function buildMenuTree(Collection $menus, ?int $parentId = null): array { return $menus ->filter(fn ($menu) => $menu['parent_id'] === $parentId) ->sortBy('sort_order') ->values() ->map(function ($menu) use ($menus) { $children = $this->buildMenuTree($menus, $menu['id']); return [ 'id' => $menu['id'], 'parent_id' => $menu['parent_id'], 'name' => $menu['name'], 'slug' => $menu['slug'], 'url' => $menu['url'], 'icon' => $menu['icon'], 'component' => $menu['component'], 'sort_order' => $menu['sort_order'], 'permissions' => $menu['permissions'], 'children' => $children, ]; }) ->all(); } }