/* |-------------------------------------------------------------------------- | Agência PSI — Edge Function: send-welcome-email (Freemium F2) |-------------------------------------------------------------------------- | E-mail de boas-vindas ao DONO de um tenant recém-provisionado. Best-effort: | nunca quebra o login/onboarding — se o SMTP falhar, só loga. | | • Destinatário derivado do JWT (não do body) — segurança. | • Usa um SMTP GLOBAL/de sistema (env), não o canal do tenant (um tenant | novo ainda não configurou notification_channels). Defaults = Mailpit local. |-------------------------------------------------------------------------- */ import { createClient } from 'https://esm.sh/@supabase/supabase-js@2' import { SmtpClient } from 'https://deno.land/x/smtp@v0.7.0/mod.ts' const corsHeaders = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type', 'Access-Control-Allow-Methods': 'POST, OPTIONS', } function json(body: unknown, status = 200) { return new Response(JSON.stringify(body), { status, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, }) } function welcomeHtml(name: string, tenantName: string, loginUrl: string): string { const ola = name ? `Olá, ${name}!` : 'Olá!' return `

${ola}

Seu ambiente ${tenantName} está pronto. Sua conta gratuita já foi ativada — é só entrar e começar.

Acessar meu ambiente →

No plano gratuito você já tem o essencial. Quando precisar de mais, é só clicar em Upgrade PRO dentro do sistema.

Agência PSI — gestão clínica sem ruído.

` } Deno.serve(async (req: Request) => { if (req.method === 'OPTIONS') return new Response('ok', { headers: corsHeaders }) if (req.method !== 'POST') return json({ ok: false, error: 'method_not_allowed' }, 405) try { const authHeader = req.headers.get('Authorization') || '' const supabaseUrl = Deno.env.get('SUPABASE_URL')! // cliente no contexto do usuário (resolve o JWT → destinatário) const userClient = createClient(supabaseUrl, Deno.env.get('SUPABASE_ANON_KEY')!, { global: { headers: { Authorization: authHeader } }, }) const { data: userData } = await userClient.auth.getUser() const user = userData?.user if (!user?.id || !user?.email) { return json({ ok: false, error: 'no_session' }, 401) } const meta = (user.user_metadata || {}) as Record // nome do tenant: metadata OU consulta via admin const admin = createClient(supabaseUrl, Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!) let tenantName = String(meta.tenant_name || '').trim() let ownerName = String(meta.display_name || '').trim() if (!tenantName || !ownerName) { const { data: member } = await admin .from('tenant_members') .select('tenant_id') .eq('user_id', user.id) .eq('status', 'active') .order('created_at', { ascending: true }) .limit(1) .maybeSingle() if (member?.tenant_id) { const { data: t } = await admin.from('tenants').select('name').eq('id', member.tenant_id).maybeSingle() if (!tenantName) tenantName = t?.name || 'seu ambiente' } if (!ownerName) { const { data: pr } = await admin.from('profiles').select('full_name').eq('id', user.id).maybeSingle() ownerName = pr?.full_name || '' } } tenantName = tenantName || 'seu ambiente' // SMTP global de sistema (env) — defaults = Mailpit local const host = Deno.env.get('SMTP_HOST') || 'mailpit' const port = parseInt(Deno.env.get('SMTP_PORT') || '1025', 10) const username = Deno.env.get('SMTP_USER') || 'test' const password = Deno.env.get('SMTP_PASS') || 'test' const fromEmail = Deno.env.get('SMTP_FROM') || 'no-reply@agenciapsi.local' const fromName = Deno.env.get('SMTP_FROM_NAME') || 'Agência PSI' const appUrl = (Deno.env.get('APP_URL') || 'http://localhost:5173').replace(/\/+$/, '') const loginUrl = `${appUrl}/auth/login` const subject = `Bem-vindo(a) — ${tenantName} está pronto` const html = welcomeHtml(ownerName, tenantName, loginUrl) const text = `${ownerName ? 'Olá, ' + ownerName + '!' : 'Olá!'}\n\nSeu ambiente ${tenantName} está pronto. Acesse: ${loginUrl}\n\nAgência PSI` try { const client = new SmtpClient() const connectConfig = { hostname: host, port, username, password } if (port === 465) await client.connectTLS(connectConfig) else await client.connect(connectConfig) await client.send({ from: `${fromName} <${fromEmail}>`, to: user.email, subject, content: text, html, }) await client.close() } catch (smtpErr) { // best-effort: não quebra o onboarding console.error('[send-welcome-email] SMTP falhou (ignorado):', smtpErr) return json({ ok: false, error: 'smtp_failed' }) } return json({ ok: true }) } catch (err) { console.error('[send-welcome-email] fatal:', err) return json({ ok: false, error: 'internal' }, 500) } })