98 lines
2.6 KiB
PHP
98 lines
2.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\AppMenu;
|
|
use Illuminate\Http\Request;
|
|
|
|
class MenuController extends Controller
|
|
{
|
|
/**
|
|
* GET /api/menus
|
|
* List all menus hierarchically
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
// Fetch all active menus ordered by 'order'
|
|
$menus = AppMenu::where('is_active', true)
|
|
->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;
|
|
}
|
|
}
|