From 5969b3643ccfa58dfab6bc58a422b422d0b94cd7 Mon Sep 17 00:00:00 2001 From: Lars Gebhardt-Kusche Date: Mon, 12 Jan 2026 00:40:33 +0100 Subject: [PATCH] adasd --- partials/landingpage/accountsetup/bridge.php | 96 ++++---------------- public/assets/js/bridge-setup-page.js | 93 +++++++------------ src/ApiKernel.php | 50 ++++++++++ 3 files changed, 105 insertions(+), 134 deletions(-) diff --git a/partials/landingpage/accountsetup/bridge.php b/partials/landingpage/accountsetup/bridge.php index 60bb4c6..737f935 100644 --- a/partials/landingpage/accountsetup/bridge.php +++ b/partials/landingpage/accountsetup/bridge.php @@ -13,11 +13,11 @@ require dirname(__DIR__) . '/../structure/layout_start.php';

Voraussetzung: Bridge-URL + Token in den Einstellungen hinterlegen.

-

Moegliche Wege zur DB-Anbindung:

+

Import-Varianten:

@@ -33,13 +33,25 @@ require dirname(__DIR__) . '/../structure/layout_start.php';

Die Auswahl bestimmt, welche Werte in die Bridge-Datei geschrieben werden.

+
+ + +

Liest die aktuelle DB-Struktur direkt von der Bridge-Datei.

+ +

Liest DB-Settings ueber die Bridge-URL und nutzt sie zum Abfragen der Tabellen/Spalten.

+
+
- -
- - Nutzt Bridge-URL/Token aus den Einstellungen. + + Nutzt die Bridge-URL/Token oder die direkten DB-Settings (je nach Auswahl).
Noch nicht gespeichert.
@@ -109,39 +86,6 @@ require dirname(__DIR__) . '/../structure/layout_start.php';
- - -

Beispiel: Mapping einer Config-Datei

-

Angenommen, deine ../config/database.php liefert folgendes Array:

-
 [
-        'connections' => [
-            'default' => [
-                'host' => '127.0.0.1',
-                'port' => 3306,
-                'database' => 'kunden_db',
-                'username' => 'dbuser',
-                'password' => 'secret',
-                'charset' => 'utf8mb4',
-            ],
-        ],
-    ],
-];
-PHP, ENT_QUOTES); ?>
-

Dann trägst du ein:

-
    -
  • Pfad zur Konfigurationsdatei: ../config/database.php
  • -
  • Basis-Pfad: database.connections.default
  • -
  • Host-/Port-/DB-/User-/Pass-/Charset-Key: jeweils host, port, database, username, password, charset
  • -
-

Die Bridge liest dann automatisch die Werte aus diesem Array und baut daraus den DSN.

