ad
This commit is contained in:
@@ -250,8 +250,10 @@ function fillSettingsForm(settings) {
|
|||||||
settingsForm.bridge_token.value = settings.bridge_token || '';
|
settingsForm.bridge_token.value = settings.bridge_token || '';
|
||||||
settingsForm.sender_token.value = settings.sender_token || '';
|
settingsForm.sender_token.value = settings.sender_token || '';
|
||||||
settingsForm.external_api_token.value = settings.external_api_token || '';
|
settingsForm.external_api_token.value = settings.external_api_token || '';
|
||||||
const tables = Array.isArray(settings.bridge_tables) ? settings.bridge_tables : [];
|
const tables = normalizeTableNames(settings.bridge_tables);
|
||||||
settingsForm.bridge_tables ? settingsForm.bridge_tables.value = tables.join(', ') : null;
|
if (settingsForm.bridge_tables) {
|
||||||
|
settingsForm.bridge_tables.value = tables.join(', ');
|
||||||
|
}
|
||||||
applyBridgePreview(tables);
|
applyBridgePreview(tables);
|
||||||
state.rotate = { bridge: false, sender: false, external: false };
|
state.rotate = { bridge: false, sender: false, external: false };
|
||||||
}
|
}
|
||||||
@@ -343,7 +345,7 @@ function parseBridgeTablesInput() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function applyBridgePreview(tables) {
|
function applyBridgePreview(tables) {
|
||||||
state.bridgeTables = Array.isArray(tables) ? tables : [];
|
state.bridgeTables = normalizeTableNames(tables);
|
||||||
if (!bridgePreview) return;
|
if (!bridgePreview) return;
|
||||||
if (!state.bridgeTables.length) {
|
if (!state.bridgeTables.length) {
|
||||||
bridgePreview.innerHTML = '<span class="text-xs text-slate-500">Keine Einschränkung – alle Tabellen erlaubt.</span>';
|
bridgePreview.innerHTML = '<span class="text-xs text-slate-500">Keine Einschränkung – alle Tabellen erlaubt.</span>';
|
||||||
@@ -366,7 +368,7 @@ async function validateBridgeSettings(ev) {
|
|||||||
try {
|
try {
|
||||||
const res = await apiAction('account.bridge.test', { method: 'POST', data });
|
const res = await apiAction('account.bridge.test', { method: 'POST', data });
|
||||||
if (!res?.ok) throw new Error(res?.error || 'Prüfung fehlgeschlagen');
|
if (!res?.ok) throw new Error(res?.error || 'Prüfung fehlgeschlagen');
|
||||||
const tables = Array.isArray(res.tables) ? res.tables : [];
|
const tables = normalizeTableNames(res.tables);
|
||||||
applyBridgePreview(tables);
|
applyBridgePreview(tables);
|
||||||
if (settingsForm.bridge_tables) {
|
if (settingsForm.bridge_tables) {
|
||||||
settingsForm.bridge_tables.value = tables.join(', ');
|
settingsForm.bridge_tables.value = tables.join(', ');
|
||||||
@@ -377,6 +379,28 @@ async function validateBridgeSettings(ev) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function normalizeTableNames(list) {
|
||||||
|
if (!Array.isArray(list)) return [];
|
||||||
|
const seen = new Set();
|
||||||
|
const result = [];
|
||||||
|
for (const entry of list) {
|
||||||
|
let name = '';
|
||||||
|
if (typeof entry === 'string') {
|
||||||
|
name = entry;
|
||||||
|
} else if (entry && typeof entry === 'object') {
|
||||||
|
name = entry.name || entry.table || entry.label || '';
|
||||||
|
}
|
||||||
|
if (typeof name === 'string') {
|
||||||
|
const trimmed = name.trim();
|
||||||
|
if (trimmed && !seen.has(trimmed)) {
|
||||||
|
seen.add(trimmed);
|
||||||
|
result.push(trimmed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
async function loadUsers() {
|
async function loadUsers() {
|
||||||
try {
|
try {
|
||||||
const res = await apiAction('account.users.list', { method: 'GET' });
|
const res = await apiAction('account.users.list', { method: 'GET' });
|
||||||
|
|||||||
@@ -2011,7 +2011,8 @@ class ApiKernel
|
|||||||
private function ensureCustomerSettingsTableExists(): void
|
private function ensureCustomerSettingsTableExists(): void
|
||||||
{
|
{
|
||||||
$table = $this->customerSettingsTable();
|
$table = $this->customerSettingsTable();
|
||||||
if ($this->tableExists($table)) return;
|
$justCreated = false;
|
||||||
|
if (!$this->tableExists($table)) {
|
||||||
try {
|
try {
|
||||||
$sql = <<<SQL
|
$sql = <<<SQL
|
||||||
CREATE TABLE IF NOT EXISTS `$table` (
|
CREATE TABLE IF NOT EXISTS `$table` (
|
||||||
@@ -2028,11 +2029,46 @@ CREATE TABLE IF NOT EXISTS `$table` (
|
|||||||
SQL;
|
SQL;
|
||||||
$this->pdo->exec($sql);
|
$this->pdo->exec($sql);
|
||||||
$this->tableExistsCache[$table] = true;
|
$this->tableExistsCache[$table] = true;
|
||||||
|
$justCreated = true;
|
||||||
} catch (Throwable $e) {
|
} catch (Throwable $e) {
|
||||||
$this->fail('Customer-Settings Tabelle fehlt und konnte nicht erstellt werden', $e->getMessage(), 500);
|
$this->fail('Customer-Settings Tabelle fehlt und konnte nicht erstellt werden', $e->getMessage(), 500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($justCreated) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->ensureCustomerSettingsColumns($table);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function ensureCustomerSettingsColumns(string $table): void
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$columns = $this->tableColumns($table);
|
||||||
|
} catch (Throwable $e) {
|
||||||
|
$this->fail('Customer-Settings Tabelle konnte nicht gelesen werden', $e->getMessage(), 500);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$missing = [];
|
||||||
|
|
||||||
|
if (!in_array('bridge_tables', $columns, true)) {
|
||||||
|
$missing[] = 'ADD COLUMN `bridge_tables` text DEFAULT NULL';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$missing) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$sql = 'ALTER TABLE `' . $table . '` ' . implode(', ', $missing);
|
||||||
|
$this->pdo->exec($sql);
|
||||||
|
} catch (Throwable $e) {
|
||||||
|
$this->fail('Customer-Settings Tabelle konnte nicht aktualisiert werden', $e->getMessage(), 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private function generateToken(int $length = 48): string
|
private function generateToken(int $length = 48): string
|
||||||
{
|
{
|
||||||
return rtrim(strtr(base64_encode(random_bytes($length)), '+/', '-_'), '=');
|
return rtrim(strtr(base64_encode(random_bytes($length)), '+/', '-_'), '=');
|
||||||
|
|||||||
Reference in New Issue
Block a user