110 lines
3.0 KiB
PHP
110 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\User;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Validation\Rule;
|
|
use Spatie\Permission\Models\Role;
|
|
|
|
class AdminRoleController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
$roles = Role::withCount('users')->orderBy('name')->paginate(15);
|
|
|
|
return view('admin.roles.index', [
|
|
'roles' => $roles,
|
|
]);
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
return view('admin.roles.create');
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$validated = $request->validate([
|
|
'name' => ['required', 'string', 'max:255', Rule::unique('roles', 'name')],
|
|
'description' => ['nullable', 'string', 'max:255'],
|
|
]);
|
|
|
|
Role::create([
|
|
'name' => $validated['name'],
|
|
'guard_name' => 'web',
|
|
'description' => $validated['description'] ?? null,
|
|
]);
|
|
|
|
return redirect()->route('admin.roles.index')->with('status', __('Role created.'));
|
|
}
|
|
|
|
public function show(Role $role, Request $request)
|
|
{
|
|
$search = $request->string('search')->toString();
|
|
|
|
$usersQuery = $role->users()->orderBy('name');
|
|
|
|
if ($search) {
|
|
$usersQuery->where(function ($q) use ($search) {
|
|
$q->where('name', 'like', "%{$search}%")
|
|
->orWhere('email', 'like', "%{$search}%");
|
|
});
|
|
}
|
|
|
|
$users = $usersQuery->paginate(15)->withQueryString();
|
|
|
|
$availableUsers = User::orderBy('name')->select('id', 'name', 'email')->get();
|
|
|
|
return view('admin.roles.show', [
|
|
'role' => $role,
|
|
'users' => $users,
|
|
'availableUsers' => $availableUsers,
|
|
'search' => $search,
|
|
]);
|
|
}
|
|
|
|
public function edit(Role $role)
|
|
{
|
|
return view('admin.roles.edit', [
|
|
'role' => $role,
|
|
]);
|
|
}
|
|
|
|
public function update(Request $request, Role $role)
|
|
{
|
|
$validated = $request->validate([
|
|
'name' => ['required', 'string', 'max:255', Rule::unique('roles', 'name')->ignore($role->id)],
|
|
'description' => ['nullable', 'string', 'max:255'],
|
|
]);
|
|
|
|
$role->update($validated);
|
|
|
|
return redirect()->route('admin.roles.show', $role)->with('status', __('Role updated.'));
|
|
}
|
|
|
|
public function assignUsers(Request $request, Role $role)
|
|
{
|
|
$validated = $request->validate([
|
|
'user_ids' => ['required', 'array'],
|
|
'user_ids.*' => ['exists:users,id'],
|
|
]);
|
|
|
|
$users = User::whereIn('id', $validated['user_ids'])->get();
|
|
|
|
foreach ($users as $user) {
|
|
$user->assignRole($role);
|
|
}
|
|
|
|
return redirect()->route('admin.roles.show', $role)->with('status', __('Users assigned to role.'));
|
|
}
|
|
|
|
public function removeUser(Role $role, User $user)
|
|
{
|
|
$user->removeRole($role);
|
|
|
|
return redirect()->route('admin.roles.show', $role)->with('status', __('Role removed from user.'));
|
|
}
|
|
}
|
|
|