-
- -
- -
updateTablesPreview(parseTablesInput())); loadBtn?.addEventListener('click', loadTablesFromBridge); - configExampleBtn?.addEventListener('click', () => { - if (configExampleDialog?.showModal) configExampleDialog.showModal(); - }); modeInputs.forEach(input => { input.addEventListener('change', () => applyModeVisibility(input.value)); }); @@ -45,7 +40,8 @@ export function initBridgeSetupPage() { function defaultSetup() { return { tables: [], - mode: 'direct', + mode: 'bridge', + import_type: 'schema', direct: { host: '', port: 3306, @@ -54,16 +50,6 @@ function defaultSetup() { password: '', charset: 'utf8mb4', }, - config: { - file: '', - base: '', - host_key: '', - port_key: '', - database_key: '', - user_key: '', - password_key: '', - charset_key: '', - }, }; } @@ -95,6 +81,13 @@ function fillForm(setup) { }); applyModeVisibility(activeMode); + if (importInputs.length) { + const importType = (data.import_type || 'schema').toLowerCase(); + importInputs.forEach(input => { + input.checked = input.value === importType; + }); + } + if (directFields) { const directMap = { direct_host: data.direct.host || '', @@ -110,29 +103,12 @@ function fillForm(setup) { }); } - if (configFields) { - const configMap = { - config_file: data.config.file || '', - config_base: data.config.base || '', - config_host_key: data.config.host_key || '', - config_port_key: data.config.port_key || '', - config_database_key: data.config.database_key || '', - config_user_key: data.config.user_key || '', - config_password_key: data.config.password_key || '', - config_charset_key: data.config.charset_key || '', - }; - Object.entries(configMap).forEach(([name, value]) => { - const input = configFields.querySelector(`[name="${name}"]`); - if (input) input.value = value; - }); - } } function applyModeVisibility(mode) { - const direct = mode === 'config' ? 'add' : 'remove'; - const config = mode === 'config' ? 'remove' : 'add'; - directFields?.classList[direct]('hidden'); - configFields?.classList[config]('hidden'); + const showDirect = mode === 'direct'; + directFields?.classList[showDirect ? 'remove' : 'add']('hidden'); + bridgeFields?.classList[showDirect ? 'add' : 'remove']('hidden'); } function parseTablesInput() { @@ -157,23 +133,17 @@ async function submitBridgeSetup(ev) { ev.preventDefault(); if (!form) return; const mode = form.querySelector('input[name="db_mode"]:checked')?.value || 'direct'; + const importType = form.querySelector('input[name="bridge_import"]:checked')?.value || 'schema'; const payload = { tables: parseTablesInput(), mode, + import_type: importType, direct_host: form.direct_host?.value.trim() || '', direct_port: Number(form.direct_port?.value || 0) || 3306, direct_database: form.direct_database?.value.trim() || '', direct_charset: form.direct_charset?.value.trim() || 'utf8mb4', direct_user: form.direct_user?.value.trim() || '', direct_password: form.direct_password?.value || '', - config_file: form.config_file?.value.trim() || '', - config_base: form.config_base?.value.trim() || '', - config_host_key: form.config_host_key?.value.trim() || '', - config_port_key: form.config_port_key?.value.trim() || '', - config_database_key: form.config_database_key?.value.trim() || '', - config_user_key: form.config_user_key?.value.trim() || '', - config_password_key: form.config_password_key?.value.trim() || '', - config_charset_key: form.config_charset_key?.value.trim() || '', }; try { @@ -193,20 +163,26 @@ async function loadTablesFromBridge(ev) { if (!loadBtn) return; loadBtn.disabled = true; try { - const res = await apiAction('account.bridge.test', { method: 'POST', data: {} }); + const mode = form?.querySelector('input[name="db_mode"]:checked')?.value || 'bridge'; + const importType = form?.querySelector('input[name="bridge_import"]:checked')?.value || 'schema'; + const payload = { + mode, + import_type: importType, + direct_host: form?.direct_host?.value.trim() || '', + direct_port: Number(form?.direct_port?.value || 0) || 3306, + direct_database: form?.direct_database?.value.trim() || '', + direct_charset: form?.direct_charset?.value.trim() || 'utf8mb4', + direct_user: form?.direct_user?.value.trim() || '', + direct_password: form?.direct_password?.value || '', + }; + const res = await apiAction('account.bridge.test', { method: 'POST', data: payload }); if (!res?.ok) throw new Error(res?.error || 'Bridge konnte nicht abgefragt werden'); const fetchedTables = normalizeTableNames(res.tables); const allowedTables = normalizeTableNames(res.setup_hint?.tables ?? fetchedTables); const merged = { ...(state.setup || {}), tables: allowedTables, - ...(res.setup_hint || {}), }; - if (res.setup_hint) { - merged.mode = res.setup_hint.mode || merged.mode; - merged.direct = { ...(merged.direct || {}), ...(res.setup_hint.direct || {}) }; - merged.config = { ...(merged.config || {}), ...(res.setup_hint.config || {}) }; - } fillForm(merged); updateStatus(`Tabellen geladen (${fetchedTables.length}).`); toast('Tabellen erfolgreich geladen', true); @@ -259,11 +235,12 @@ function normalizeSetupInput(input) { const base = defaultSetup(); if (!input || typeof input !== 'object') return base; const mode = (input.mode || base.mode).toLowerCase(); - const validMode = mode === 'config' ? 'config' : 'direct'; + const validMode = mode === 'direct' ? 'direct' : 'bridge'; + const importType = (input.import_type || base.import_type).toLowerCase(); + const validImport = importType === 'settings' ? 'settings' : 'schema'; const tables = normalizeTableNames(input.tables || base.tables); const direct = { ...base.direct, ...(input.direct || {}) }; direct.port = Number(direct.port || 3306) || 3306; direct.charset = direct.charset || 'utf8mb4'; - const config = { ...base.config, ...(input.config || {}) }; - return { tables, mode: validMode, direct, config }; + return { tables, mode: validMode, import_type: validImport, direct }; } diff --git a/src/ApiKernel.php b/src/ApiKernel.php index 5b507d2..c9caa17 100644 --- a/src/ApiKernel.php +++ b/src/ApiKernel.php @@ -2072,6 +2072,33 @@ class ApiKernel $user = $this->requireAuth(); $this->ensureRole($user, ['owner', 'admin']); $customerId = (int)($user['customer_id'] ?? 0); + $setup = $this->getBridgeSetupData($customerId); + $mode = strtolower((string)($this->in['mode'] ?? $this->in['db_mode'] ?? ($setup['mode'] ?? 'bridge'))); + $importType = strtolower((string)($this->in['import_type'] ?? $this->in['bridge_import'] ?? ($setup['import_type'] ?? 'schema'))); + $tablesAllow = $this->normalizeBridgeTables($this->in['tables'] ?? ($setup['tables'] ?? [])); + + if ($mode === 'direct') { + $direct = [ + 'host' => trim((string)($this->in['direct_host'] ?? ($setup['direct']['host'] ?? ''))), + 'port' => (int)($this->in['direct_port'] ?? ($setup['direct']['port'] ?? 3306)), + 'database' => trim((string)($this->in['direct_database'] ?? ($setup['direct']['database'] ?? ''))), + 'user' => trim((string)($this->in['direct_user'] ?? ($setup['direct']['user'] ?? ''))), + 'password' => (string)($this->in['direct_password'] ?? ($setup['direct']['password'] ?? '')), + 'charset' => trim((string)($this->in['direct_charset'] ?? ($setup['direct']['charset'] ?? 'utf8mb4'))) ?: 'utf8mb4', + ]; + try { + $schema = $this->fetchSchemaFromDirect($direct, $tablesAllow); + } catch (Throwable $e) { + $this->fail('DB request failed', $e->getMessage(), 502); + return; + } + $this->respond([ + 'ok' => true, + 'tables' => $schema['tables'] ?? [], + 'fetched' => $schema['fetched'] ?? date(DATE_ATOM), + ]); + } + $bridgeUrl = trim((string)($this->in['bridge_url'] ?? '')); $bridgeToken = trim((string)($this->in['bridge_token'] ?? '')); if ($bridgeUrl === '' || $bridgeToken === '') { @@ -2088,6 +2115,29 @@ class ApiKernel $this->fail('Bridge request failed', $e->getMessage(), 502); return; } + + if ($importType === 'settings') { + $hint = is_array($schema['setup_hint'] ?? null) ? $schema['setup_hint'] : []; + $directHint = is_array($hint['direct'] ?? null) ? $hint['direct'] : []; + $direct = [ + 'host' => trim((string)($directHint['host'] ?? '')), + 'port' => (int)($directHint['port'] ?? 3306), + 'database' => trim((string)($directHint['database'] ?? '')), + 'user' => trim((string)($directHint['user'] ?? '')), + 'password' => (string)($directHint['password'] ?? ''), + 'charset' => trim((string)($directHint['charset'] ?? 'utf8mb4')) ?: 'utf8mb4', + ]; + if ($direct['host'] === '' || $direct['database'] === '' || $direct['user'] === '') { + $this->fail('Bridge lieferte keine DB-Settings', null, 422); + } + try { + $schema = $this->fetchSchemaFromDirect($direct, $tablesAllow); + } catch (Throwable $e) { + $this->fail('DB request failed', $e->getMessage(), 502); + return; + } + } + $this->respond([ 'ok' => true, 'tables' => $schema['tables'] ?? [],