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/FrontendMenuController.php

<?php

namespace App\Http\Controllers\Backend;

use App\Http\Controllers\Controller;
use App\Models\Backend\menu\frontend\Menu;
use App\Models\Backend\menu\frontend\MenuCategory;
use App\Models\Backend\menu\frontend\RoleMapping;
use App\Services\MenuFilterService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;

class FrontendMenuController extends Controller
{
    public function __construct(
        protected MenuFilterService $menuFilter
    ) {}

    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_id')
            ->paginate(10)
            ->withQueryString();

        $parentNames = Menu::pluck('menu_name', 'menu_id');

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

    public function create()
    {
        $parentMenus = Menu::where('menu_status', true)
            ->where('menu_parent_id', 0)
            ->pluck('menu_name', 'menu_id');

        return view('backend.module.menu.frontend.create', [
            'parentMenus' => $parentMenus,
        ]);
    }

    public function store(Request $request)
    {
        Menu::create($this->validatedMenu($request));
        Cache::forget('frontend_nav');

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

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

    public function edit($id)
    {
        $parentMenus = Menu::where('menu_status', true)
            ->where('menu_parent_id', 0)
            ->pluck('menu_name', 'menu_id');

        return view('backend.module.menu.frontend.edit', [
            'menu' => Menu::findOrFail($id),
            'parentMenus' => $parentMenus,
        ]);
    }

    public function update(Request $request, $id)
    {
        $menu = Menu::findOrFail($id);
        $menu->update($this->validatedMenu($request));
        Cache::forget('frontend_nav');

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

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

    public function destroy($id)
    {
        Menu::findOrFail($id)->delete();
        Cache::forget('frontend_nav');

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

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

    public function delete(Request $request)
    {
        $this->destroy($request->integer('id'));

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

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

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

        return redirect()->back()->withInput($this->menuFilter->getParam());
    }

    public function assignMenu(Request $request)
    {
        if ($request->isMethod('post')) {
            $data = $request->validate([
                'role_code' => ['required', 'string'],
                'menu_group' => ['nullable', 'string'],
                'menu_id' => ['required', 'integer', 'exists:frontend_menu,menu_id'],
                'parent_id' => ['nullable', 'integer'],
                'page_id' => ['nullable', 'integer'],
                'site_id' => ['nullable', 'integer'],
                'category_id' => ['nullable', 'integer', 'exists:frontend_menu_category,category_id'],
                'status' => ['nullable', 'boolean'],
            ]);

            $data['menu_group'] = $data['menu_group'] ?? '';

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

            $data['parent_id'] = $data['parent_id'] ?? 0;
            $data['sort'] = $sort;
            $data['status'] = $request->boolean('status', true);
            $data['created_by'] = (string) auth('admin')->id();
            $data['updated_by'] = (string) auth('admin')->id();

            RoleMapping::create($data);

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

            unset($data['parent_id']);

            return $this->menuFilter->redirectAfterSave($data);
        }

        $siteId = $request->integer('site_id', 0);
        $pageId = $request->integer('page_id', 0);
        $categoryId = $request->integer('category_id', 0);

        $categories = MenuCategory::dropdown();

        $groupedRoles = RoleMapping::select('role_code')
            ->distinct()
            ->when($siteId, fn($q) => $q->where('site_id', $siteId))
            ->when($pageId, fn($q) => $q->where('page_id', $pageId))
            ->when($categoryId, fn($q) => $q->where('category_id', $categoryId))
            ->pluck('role_code');

        $assignedMenusByRole = [];
        foreach ($groupedRoles as $roleCode) {
            $rootMappings = RoleMapping::with(['menu', 'category'])
                ->where('role_code', $roleCode)
                ->where('parent_id', 0)
                ->when($categoryId, fn($q) => $q->where('category_id', $categoryId))
                ->when($siteId, fn($q) => $q->where('site_id', $siteId))
                ->when($pageId, fn($q) => $q->where('page_id', $pageId))
                ->orderBy('sort')
                ->get();

            $tree = [];
            foreach ($rootMappings as $mapping) {
                if (!$mapping->menu || !$mapping->menu->menu_status) {
                    continue;
                }
                $children = RoleMapping::nestedmenu($mapping->menu_id, $roleCode, null, 1, [
                    'category_id' => $mapping->category_id ?: null,
                    'site_id' => $mapping->site_id ?: null,
                    'page_id' => $mapping->page_id ?: null,
                ]);
                $tree[] = [
                    'mapping' => $mapping,
                    'level' => 0,
                    'children' => $children,
                ];
            }
            $assignedMenusByRole[$roleCode] = $tree;
        }

        return view('backend.module.menu.frontend.assign', [
            'menus' => Menu::dropdown(),
            'listofmenus' => Menu::listofmenu(),
            'roles' => Menu::getRole(),
            'categories' => $categories,
            'params' => $this->menuFilter->getParam(),
            'assignedMenusByRole' => $assignedMenusByRole,
            'groupedRoles' => $groupedRoles,
            'pages' => Menu::getPageList(),
            'sites' => Menu::getSiteList(),
            'siteId' => $siteId,
            'pageId' => $pageId,
            'categoryId' => $categoryId,
            'pageTitle' => 'Assign Menu',
            'parentid' => $request->integer('parent_id', 0),
            'rolecode' => $request->input('role_code', ''),
        ]);
    }

    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('category_id', $current->category_id)
                ->where('parent_id', $current->parent_id)
                ->where('sort', $targetSort)
                ->first();

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

        return back();
    }

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

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

        return back();
    }

    public function toggleMapping($id)
    {
        $mapping = RoleMapping::findOrFail($id);
        $mapping->update(['status' => ! $mapping->status]);

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

        return back();
    }

    public function articleItem()
    {
        return response()->json(Menu::getArticleList());
    }

    public function sliderItem()
    {
        return response()->json(Menu::getImageSliderList());
    }

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

        $data['menu_status'] = $request->has('menu_status') ? (bool) $request->input('menu_status') : false;
        $data['menu_parent_id'] = $request->integer('menu_parent_id', 0);

        return $data;
    }
}