Files
deskhub/DeskHub-Webseite/api/staff/v1/email_addresses.php
T
2026-10-16 19:12:13 +00:00

109 lines
6.0 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/common.php';
api_require_method('GET', 'POST');
$staff = api_require_staff();
api_require_admin_or_permission($staff, 'manage_email_addresses');
$pdo = get_db();
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$addresses = $pdo->query(
'SELECT ea.*, d.name AS department_name, p.name AS priority_name, h.name AS topic_name
FROM email_addresses ea
JOIN departments d ON d.id = ea.department_id
LEFT JOIN priorities p ON p.id = ea.priority_id
LEFT JOIN help_topics h ON h.id = ea.help_topic_id
ORDER BY d.name, ea.email'
)->fetchAll();
$departments = departments_for_select($pdo, array_map('intval', $pdo->query('SELECT department_id FROM email_addresses')->fetchAll(PDO::FETCH_COLUMN)));
$priorities = $pdo->query('SELECT id, name FROM priorities ORDER BY sort_order')->fetchAll();
$topics = help_topic_options($pdo, false, false);
$imapByAddress = [];
foreach ($pdo->query('SELECT * FROM imap_accounts WHERE email_address_id IS NOT NULL ORDER BY id')->fetchAll() as $row) {
$imapByAddress[(int) $row['email_address_id']] ??= $row;
}
api_json([
'departments' => array_map(fn(array $d) => ['id' => (int) $d['id'], 'name' => $d['name']], $departments),
'priorities' => array_map(fn(array $p) => ['id' => (int) $p['id'], 'name' => $p['name']], $priorities),
'helpTopics' => array_map(fn(array $t) => ['id' => (int) $t['id'], 'name' => $t['path']], $topics),
'items' => array_map(function (array $a) use ($imapByAddress) {
$imap = $imapByAddress[(int) $a['id']] ?? null;
return [
'id' => (int) $a['id'],
'email' => $a['email'],
'label' => $a['label'],
'departmentId' => (int) $a['department_id'],
'departmentName' => $a['department_name'],
'priorityId' => $a['priority_id'] !== null ? (int) $a['priority_id'] : null,
'priorityName' => $a['priority_name'],
'helpTopicId' => $a['help_topic_id'] !== null ? (int) $a['help_topic_id'] : null,
'helpTopicName' => $a['topic_name'],
'isDefault' => (bool) $a['is_default'],
'isActive' => (bool) ($a['is_active'] ?? 1),
'notes' => $a['notes'] ?? null,
'updatedAt' => $a['updated_at'] ?? null,
'imapEnabled' => $imap !== null && (bool) $imap['is_active'],
'imapHost' => $imap['host'] ?? '',
'imapPort' => (int) ($imap['port'] ?? 993),
'imapEncryption' => $imap['encryption'] ?? 'ssl',
'imapUsername' => $imap['username'] ?? '',
'imapFolder' => $imap['folder'] ?? 'INBOX',
'imapAfterFetch' => $imap['after_fetch'] ?? 'seen',
'imapArchiveFolder' => $imap['archive_folder'] ?? 'Processed',
'imapSpamFolder' => $imap['spam_folder'] ?? 'Junk',
'imapHasPassword' => $imap !== null && ($imap['password_enc'] ?? '') !== '',
'imapLastRunAt' => $imap['last_run_at'] ?? null,
'smtpEnabled' => (bool) ($a['smtp_enabled'] ?? 0),
'smtpHost' => $a['smtp_host'] ?? '',
'smtpPort' => (int) ($a['smtp_port'] ?? 587),
'smtpEncryption' => $a['smtp_encryption'] ?? 'tls',
'smtpUsername' => $a['smtp_username'] ?? '',
'smtpHasPassword' => ($a['smtp_password_enc'] ?? '') !== '',
];
}, $addresses),
]);
}
$body = api_request_body();
$action = $body['action'] ?? '';
$id = (int) ($body['id'] ?? 0);
try {
if ($action === 'save') {
$b = fn(string $k, $d = null) => $body[$k] ?? $d;
$in = [
'email' => $b('email', ''), 'label' => $b('label', ''), 'department_id' => $b('departmentId', 0),
'priority_id' => $b('priorityId'), 'help_topic_id' => $b('helpTopicId'), 'is_default' => !empty($body['isDefault']),
'notes' => $b('notes', ''),
'imap_enabled' => !empty($body['imapEnabled']), 'imap_host' => $b('imapHost', ''), 'imap_port' => $b('imapPort', 993),
'imap_encryption' => $b('imapEncryption', 'ssl'), 'imap_username' => $b('imapUsername', ''), 'imap_password' => $b('imapPassword', ''),
'imap_folder' => $b('imapFolder', ''), 'imap_after_fetch' => $b('imapAfterFetch', 'seen'),
'imap_archive_folder' => $b('imapArchiveFolder', ''), 'imap_spam_folder' => $b('imapSpamFolder', ''),
'smtp_enabled' => !empty($body['smtpEnabled']), 'smtp_host' => $b('smtpHost', ''), 'smtp_port' => $b('smtpPort', 587),
'smtp_encryption' => $b('smtpEncryption', 'tls'), 'smtp_username' => $b('smtpUsername', ''), 'smtp_password' => $b('smtpPassword', ''),
];
if (array_key_exists('isActive', $body)) $in['is_active'] = !empty($body['isActive']);
$newId = email_address_save($pdo, $id, $in);
audit_log($staff['id'], ($id === 0 ? 'E-Mail-Adresse erstellt: ' : 'E-Mail-Adresse aktualisiert: ') . strtolower(trim((string) ($body['email'] ?? ''))) . ' (Mobile App)');
api_json(['id' => $newId]);
}
if ($action === 'delete') {
$deleted = email_address_delete($pdo, $id);
audit_log($staff['id'], "E-Mail-Adresse gelöscht: {$deleted} (Mobile App)");
api_json(['ok' => true]);
}
// Tests: Test-Mail an die eigene Adresse, IMAP-Verbindung, SMTP-Erreichbarkeit
if ($action === 'sendTest') api_json(['ok' => true, 'message' => email_address_send_test($pdo, $id, (string) $staff['email'])]);
if ($action === 'testImap') api_json(['ok' => true, 'message' => email_address_test_imap($pdo, $id)]);
if ($action === 'testSmtp') api_json(['ok' => true, 'message' => email_address_test_smtp($pdo, $id)]);
} catch (EmailAddressException $e) {
api_error($e->httpStatus(), $e->errorCode(), $e->getMessage());
}
api_error(422, 'INVALID_ACTION', 'Unbekannte Aktion.');