Steuerkram/src/Controllers/UserAdminController.php

144 lines
4.4 KiB
PHP

<?php
declare(strict_types=1);
namespace Steuerkram\Controllers;
use Steuerkram\Models\User;
use Steuerkram\View;
class UserAdminController extends BaseController
{
public function index(array $params): void
{
$users = User::all();
$view = new View();
$view->render('layout/base.php', [
'pageTitle' => 'Benutzerverwaltung',
'content' => $this->renderView('useradmin/list', [
'users' => $users,
'errors' => [],
]),
]);
}
public function store(array $params): void
{
$username = trim($_POST['username'] ?? '');
$password = $_POST['password'] ?? '';
$errors = [];
if ($username === '') {
$errors['username'] = 'Pflichtfeld';
} elseif (strlen($username) > 64) {
$errors['username'] = 'Maximal 64 Zeichen';
} elseif (User::findByUsername($username)) {
$errors['username'] = 'Benutzername bereits vergeben';
}
if (strlen($password) < 8) {
$errors['password'] = 'Mindestens 8 Zeichen erforderlich';
}
if ($errors) {
$view = new View();
$view->render('layout/base.php', [
'pageTitle' => 'Benutzerverwaltung',
'content' => $this->renderView('useradmin/list', [
'users' => User::all(),
'errors' => $errors,
'formData' => ['username' => $username],
]),
]);
return;
}
User::create($username, $password);
View::redirect('/useradmin', 'Benutzer angelegt.');
}
public function update(array $params): void
{
$id = (int)($params['id'] ?? 0);
$username = trim($_POST['username'] ?? '');
$password = $_POST['password'] ?? '';
$errors = [];
if (!User::find($id)) {
View::redirect('/useradmin', 'Benutzer nicht gefunden.', 'error');
return;
}
if ($username === '') {
$errors['username'] = 'Pflichtfeld';
} elseif (strlen($username) > 64) {
$errors['username'] = 'Maximal 64 Zeichen';
} else {
$existing = User::findByUsername($username);
if ($existing && (int)$existing['id'] !== $id) {
$errors['username'] = 'Benutzername bereits vergeben';
}
}
if ($password !== '' && strlen($password) < 8) {
$errors['password'] = 'Mindestens 8 Zeichen erforderlich';
}
if ($errors) {
$view = new View();
$view->render('layout/base.php', [
'pageTitle' => 'Benutzerverwaltung',
'content' => $this->renderView('useradmin/list', [
'users' => User::all(),
'errors' => $errors,
'formData' => ['username' => $username, 'edit_id' => $id],
]),
]);
return;
}
User::update($id, $username, $password);
View::redirect('/useradmin', 'Benutzer gespeichert.');
}
public function delete(array $params): void
{
$id = (int)($params['id'] ?? 0);
// Letzten aktiven Benutzer nicht löschen
if (User::count() <= 1) {
View::redirect('/useradmin', 'Der letzte Benutzer kann nicht gelöscht werden.', 'error');
return;
}
User::delete($id);
View::redirect('/useradmin', 'Benutzer gelöscht.');
}
public function toggleActive(array $params): void
{
$id = (int)($params['id'] ?? 0);
$user = User::find($id);
if (!$user) {
View::redirect('/useradmin', 'Benutzer nicht gefunden.', 'error');
return;
}
$newState = !(bool)$user['active'];
// Letzten aktiven Benutzer nicht deaktivieren
if (!$newState) {
$activeCount = count(array_filter(User::all(), fn($u) => $u['active']));
if ($activeCount <= 1) {
View::redirect('/useradmin', 'Der letzte aktive Benutzer kann nicht deaktiviert werden.', 'error');
return;
}
}
User::setActive($id, $newState);
$msg = $newState ? 'Benutzer aktiviert.' : 'Benutzer deaktiviert.';
View::redirect('/useradmin', $msg);
}
}