From 16cd2a74ee4c5fbcd842614bb1f85c7cb44b72f0 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 26 Mar 2026 19:02:14 +0100 Subject: [PATCH] fix: add proper logging for SMTP and AI brief generation Logs now show: - Whether SMTP is configured and which addresses emails go to - Success/failure for each email (client brief + admin notification) - Whether OpenRouter API key is set - AI generation success/failure with status codes - Fallback to template brief when AI is unavailable Co-Authored-By: Claude Opus 4.6 (1M context) --- src/app/(frontend)/api/configure/route.ts | 30 +++++++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/app/(frontend)/api/configure/route.ts b/src/app/(frontend)/api/configure/route.ts index 2e70fbe..4c50dc5 100644 --- a/src/app/(frontend)/api/configure/route.ts +++ b/src/app/(frontend)/api/configure/route.ts @@ -78,9 +78,12 @@ Timeline: ${timeline}`; async function generateBriefWithAI(body: ConfigureRequestBody): Promise { const apiKey = process.env.OPENROUTER_API_KEY; if (!apiKey) { + console.log('[configure] OPENROUTER_API_KEY not set, using fallback brief template'); return generateFallbackBrief(body); } + console.log('[configure] Generating AI brief via OpenRouter (deepseek/deepseek-v3.2)...'); + const context = buildContext(body); const displayName = body.name.split(' ')[0] || body.name; @@ -131,10 +134,12 @@ ${context}`; }); if (!response.ok) { - console.error('OpenRouter API error:', response.status, response.statusText); + console.error(`[configure] OpenRouter API error: ${response.status} ${response.statusText}`); return generateFallbackBrief(body); } + console.log('[configure] AI brief generated successfully'); + const data = await response.json(); const content = data.choices?.[0]?.message?.content; @@ -144,9 +149,10 @@ ${context}`; return content; } catch (error) { - console.error('AI brief generation failed:', error); + console.error('[configure] AI brief generation failed:', error); return generateFallbackBrief(body); } + } // ─── Fallback Brief (no API key or API failure) ────────────────────────────── @@ -254,7 +260,12 @@ export async function POST(request: NextRequest) { const brief = await generateBriefWithAI(body); // Send emails (non-blocking — don't fail the response if email fails) - if (process.env.SMTP_HOST && process.env.SMTP_PASS) { + const smtpHost = process.env.SMTP_HOST; + const smtpPass = process.env.SMTP_PASS; + + if (smtpHost && smtpPass) { + console.log(`[configure] SMTP configured (host: ${smtpHost}), sending emails to ${body.email} and ${process.env.ADMIN_EMAIL || 'hello@letsbe.biz'}...`); + Promise.allSettled([ sendBriefToClient({ to: body.email, @@ -270,9 +281,18 @@ export async function POST(request: NextRequest) { services: body.services, email: body.email, }), - ]).catch(() => { - console.error('Email sending failed'); + ]).then((results) => { + results.forEach((result, i) => { + const target = i === 0 ? 'client brief' : 'admin notification'; + if (result.status === 'fulfilled') { + console.log(`[configure] Email sent successfully: ${target}`); + } else { + console.error(`[configure] Email failed: ${target}`, result.reason); + } + }); }); + } else { + console.log(`[configure] SMTP not configured (SMTP_HOST: ${smtpHost ? 'set' : 'missing'}, SMTP_PASS: ${smtpPass ? 'set' : 'missing'}), skipping emails`); } return NextResponse.json({ success: true, brief });