Bewerbungen zusätzlich per Discord-Webhook direkt in echte Kanäle posten

Ticketanizers Inbound-Ticket-API erzeugt bei API-Tickets nachweislich
keinen echten Discord-Kanal (nur Web-Inbox + Rollen-Ping im Log-Kanal,
auch nach manuellem Uebernehmen nicht) - das wurde heute gemeinsam mit
Dogi live in der Ticketanizer-Inbox und in Discord verifiziert. Deshalb
zusaetzlich ein normaler Discord-Webhook pro Zielkanal, der die komplette
Bewerbung garantiert sichtbar direkt postet.

Kanal-Zuordnung (von Dogi aus Discord kopiert):
  modi        -> #modi-bewerbung        (DISCORD_WEBHOOK_MODI)
  kooperation -> #kooperations-bewerbung (DISCORD_WEBHOOK_KOOPERATION)
  scout + creator -> #scout-bewerbung gemeinsam (DISCORD_WEBHOOK_SCOUT_MANAGER)

- Neu: cloudflare-worker/src/lib/discord-webhooks.js
- applications.js: postet jetzt parallel zu Ticketanizer (Promise.all,
  weiterhin ueber ctx.waitUntil im Hintergrund, blockiert nie die Antwort)
- Alle 3 Secrets bereits live gesetzt und deployed
- Getestet mit allen 4 Bewerbungstypen (modi/kooperation/scout/creator) -
  laut Log alle erfolgreich gepostet, Testdaten aus D1 wieder entfernt
- README.md: Einschraenkung von Ticketanizer dokumentiert + neue
  Webhook-Einrichtungsanleitung
This commit is contained in:
2026-08-01 14:27:08 +02:00
parent aa219922fd
commit 0d31fb8bb0
3 changed files with 170 additions and 5 deletions
+13 -5
View File
@@ -8,6 +8,7 @@ import { hasPermission } from "../lib/permissions.js";
import { logAction } from "../lib/audit.js";
import { json } from "../lib/http.js";
import { bewerbungAlsTicketAnlegen } from "../lib/ticketanizer.js";
import { bewerbungAlsDiscordNachrichtPosten } from "../lib/discord-webhooks.js";
const ALLOWED_TYPES = ["creator", "scout", "kooperation", "modi"];
@@ -46,13 +47,20 @@ export async function submitApplication(request, env, ctx) {
.bind(id, type, JSON.stringify(data), nowIso())
.run();
// Zusätzlich (rein informativ, blockiert die Bewerbung selbst nie) als
// echtes Ticket bei Ticketanizer im passenden Bereich anlegen.
const ticketVersand = bewerbungAlsTicketAnlegen(env, type, data);
// Zusätzlich (rein informativ, blockiert die Bewerbung selbst nie):
// 1) echtes Ticket bei Ticketanizer im passenden Bereich anlegen
// (Web-Inbox zum Bearbeiten/Antworten)
// 2) direkte, garantiert sichtbare Discord-Nachricht in den passenden
// Kanal posten (Ticketanizer erzeugt bei API-Tickets keinen echten
// Discord-Kanal, siehe discord-webhooks.js)
const zusatzVersand = Promise.all([
bewerbungAlsTicketAnlegen(env, type, data),
bewerbungAlsDiscordNachrichtPosten(env, type, data),
]);
if (ctx && typeof ctx.waitUntil === "function") {
ctx.waitUntil(ticketVersand);
ctx.waitUntil(zusatzVersand);
} else {
await ticketVersand.catch(() => {});
await zusatzVersand.catch(() => {});
}
return json({ ok: true });