feat(discord): Kunden-Kontoverknüpfung per Discord-OAuth

Erster Teil des größeren Discord-Ausbaus (Konto verknüpfen, Tickets
über Discord sehen/beantworten). Dieser Schritt: Kunden können unter
"Mein Konto" ihr Discord-Konto per OAuth verknüpfen/trennen.

- Migration 027: discord_settings um client_id/client_secret_enc/
  ticket_channel_id erweitert; users um discord_user_id/
  discord_username (unique); discord_oauth_states (kurzlebiger
  CSRF-Schutz für den Redirect-Flow, 10 Min. gültig); neue Tabelle
  ticket_discord_threads für den nächsten Schritt (Ticket-Threads).
- Neue Routen: GET/POST /discord/link, /discord/unlink,
  GET /discord/oauth/start (leitet zu Discord weiter),
  GET /discord/oauth/callback (tauscht Code gegen Discord-Nutzer-ID,
  verknüpft das Konto, verhindert doppelte Verknüpfung).
- Einstellungen > Discord: neue Felder für Client ID/Secret, Anzeige
  der einzutragenden Redirect-URI, aktualisierte Anleitung inkl.
  OAuth-Einrichtung und Hinweis auf die Message Content Intent (für
  den nächsten Schritt: Ticket-Threads).

Noch offen (nächster Schritt): Ticket-Threads je Ticket, bidirektionale
Synchronisierung der Nachrichten.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Kundencenter 2026-09-28 23:41:04 +02:00
parent c8da9362a7
commit fcbd34b0c6
4 changed files with 153 additions and 33 deletions

View file

@ -0,0 +1,23 @@
-- Discord-OAuth: Kunden verknüpfen ihr Discord-Konto mit ihrem Kundencenter-Konto (für Ticket-Kanäle je Ticket).
ALTER TABLE discord_settings
ADD COLUMN client_id VARCHAR(32) NULL,
ADD COLUMN client_secret_enc TEXT NULL,
ADD COLUMN ticket_channel_id VARCHAR(32) NULL;
ALTER TABLE users
ADD COLUMN discord_user_id VARCHAR(32) NULL UNIQUE,
ADD COLUMN discord_username VARCHAR(100) NULL;
-- Kurzlebiger Zustand für den OAuth-Redirect (CSRF-Schutz), wird beim erfolgreichen Callback gelöscht.
CREATE TABLE discord_oauth_states (
state CHAR(43) PRIMARY KEY,
user_id CHAR(36) NOT NULL REFERENCES users(id),
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Ticket <-> Discord-Thread-Zuordnung.
CREATE TABLE ticket_discord_threads (
ticket_id CHAR(36) PRIMARY KEY REFERENCES tickets(id),
thread_id VARCHAR(32) NOT NULL UNIQUE,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;