107 lines
3.1 KiB
PHP
107 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Web;
|
|
|
|
use App\Enums\UserRole;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\User;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Illuminate\Validation\Rule;
|
|
use Illuminate\Validation\Rules\Password;
|
|
use Illuminate\View\View;
|
|
|
|
class UserController extends Controller
|
|
{
|
|
public function index(): View
|
|
{
|
|
$this->authorize('viewAny', User::class);
|
|
|
|
$users = User::query()->withCount('vms')->orderBy('name')->paginate(20);
|
|
|
|
return view('users.index', compact('users'));
|
|
}
|
|
|
|
public function create(): View
|
|
{
|
|
$this->authorize('create', User::class);
|
|
|
|
return view('users.create', ['roles' => UserRole::cases()]);
|
|
}
|
|
|
|
public function store(Request $request): RedirectResponse
|
|
{
|
|
$this->authorize('create', User::class);
|
|
|
|
$data = $request->validate([
|
|
'name' => ['required', 'string', 'max:100'],
|
|
'email' => ['required', 'email', 'max:255', 'unique:users,email'],
|
|
'password' => ['required', 'confirmed', Password::defaults()],
|
|
'role' => ['required', Rule::enum(UserRole::class)],
|
|
'is_active' => ['boolean'],
|
|
]);
|
|
|
|
User::query()->create([
|
|
'name' => $data['name'],
|
|
'email' => $data['email'],
|
|
'password' => Hash::make($data['password']),
|
|
'role' => $data['role'],
|
|
'is_active' => $request->boolean('is_active', true),
|
|
]);
|
|
|
|
return redirect()->route('users.index')->with('success', 'Benutzer erstellt.');
|
|
}
|
|
|
|
public function edit(User $user): View
|
|
{
|
|
$this->authorize('update', $user);
|
|
|
|
return view('users.edit', [
|
|
'user' => $user,
|
|
'roles' => UserRole::cases(),
|
|
]);
|
|
}
|
|
|
|
public function update(Request $request, User $user): RedirectResponse
|
|
{
|
|
$this->authorize('update', $user);
|
|
|
|
$data = $request->validate([
|
|
'name' => ['required', 'string', 'max:100'],
|
|
'email' => ['required', 'email', 'max:255', Rule::unique('users')->ignore($user->id)],
|
|
'password' => ['nullable', 'confirmed', Password::defaults()],
|
|
'role' => ['required', Rule::enum(UserRole::class)],
|
|
'is_active' => ['boolean'],
|
|
]);
|
|
|
|
$user->fill([
|
|
'name' => $data['name'],
|
|
'email' => $data['email'],
|
|
'role' => $data['role'],
|
|
'is_active' => $request->boolean('is_active'),
|
|
]);
|
|
|
|
if (! empty($data['password'])) {
|
|
$user->password = Hash::make($data['password']);
|
|
}
|
|
|
|
$user->save();
|
|
|
|
return redirect()->route('users.index')->with('success', 'Benutzer aktualisiert.');
|
|
}
|
|
|
|
public function destroy(User $user): RedirectResponse
|
|
{
|
|
$this->authorize('delete', $user);
|
|
|
|
if ($user->vms()->whereIn('status', ['pending', 'active'])->exists()) {
|
|
return back()->withErrors(['user' => 'Benutzer hat noch aktive VMs.']);
|
|
}
|
|
|
|
$user->delete();
|
|
|
|
return redirect()->route('users.index')->with('success', 'Benutzer gelöscht.');
|
|
}
|
|
}
|