orderBy('order', 'asc') ->get(); // If 'flat' param provided, return as flat list (for permission checkboxes) if ($request->has('flat')) { return response()->json(['success' => true, 'menus' => $menus]); } // Build Hierarchy (Parent -> Children) $hierarchy = $this->buildTree($menus); return response()->json([ 'success' => true, 'menus' => $hierarchy ]); } /** * POST /api/menus * Create new menu */ public function store(Request $request) { // Usually restricted to Super Admin $validated = $request->validate([ 'label' => 'required|string', 'key' => 'required|string|unique:app_menus,key', 'icon' => 'nullable|string', 'route' => 'nullable|string', 'parent_id' => 'nullable|string', 'order' => 'integer', ]); $menu = AppMenu::create(array_merge($validated, ['is_active' => true])); return response()->json(['success' => true, 'menu' => $menu]); } /** * PUT /api/menus/{id} */ public function update(Request $request, $id) { $menu = AppMenu::find($id); if (!$menu) return response()->json(['success' => false, 'message' => 'Not found'], 404); $menu->update($request->all()); return response()->json(['success' => true, 'menu' => $menu]); } /** * DELETE /api/menus/{id} */ public function destroy($id) { $menu = AppMenu::find($id); if (!$menu) return response()->json(['success' => false, 'message' => 'Not found'], 404); $menu->delete(); return response()->json(['success' => true, 'message' => 'Deleted']); } // Helper to build tree private function buildTree($elements, $parentId = null) { $branch = []; foreach ($elements as $element) { if ($element->parent_id == $parentId) { $children = $this->buildTree($elements, $element->id); if ($children) { $element->children = $children; } $branch[] = $element; } } return $branch; } }