'handleActivate', 'deactivate' => 'handleDeactivate', 'delete' => 'handleDelete', 'send-access' => 'handleSendAccess', ]; if (!isset($handlers[$action])) { Router::json(['ok' => false, 'error' => 'invalid_action']); } if ($action === 'delete') { Guard::requirePermissionOrForbidden(PermissionService::USERS_DELETE); } if ($action === 'send-access') { Guard::requirePermissionOrForbidden(PermissionService::USERS_UPDATE); } $raw = $_POST['uuids'] ?? ''; $uuids = []; if (is_array($raw)) { $uuids = $raw; } elseif (is_string($raw)) { $uuids = array_filter(array_map('trim', explode(',', $raw))); } $uuids = array_values(array_unique(array_filter($uuids))); if (!$uuids) { Router::json(['ok' => false, 'error' => 'no_selection']); } $currentUserId = (int) ($_SESSION['user']['id'] ?? 0); call_user_func($handlers[$action], $uuids, $currentUserId); function handleActivate(array $uuids, int $currentUserId): void { $result = UserService::setActiveByUuids($uuids, true, $currentUserId); if (!($result['ok'] ?? false)) { Router::json(['ok' => false, 'error' => 'update_failed']); } Router::json(['ok' => true, 'count' => (int) ($result['count'] ?? 0)]); } function handleDeactivate(array $uuids, int $currentUserId): void { if ($currentUserId > 0) { $currentUser = UserService::findById($currentUserId); $currentUuid = $currentUser['uuid'] ?? ''; if ($currentUuid !== '') { $uuids = array_values(array_filter($uuids, static fn ($uuid) => $uuid !== $currentUuid)); } if (!$uuids) { Router::json(['ok' => false, 'error' => 'self_deactivate']); } } $result = UserService::setActiveByUuids($uuids, false, $currentUserId); if (!($result['ok'] ?? false)) { Router::json(['ok' => false, 'error' => 'update_failed']); } Router::json(['ok' => true, 'count' => (int) ($result['count'] ?? 0)]); } function handleDelete(array $uuids, int $currentUserId): void { $result = UserService::deleteByUuids($uuids, $currentUserId); if (!($result['ok'] ?? false)) { Router::json(['ok' => false, 'error' => $result['error'] ?? 'delete_failed']); } Router::json(['ok' => true, 'count' => (int) ($result['count'] ?? 0)]); } function handleSendAccess(array $uuids, int $currentUserId): void { $successCount = 0; $failedCount = 0; foreach ($uuids as $uuid) { $user = UserService::findByUuid($uuid); if (!$user || empty($user['email'])) { $failedCount++; continue; } $locale = $user['locale'] ?? (I18n::$locale ?? I18n::$defaultLocale); $name = trim(($user['first_name'] ?? '') . ' ' . ($user['last_name'] ?? '')); $isGerman = strpos((string) $locale, 'de') === 0; $greeting = $isGerman ? 'Hallo' : 'Hello'; if ($name !== '') { $greeting .= ' ' . $name; } $greeting .= ','; $loginUrl = appUrl(Request::withLocale('login', $locale)); $resetUrl = appUrl(Request::withLocale('password/forgot', $locale)); $previousLocale = I18n::$locale ?? null; I18n::$locale = $locale; $subject = t('Your access details'); I18n::$locale = $previousLocale; $vars = [ 'app_name' => appTitle(), 'app_logo_url' => appLogoUrlAbsolute(128), 'imprint_url' => appUrl(Request::withLocale('imprint', $locale)), 'privacy_url' => appUrl(Request::withLocale('privacy', $locale)), 'greeting' => $greeting, 'username' => (string) ($user['email'] ?? ''), 'login_url' => $loginUrl, 'reset_url' => $resetUrl, ]; $result = MailService::sendTemplate('access_info', $vars, (string) $user['email'], $subject, $locale); if ($result['ok'] ?? false) { $successCount++; } else { $failedCount++; } } Router::json([ 'ok' => $successCount > 0, 'count' => $successCount, 'failed' => $failedCount, ]); }