Your IP : 216.73.216.79


Current Path : /var/www/html/reddsis/app/Http/Controllers/Backend/
Upload File :
Current File : /var/www/html/reddsis/app/Http/Controllers/Backend/MenuController.php

<?php

namespace App\Http\Controllers\Backend;

use App\Http\Controllers\Controller;
use App\Http\Helpers\MenuHelper;
use App\Models\Backend\menu\backend\Menu;
use App\Models\Backend\menu\backend\RoleMapping;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class MenuController extends Controller
{
    public function index(Request $request)
    {
        $search = $request->get('search');

        $menus = Menu::query()
            ->when($search, fn ($query) => $query->where('menu_name', 'like', "%{$search}%")
                ->orWhere('menu_link', 'like', "%{$search}%"))
            ->orderBy('menu_parent_id')
            ->orderBy('menu_name')
            ->paginate(10)
            ->withQueryString();

        $parentNames = Menu::whereIn('menu_id', $menus->pluck('menu_parent_id')->filter()->unique())
            ->pluck('menu_name', 'menu_id');

        return view('backend.module.menu.backend.index', [
            'menus' => $menus,
            'search' => $search,
            'parentNames' => $parentNames,
        ]);
    }

    public function create()
    {
        return view('backend.module.menu.backend.create', [
            'parents' => Menu::dropdown(),
            'routes' => Menu::getRoute(),
        ]);
    }

    public function store(Request $request)
    {
        Menu::create($this->validatedMenu($request));
        MenuHelper::bustCache();

        flash()->success('Backend menu created successfully.');

        return redirect()->route('backend-menu.index');
    }

    public function edit($id)
    {
        return view('backend.module.menu.backend.edit', [
            'menu' => Menu::findOrFail($id),
            'parents' => Menu::dropdown(),
            'routes' => Menu::getRoute(),
        ]);
    }

    public function update(Request $request, $id)
    {
        Menu::findOrFail($id)->update($this->validatedMenu($request));
        MenuHelper::bustCache();

        flash()->success('Backend menu updated successfully.');

        return redirect()->route('backend-menu.index');
    }

    public function destroy($id)
    {
        Menu::findOrFail($id)->delete();
        MenuHelper::bustCache();

        flash()->success('Backend menu deleted successfully.');

        return redirect()->route('backend-menu.index');
    }

    public function delete(Request $request)
    {
        Menu::findOrFail($request->integer('id'))->delete();
        MenuHelper::bustCache();

        return response()->json(['success' => true]);
    }

    public function roledelete($id)
    {
        RoleMapping::findOrFail($id)->delete();
        MenuHelper::bustCache();

        flash()->success('Role mapping deleted successfully.');

        return back();
    }

    public function assignMenu(Request $request)
    {
        $role = $request->get('role_code');

        if ($request->isMethod('post')) {
            $data = $request->validate([
                'role_code' => ['required', 'string'],
                'menu_id' => ['required', 'integer', 'exists:backend_menu,menu_id'],
                'parent_id' => ['nullable', 'integer'],
            ]);

            $sort = RoleMapping::where('role_code', $data['role_code'])
                ->where('parent_id', $data['parent_id'] ?? 0)
                ->max('sort') + 1;

            RoleMapping::create([
                'role_code' => $data['role_code'],
                'menu_id' => $data['menu_id'],
                'parent_id' => $data['parent_id'] ?? 0,
                'sort' => $sort,
                'created_by' => (string) auth('admin')->id(),
                'updated_by' => (string) auth('admin')->id(),
            ]);

            MenuHelper::bustCache();
            flash()->success('Menu assigned successfully.');

            return redirect()->route('backend-menu.assign', ['role_code' => $data['role_code']]);
        }

        return view('backend.module.menu.backend.assign', [
            'menus' => Menu::dropdown(),
            'roles' => Menu::getRole(),
            'role' => $role,
            'assignedMenus' => $role ? RoleMapping::nestedmenu(0, $role, 0) : [],
        ]);
    }

    public function level($id, $role, $pos, $sort)
    {
        DB::transaction(function () use ($id, $role, $pos, $sort) {
            $current = RoleMapping::findOrFail($id);
            $targetSort = (int) $sort + ((string) $pos === 'up' ? -1 : 1);

            $target = RoleMapping::where('role_code', $role)
                ->where('parent_id', $current->parent_id)
                ->where('sort', $targetSort)
                ->first();

            if ($target) {
                $target->update(['sort' => $current->sort]);
                $current->update(['sort' => $targetSort]);
            }
        });

        MenuHelper::bustCache();

        flash()->success('Menu position updated successfully.');

        return back();
    }

    public function stub()
    {
        return response()->json(MenuHelper::getMenu(), 200, [], JSON_PRETTY_PRINT);
    }

    public function disabled($id)
    {
        $menu = Menu::findOrFail($id);
        $menu->update(['menu_status' => !$menu->menu_status]);
        MenuHelper::bustCache();

        flash()->success('Backend menu status updated successfully.');

        return back();
    }

    private function validatedMenu(Request $request): array
    {
        $data = $request->validate([
            'menu_name' => ['required', 'string', 'max:255'],
            'menu_param' => ['nullable', 'string', 'max:255'],
            'menu_class' => ['nullable', 'string', 'max:50'],
            'menu_link' => ['nullable', 'string', 'max:255'],
            'menu_active_route' => ['nullable', 'array'],
            'menu_parent_id' => ['nullable', 'integer'],
            'menu_status' => ['nullable', 'boolean'],
        ]);

        $data['menu_active_route'] = $data['menu_active_route'] ?? [];
        $data['menu_parent_id'] = $data['menu_parent_id'] ?? 0;
        $data['menu_status'] = $request->boolean('menu_status');

        return $data;
    }
}