diff --git a/admin-compliance/app/api/sdk/v1/agent/notify/route.ts b/admin-compliance/app/api/sdk/v1/agent/notify/route.ts new file mode 100644 index 0000000..896f517 --- /dev/null +++ b/admin-compliance/app/api/sdk/v1/agent/notify/route.ts @@ -0,0 +1,30 @@ +/** + * Agent Notify API Proxy + * POST /api/sdk/v1/agent/notify → backend-compliance /api/compliance/agent/notify + */ + +import { NextRequest, NextResponse } from 'next/server' + +const BACKEND_URL = process.env.BACKEND_API_URL || 'http://backend-compliance:8002' + +export async function POST(request: NextRequest) { + try { + const body = await request.text() + const response = await fetch(`${BACKEND_URL}/api/compliance/agent/notify`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body, + signal: AbortSignal.timeout(15000), + }) + + if (!response.ok) { + const errorText = await response.text() + return NextResponse.json({ error: errorText }, { status: response.status }) + } + + return NextResponse.json(await response.json()) + } catch (error) { + console.error('Agent notify proxy error:', error) + return NextResponse.json({ error: 'Email-Versand fehlgeschlagen' }, { status: 503 }) + } +} diff --git a/admin-compliance/components/sdk/ComplianceAdvisorWidget.tsx b/admin-compliance/components/sdk/ComplianceAdvisorWidget.tsx index b2057c2..22b6208 100644 --- a/admin-compliance/components/sdk/ComplianceAdvisorWidget.tsx +++ b/admin-compliance/components/sdk/ComplianceAdvisorWidget.tsx @@ -141,6 +141,54 @@ export function ComplianceAdvisorWidget({ currentStep = 'default' }: ComplianceA setIsTyping(false) }, []) + const [emailSending, setEmailSending] = useState(false) + const [emailSent, setEmailSent] = useState(false) + + const handleSendAsEmail = useCallback(async () => { + if (messages.length === 0 || emailSending) return + setEmailSending(true) + try { + // Build HTML from chat messages + const qaPairs = messages.reduce<{ q: string; a: string }[]>((acc, m, i) => { + if (m.role === 'user') { + const next = messages[i + 1] + acc.push({ q: m.content, a: next?.role === 'agent' ? next.content : '(keine Antwort)' }) + } + return acc + }, []) + + const qaHtml = qaPairs.map(({ q, a }) => + `
Frage: ${q}
${a}
Datum: ${new Date().toLocaleString('de-DE')} | Land: ${selectedCountry} | Kontext: ${currentStep}
+Automatisch erstellt vom BreakPilot Compliance Advisor (Qwen)
+ ` + + await fetch('/api/sdk/v1/agent/notify', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + recipient: 'dsb@breakpilot.local', + subject: `Compliance Advisor — ${qaPairs.length} Fragen (${currentStep})`, + body_html: bodyHtml, + role: 'Datenschutzbeauftragter', + }), + }) + setEmailSent(true) + setTimeout(() => setEmailSent(false), 3000) + } catch (e) { + console.error('Email send failed:', e) + } finally { + setEmailSending(false) + } + }, [messages, emailSending, selectedCountry, currentStep]) + const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault() @@ -188,6 +236,31 @@ export function ComplianceAdvisorWidget({ currentStep = 'default' }: ComplianceA