UNPKG

@coursebuilder/core

Version:

Core package for Course Builder

158 lines (156 loc) 6.05 kB
import { __name } from "./chunk-VLQXSCFN.js"; // src/lib/send-verification-request.ts import { render } from "@react-email/components"; import { NewMemberEmail } from "@coursebuilder/email-templates/emails/new-member"; import { PostPurchaseLoginEmail } from "@coursebuilder/email-templates/emails/post-purchase-login"; var sendVerificationRequest = /* @__PURE__ */ __name(async (params, adapter) => { const { identifier: email, name, url, provider, theme, expires, merchantChargeId, type = "login" } = params; const { host } = new URL(url); console.log(`[sendVerificationRequest] Initiated. Type: ${type}, Email: ${email}, Host: ${host}${merchantChargeId ? `, MerchantChargeId: ${merchantChargeId}` : ""}`); let text = params.text || defaultText; let html = params.html || defaultHtml; const { server, from } = provider.options ? provider.options : provider; const { getUserByEmail, findOrCreateUser } = adapter; let subject; switch (type) { case "purchase": subject = `Thank you for Purchasing ${process.env.NEXT_PUBLIC_PRODUCT_NAME || process.env.NEXT_PUBLIC_SITE_TITLE} (${host})`; break; case "transfer": subject = `Accept Your Seat for ${process.env.NEXT_PUBLIC_PRODUCT_NAME || process.env.NEXT_PUBLIC_SITE_TITLE} (${host})`; break; case "signup": subject = `Welcome to ${process.env.NEXT_PUBLIC_PRODUCT_NAME || process.env.NEXT_PUBLIC_SITE_TITLE} (${host})`; html = signUpHtml; text = signUpText; break; default: subject = `Log in to ${process.env.NEXT_PUBLIC_PRODUCT_NAME || process.env.NEXT_PUBLIC_SITE_TITLE} (${host})`; } console.log(`[sendVerificationRequest] Determined email subject: "${subject}"`); let user; try { user = process.env.CREATE_USER_ON_LOGIN !== "false" ? await findOrCreateUser(email, name) : await getUserByEmail?.(email); if (!user) { console.warn(`[sendVerificationRequest] User not found and creation disabled/failed for email: ${email}. Aborting.`); return; } console.log(`[sendVerificationRequest] User found or created for email: ${email}, ID: ${user.id || user?.user?.id || "unknown"}`); } catch (error) { console.error(`[sendVerificationRequest] Error during user lookup/creation for email: ${email}`, error); throw error; } if (process.env.LOG_VERIFICATION_URL) { console.log(` \u{1F44B} MAGIC LINK URL ****************** `); console.log(url); console.log(` ************************************ `); } if (process.env.SKIP_EMAIL === "true") { console.warn(`[sendVerificationRequest] \u{1F6AB} Email sending is disabled via SKIP_EMAIL.`); return; } if (!process.env.POSTMARK_API_TOKEN && !process.env.POSTMARK_KEY) { console.error("[sendVerificationRequest] \u{1F6AB} Missing Postmark API Key (POSTMARK_API_TOKEN or POSTMARK_KEY). Cannot send email."); throw new Error("Missing Postmark API Key"); } try { const textBody = await text({ url, host, email, expires, merchantChargeId }, theme); const htmlBody = await html({ url, host, email, expires, merchantChargeId }, theme); console.log(`[sendVerificationRequest] Attempting to send email via Postmark to ${email} from ${from}`); const res = await fetch("https://api.postmarkapp.com/email", { method: "POST", headers: { Accept: "application/json", "Content-Type": "application/json", "X-Postmark-Server-Token": process.env.POSTMARK_API_TOKEN || process.env.POSTMARK_KEY }, body: JSON.stringify({ From: from, To: email, Subject: subject, TextBody: textBody, HtmlBody: htmlBody, MessageStream: "outbound" }) }); if (!res.ok) { const errorBody = await res.json(); console.error(`[sendVerificationRequest] Postmark error sending email to ${email}. Status: ${res.status}`, errorBody); throw new Error(`Postmark error: ${res.status} ${JSON.stringify(errorBody)}`); } console.log(`[sendVerificationRequest] \u2705 Email successfully sent to ${email} via Postmark. Status: ${res.status}`); } catch (error) { console.error(`[sendVerificationRequest] \u{1F4A5} Failed to send email to ${email}. Error:`, error); throw error; } }, "sendVerificationRequest"); function defaultHtml({ url, host, email, merchantChargeId }, theme) { return render(PostPurchaseLoginEmail({ url, host, email, siteName: process.env.NEXT_PUBLIC_PRODUCT_NAME || process.env.NEXT_PUBLIC_SITE_TITLE || "", ...merchantChargeId && { invoiceUrl: `${process.env.COURSEBUILDER_URL}/invoices/${merchantChargeId}` }, previewText: process.env.NEXT_PUBLIC_PRODUCT_NAME || process.env.NEXT_PUBLIC_SITE_TITLE || "login link" }, theme)); } __name(defaultHtml, "defaultHtml"); async function defaultText({ url, host, email, merchantChargeId }, theme) { return await render(PostPurchaseLoginEmail({ url, host, email, siteName: process.env.NEXT_PUBLIC_PRODUCT_NAME || process.env.NEXT_PUBLIC_SITE_TITLE || "", ...merchantChargeId && { invoiceUrl: `${process.env.COURSEBUILDER_URL}/invoices/${merchantChargeId}` }, previewText: process.env.NEXT_PUBLIC_PRODUCT_NAME || process.env.NEXT_PUBLIC_SITE_TITLE || "login link" }, theme), { plainText: true }); } __name(defaultText, "defaultText"); async function signUpHtml({ url, host, email }, theme) { return await render(NewMemberEmail({ url, host, email, siteName: process.env.NEXT_PUBLIC_PRODUCT_NAME || process.env.NEXT_PUBLIC_SITE_TITLE || "" })); } __name(signUpHtml, "signUpHtml"); async function signUpText({ url, host, email }, theme) { return await render(NewMemberEmail({ url, host, email, siteName: process.env.NEXT_PUBLIC_PRODUCT_NAME || process.env.NEXT_PUBLIC_SITE_TITLE || "" }), { plainText: true }); } __name(signUpText, "signUpText"); export { sendVerificationRequest }; //# sourceMappingURL=chunk-26D7PACF.js.map