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

<?php

namespace App\Http\Controllers\Backend;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
use Spatie\Permission\PermissionRegistrar;

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

        $roles = Role::query()
            // ->where('guard_name', 'admin') //show semua role utk backend dan frontend user
            ->with('permissions')
            ->when($search, function ($q) use ($search) {
                $q->where('name', 'like', "%{$search}%");
            })
            ->orderBy('name')
            ->paginate(10)->onEachSide(1)->withQueryString();


        return view('backend.module.role.index', [
            'roles' => $roles,
            'search' => $search,
        ]);
    }

    public function create()
    {
        $permissions = Permission::query()
            ->where('guard_name', 'admin')
            ->orderBy('name')
            ->get();

        // Provide available guards to the view for selecting guard_name
        $guards = array_keys(config('auth.guards'));

        return view('backend.module.role.create', [
            'permissions' => $permissions,
            'guards' => $guards,
        ]);
    }

    public function store(Request $request)
    {
        // Determine available guards
        $guards = array_keys(config('auth.guards'));
        $guardName = $request->input('guard_name');
        $validated = $request->validate([
            'name' => 'required|string|max:255|unique:roles,name,NULL,id,guard_name,' . $guardName,
            'guard_name' => 'required|string|in:' . implode(',', $guards),
            'permissions' => 'nullable|array',
            'permissions.*' => 'string|exists:permissions,name,guard_name,' . $guardName,
        ]);

        $role = Role::create([
            'name' => $validated['name'],
            'guard_name' => $validated['guard_name'],
        ]);

        $permissionModels = Permission::query()
            ->where('guard_name', $validated['guard_name'])
            ->whereIn('name', $validated['permissions'] ?? [])
            ->get();

        $role->syncPermissions($permissionModels);
        app(PermissionRegistrar::class)->forgetCachedPermissions();

        flash()->success('Role created successfully!');

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

    public function edit(int $id)
    {
        $role = Role::findOrFail($id);

        $permissions = Permission::query()
            ->where('guard_name', $role->guard_name)
            ->orderBy('name')
            ->get();

        $guards = array_keys(config('auth.guards'));

        return view('backend.module.role.edit', [
            'role' => $role,
            'permissions' => $permissions,
            'guards' => $guards,
        ]);
    }

    public function update(Request $request, int $id)
    {
        $role = Role::findOrFail($id);

        $guardName = $request->input('guard_name', $role->guard_name);
        $validated = $request->validate([
            'name' => 'required|string|max:255|unique:roles,name,' . $role->id . ',id,guard_name,' . $guardName,
            'guard_name' => 'required|string|in:' . implode(',', array_keys(config('auth.guards'))),
            'permissions' => 'nullable|array',
            'permissions.*' => 'string|exists:permissions,name,guard_name,' . $guardName,
        ]);

        $role->update([
            'name' => $validated['name'],
            'guard_name' => $validated['guard_name'],
        ]);

        $permissionModels = Permission::query()
            ->where('guard_name', $validated['guard_name'])
            ->whereIn('name', $validated['permissions'] ?? [])
            ->get();

        $role->syncPermissions($permissionModels);
        app(PermissionRegistrar::class)->forgetCachedPermissions();

        flash()->success('Role updated successfully!');

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

    public function destroy(int $id)
    {
        $role = Role::findOrFail($id);

        if ($role->name === 'super-admin') {
            flash()->error('Super-admin role cannot be deleted.');
            return redirect()->route('roles.index');
        }

        $role->delete();
        app(PermissionRegistrar::class)->forgetCachedPermissions();

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

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