get(); return view("menus.create", compact('parent_menus')); } /** * Store a newly created resource in storage. */ public function store(Request $request) { try{ $request->validate([ 'name' => 'required|string|max:255', 'url' => 'nullable|string|max:255', 'icon' => 'nullable|string|max:255', 'parent_id' => 'nullable|exists:menus,id', // Ensures it's either null or a valid menu ID 'sort_order' => 'required|integer', ]); DB::beginTransaction(); Menu::create([ 'name' => $request->name, 'url' => $request->url, 'icon' => $request->icon, 'parent_id' => $request->parent_id ?? null, 'sort_order' => $request->sort_order, ]); DB::commit(); return response()->json(['message' => 'Successfully created'], 200); }catch(\Exception $e){ DB::rollBack(); \Log::error('Menu creation failed: ' . $e->getMessage()); // Log the error for debugging return response()->json(['message'=> $e->getMessage()],500); } } /** * Display the specified resource. */ public function show(string $id) { // } /** * Show the form for editing the specified resource. */ public function edit(string $id) { $menu = Menu::findOrFail($id); $parent_menus = Menu::whereNull('parent_id')->where('id','!=',$id)->get(); return view("menus.edit", compact('menu','parent_menus')); } /** * Update the specified resource in storage. */ public function update(Request $request, string $id) { try{ $validateData = $request->validate([ 'name' => 'required', 'url'=> 'required', 'icon'=> 'nullable', 'parent_id' => 'nullable', 'sort_order' => 'required', ]); $menu = Menu::findOrFail($id); DB::beginTransaction(); $menu->update($validateData); DB::commit(); return response()->json(['message' => 'Successfully updated'], 200); }catch(\Exception $e){ DB::rollBack(); \Log::error('Menu update failed: '. $e->getMessage()); // Log the error for debugging return response()->json(['message' => $e->getMessage()],500); } } /** * Remove the specified resource from storage. */ public function destroy(string $id) { try{ DB::beginTransaction(); $menu = Menu::findOrFail($id); $this->deleteChildren($menu); $menu->roles()->detach(); $menu->delete(); DB::commit(); return response()->json(['success' => true, 'message' => 'Successfully deleted']); }catch(\Exception $e){ DB::rollBack(); \Log::error('failed delete menu'. $e->getMessage()); return response()->json(['success' => false, 'message' => 'Something went wrong! Please try again.']); } } private function deleteChildren($menu) { foreach ($menu->children as $child) { $this->deleteChildren($child); // Recursively delete its children $child->roles()->detach(); // Detach roles before deleting $child->delete(); } } }