Fix: SKRIFT_VERSAND_TOKEN in Directus-Container durchreichen + FTP-Fehler voll ausgeben
- docker-compose.yml (directus): SKRIFT_VERSAND_TOKEN: ${SKRIFT_VERSAND_TOKEN}
ergaenzt. Ohne diese Zeile landete der .env-Wert nie im Container -> die
Versand-Seite blieb 404.
- Board FTP-Upload: gesamten Fehler ausgeben (nicht gekuerzt), leere Auswahl
klar melden, 90s-Timeout gegen Haengen, console-Log. Proxy /batch-build
kuerzt den Fehler nicht mehr auf 300 Zeichen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -81,6 +81,9 @@ services:
|
|||||||
SKRIFT_BACKEND_TOKEN: ${SKRIFT_BACKEND_TOKEN}
|
SKRIFT_BACKEND_TOKEN: ${SKRIFT_BACKEND_TOKEN}
|
||||||
SKRIFT_PREVIEW_LIMIT: ${SKRIFT_PREVIEW_LIMIT:-10}
|
SKRIFT_PREVIEW_LIMIT: ${SKRIFT_PREVIEW_LIMIT:-10}
|
||||||
SKRIFT_TEAM_EMAIL: ${SKRIFT_TEAM_EMAIL:-hello@skrift.de}
|
SKRIFT_TEAM_EMAIL: ${SKRIFT_TEAM_EMAIL:-hello@skrift.de}
|
||||||
|
# Geheimer Pfad-Token der oeffentlichen Versand-Bestaetigungsseite
|
||||||
|
# (/v1/versand/<TOKEN>). Ohne Wert ist die Seite aus (404).
|
||||||
|
SKRIFT_VERSAND_TOKEN: ${SKRIFT_VERSAND_TOKEN}
|
||||||
|
|
||||||
# Shared Secret für den WordPress-Webhook (JetFormBuilder → /skrift-orders/inbound/*).
|
# Shared Secret für den WordPress-Webhook (JetFormBuilder → /skrift-orders/inbound/*).
|
||||||
# Muss identisch als ?token=... in der Webhook-URL stehen.
|
# Muss identisch als ?token=... in der Webhook-URL stehen.
|
||||||
|
|||||||
@@ -1381,10 +1381,10 @@ const handler = (router, { services, getSchema, logger }) => {
|
|||||||
});
|
});
|
||||||
const txt = await r.text();
|
const txt = await r.text();
|
||||||
let data = null; try { data = txt ? JSON.parse(txt) : null; } catch { /* egal */ }
|
let data = null; try { data = txt ? JSON.parse(txt) : null; } catch { /* egal */ }
|
||||||
if (!r.ok) return res.status(502).json({ error: 'Bündelung fehlgeschlagen.', detail: (data && data.message) || String(txt).slice(0, 300) });
|
if (!r.ok) return res.status(502).json({ error: 'Bündelung fehlgeschlagen.', detail: (data && (data.message || data.error)) || String(txt).slice(0, 2000) });
|
||||||
return res.json(data || { ok: true });
|
return res.json(data || { ok: true });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return res.status(500).json({ error: 'Backend nicht erreichbar.', detail: String(e.message || e).slice(0, 300) });
|
return res.status(500).json({ error: 'Backend nicht erreichbar.', detail: String(e.message || e).slice(0, 2000) });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -990,18 +990,29 @@ const Board = defineComponent({
|
|||||||
async function batchFtp() {
|
async function batchFtp() {
|
||||||
const ids = [...batchAuswahl.value];
|
const ids = [...batchAuswahl.value];
|
||||||
if (!ids.length || batchBusy.value) return;
|
if (!ids.length || batchBusy.value) return;
|
||||||
batchBusy.value = 'ftp'; fehler.value = '';
|
batchBusy.value = 'ftp'; fehler.value = ''; meldung.value = '';
|
||||||
try {
|
try {
|
||||||
const res = await api.post('/skrift-orders/batch-build', { ids });
|
const res = await api.post('/skrift-orders/batch-build', { ids }, { timeout: 90000 });
|
||||||
const bundles = res.data?.bundles || [];
|
const data = res?.data || {};
|
||||||
|
const bundles = Array.isArray(data.bundles) ? data.bundles : [];
|
||||||
|
try { console.log('[batch-ftp] Antwort:', JSON.stringify(data)); } catch { /* egal */ }
|
||||||
const errs = bundles.filter((b) => b.error);
|
const errs = bundles.filter((b) => b.error);
|
||||||
const total = bundles.reduce((s, b) => s + (b.count || 0), 0);
|
const total = bundles.reduce((s, b) => s + (Number(b.count) || 0), 0);
|
||||||
const files = bundles.filter((b) => b.file).map((b) => b.file).join(', ');
|
const files = bundles.filter((b) => b.file).map((b) => b.file).join(', ');
|
||||||
if (errs.length) fehler.value = `FTP: ${errs.map((e) => e.error).join('; ')}`;
|
if (errs.length) {
|
||||||
else { flash(`✓ ${total} Übermittlung(en) per FTP hochgeladen${files ? ` → ${files}.{xlsx,pdf}` : ''}.`); batchAuswahlLeeren(); }
|
// Gesamten Fehler ausgeben (nicht gekürzt).
|
||||||
|
fehler.value = 'FTP-Fehler: ' + errs.map((e) => `${e.client_id != null ? '#' + e.client_id + ' – ' : ''}${e.error}`).join(' | ');
|
||||||
|
} else if (!bundles.length || total === 0) {
|
||||||
|
fehler.value = 'Nichts hochgeladen – in der Auswahl ist keine Druck-PDF (nur PDF-Übermittlungen werden per FTP gebündelt, Text nicht).';
|
||||||
|
} else {
|
||||||
|
flash(`✓ ${total} Übermittlung(en) per FTP hochgeladen${files ? ` → ${files}.{xlsx,pdf}` : ''}.`);
|
||||||
|
batchAuswahlLeeren();
|
||||||
|
}
|
||||||
await laden();
|
await laden();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
fehler.value = e?.response?.data?.detail || e?.response?.data?.error || e?.message || 'FTP-Upload fehlgeschlagen.';
|
const d = e?.response?.data;
|
||||||
|
fehler.value = 'FTP-Upload fehlgeschlagen: ' + (d?.detail || d?.error || e?.message || String(e));
|
||||||
|
try { console.error('[batch-ftp] Fehler:', e?.response?.data || e); } catch { /* egal */ }
|
||||||
} finally { batchBusy.value = ''; }
|
} finally { batchBusy.value = ''; }
|
||||||
}
|
}
|
||||||
// Gruppen (Tag/Kunde): Aufklappen + Kopf-Auswahl.
|
// Gruppen (Tag/Kunde): Aufklappen + Kopf-Auswahl.
|
||||||
|
|||||||
Reference in New Issue
Block a user