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:
s4luorth
2026-09-28 10:39:43 +02:00
parent 1f98aa4196
commit 870295e012
3 changed files with 23 additions and 9 deletions

View File

@@ -81,6 +81,9 @@ services:
SKRIFT_BACKEND_TOKEN: ${SKRIFT_BACKEND_TOKEN}
SKRIFT_PREVIEW_LIMIT: ${SKRIFT_PREVIEW_LIMIT:-10}
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/*).
# Muss identisch als ?token=... in der Webhook-URL stehen.

View File

@@ -1381,10 +1381,10 @@ const handler = (router, { services, getSchema, logger }) => {
});
const txt = await r.text();
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 });
} 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) });
}
});

View File

@@ -990,18 +990,29 @@ const Board = defineComponent({
async function batchFtp() {
const ids = [...batchAuswahl.value];
if (!ids.length || batchBusy.value) return;
batchBusy.value = 'ftp'; fehler.value = '';
batchBusy.value = 'ftp'; fehler.value = ''; meldung.value = '';
try {
const res = await api.post('/skrift-orders/batch-build', { ids });
const bundles = res.data?.bundles || [];
const res = await api.post('/skrift-orders/batch-build', { ids }, { timeout: 90000 });
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 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(', ');
if (errs.length) fehler.value = `FTP: ${errs.map((e) => e.error).join('; ')}`;
else { flash(`✓ ${total} Übermittlung(en) per FTP hochgeladen${files ? ` → ${files}.{xlsx,pdf}` : ''}.`); batchAuswahlLeeren(); }
if (errs.length) {
// 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();
} 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 = ''; }
}
// Gruppen (Tag/Kunde): Aufklappen + Kopf-Auswahl.