query( 'SELECT h.*, d.name AS department_name, p.name AS priority_name, p.color AS priority_color FROM help_topics h JOIN departments d ON d.id = h.department_id JOIN priorities p ON p.id = h.priority_id ORDER BY h.sort_order, h.name' )->fetchAll(); $departments = departments_for_select($pdo, array_map('intval', $pdo->query('SELECT department_id FROM help_topics')->fetchAll(PDO::FETCH_COLUMN))); $priorities = $pdo->query('SELECT id, name FROM priorities ORDER BY sort_order')->fetchAll(); $names = array_column($topics, 'name', 'id'); $parents = array_column($topics, 'parent_id', 'id'); $pathOf = function (int $id) use ($names, $parents): string { $parts = []; $seen = []; while ($id && isset($names[$id]) && !isset($seen[$id])) { $seen[$id] = true; array_unshift($parts, $names[$id]); $id = (int) ($parents[$id] ?? 0); } return implode(' / ', $parts); }; 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), 'slaPlans' => array_map(fn(array $p) => ['id' => (int) $p['id'], 'name' => $p['name']], $pdo->query('SELECT id, name FROM sla_plans WHERE is_active = 1 ORDER BY name')->fetchAll()), 'items' => array_map(fn(array $t) => [ 'id' => (int) $t['id'], 'name' => $t['name'], 'departmentId' => (int) $t['department_id'], 'departmentName' => $t['department_name'], 'priorityId' => (int) $t['priority_id'], 'priorityName' => $t['priority_name'], 'priorityColor' => $t['priority_color'], 'isActive' => (bool) $t['is_active'], 'isPublic' => (bool) ($t['is_public'] ?? 1), 'slaPlanId' => !empty($t['sla_plan_id']) ? (int) $t['sla_plan_id'] : null, 'parentId' => !empty($t['parent_id']) ? (int) $t['parent_id'] : null, 'path' => $pathOf((int) $t['id']), 'notes' => $t['notes'] ?? null, 'sortOrder' => (int) $t['sort_order'], 'createdAt' => $t['created_at'] ?? null, 'updatedAt' => $t['updated_at'] ?? null, ], $topics), ]); } $body = api_request_body(); $action = $body['action'] ?? ''; $id = (int) ($body['id'] ?? 0); try { if ($action === 'save') { $in = [ 'name' => $body['name'] ?? '', 'department_id' => $body['departmentId'] ?? 0, 'priority_id' => $body['priorityId'] ?? 0, 'sort_order' => $body['sortOrder'] ?? 0, ]; // Fehlende Schlüssel (ältere App-Version) lassen den bisherigen Wert unverändert foreach (['isActive' => 'is_active', 'isPublic' => 'is_public', 'parentId' => 'parent_id', 'slaPlanId' => 'sla_plan_id', 'notes' => 'notes'] as $camel => $snake) { if (array_key_exists($camel, $body)) $in[$snake] = $body[$camel]; } $newId = help_topic_save($pdo, $id, $in); audit_log($staff['id'], ($id === 0 ? 'Hilfethema erstellt: ' : 'Hilfethema aktualisiert: ') . trim((string) ($body['name'] ?? '')) . ' (Mobile App)'); api_json(['id' => $newId]); } if ($action === 'delete') { $deleted = help_topic_delete($pdo, $id); audit_log($staff['id'], "Hilfethema gelöscht: {$deleted} (Mobile App)"); api_json(['ok' => true]); } } catch (AdminModelException $e) { api_error($e->httpStatus(), $e->errorCode(), $e->getMessage()); } api_error(422, 'INVALID_ACTION', 'Unbekannte Aktion.');