Compare commits
2 Commits
5757d20b3b
...
f5cb6f794d
| Author | SHA1 | Date |
|---|---|---|
|
|
f5cb6f794d | |
|
|
862975813f |
|
|
@ -1,6 +1,5 @@
|
||||||
import type { APIRoute } from "astro";
|
import type { APIRoute } from "astro";
|
||||||
import { prisma } from "../lib/prisma";
|
import { prisma } from "../lib/prisma";
|
||||||
import { sendEmail } from "../lib/email";
|
|
||||||
|
|
||||||
export const prerender = false;
|
export const prerender = false;
|
||||||
|
|
||||||
|
|
@ -65,11 +64,32 @@ export const POST: APIRoute = async ({ request }) => {
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
await sendEmail(
|
const emailApiKey = import.meta.env.EMAIL_API_KEY;
|
||||||
{ nombre, email, mensaje },
|
|
||||||
"daviddevelope24r@outlook.com",
|
const emailResponse = await fetch("https://flows2.carpa.com/webhook/email/send", {
|
||||||
"CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO",
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"x-api-key": emailApiKey!,
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
type: "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO",
|
||||||
|
data: {
|
||||||
|
nombre,
|
||||||
|
email,
|
||||||
|
mensaje,
|
||||||
|
senderName : "Centro del Reino de Paz y Justicia",
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!emailResponse.ok) {
|
||||||
|
console.error("Error enviando correo");
|
||||||
|
return new Response(
|
||||||
|
JSON.stringify({ error: "Error en servicio de correo" }),
|
||||||
|
{ status: 500 }
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return new Response(null, {
|
return new Response(null, {
|
||||||
status: 302,
|
status: 302,
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import type { APIRoute } from "astro";
|
import type { APIRoute } from "astro";
|
||||||
import { appendToSheet, emailExists } from "../lib/googleSheets";
|
import { appendToSheet, emailExists } from "../lib/googleSheets";
|
||||||
import { sendEmail } from "../lib/email";
|
|
||||||
export const prerender = false;
|
export const prerender = false;
|
||||||
|
|
||||||
export const POST: APIRoute = async ({ request }) => {
|
export const POST: APIRoute = async ({ request }) => {
|
||||||
|
|
@ -52,12 +51,31 @@ export const POST: APIRoute = async ({ request }) => {
|
||||||
new Date().toLocaleString()
|
new Date().toLocaleString()
|
||||||
];
|
];
|
||||||
|
|
||||||
// 🔹 Enviar correo y guardar en Google Sheets
|
// 🔹 Enviar a tu backend real
|
||||||
await Promise.all([
|
const [emailResponse] = await Promise.all([
|
||||||
sendEmail({ nombres, apellidos }, email, "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION"),
|
fetch("http://155.138.215.11:3050/email/send", {
|
||||||
appendToSheet(valuesForSheets),
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"x-api-key": emailApiKey!,
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
type: "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION",
|
||||||
|
data: dataSend,
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
appendToSheet(valuesForSheets) // Guardar en Google Sheets
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
if (!emailResponse.ok) {
|
||||||
|
return new Response(null, {
|
||||||
|
status: 302,
|
||||||
|
headers: {
|
||||||
|
Location: "/",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// 🔹 Redirección elegante después de enviar
|
// 🔹 Redirección elegante después de enviar
|
||||||
return new Response(null, {
|
return new Response(null, {
|
||||||
status: 302,
|
status: 302,
|
||||||
|
|
|
||||||
|
|
@ -1,110 +1,138 @@
|
||||||
import Cloudflare from "cloudflare";
|
// import Cloudflare from "cloudflare";
|
||||||
|
|
||||||
type TypeEmailData = "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO" | "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION";
|
type TypeEmailData = "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO" | "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION";
|
||||||
|
|
||||||
const TEMPLATE_URLS: Record<TypeEmailData, { subject: string; url: string }> = {
|
export async function sendEmail(data: object, to: string, type: TypeEmailData) {
|
||||||
CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION: {
|
const emailApiKey = import.meta.env.EMAIL_API_KEY;
|
||||||
subject: "Confirmación de inscripción al voluntariado",
|
|
||||||
url: "https://pub-910ed90860804520b9202194cf43c0a6.r2.dev/centro_del_reino_paz_y_justicia_postulacion_user.html",
|
const dataFinal = {
|
||||||
|
...data,
|
||||||
|
email: to,
|
||||||
|
senderName: "Centro del Reino de Paz y Justicia",
|
||||||
|
};
|
||||||
|
|
||||||
|
const emailResponse = await fetch("https://flows2.carpa.com/webhook/email/send", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"x-api-key": emailApiKey!,
|
||||||
},
|
},
|
||||||
CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO: {
|
body: JSON.stringify({
|
||||||
subject: "Notificación de contacto institucional",
|
type: type,
|
||||||
url: "https://pub-910ed90860804520b9202194cf43c0a6.r2.dev/centro_del_reino_paz_y_justicia_info.html",
|
data: dataFinal,
|
||||||
},
|
}),
|
||||||
};
|
|
||||||
|
|
||||||
const TEMPLATE_CACHE = new Map<string, string>();
|
|
||||||
|
|
||||||
async function fetchTemplate(type: TypeEmailData): Promise<string> {
|
|
||||||
const cached = TEMPLATE_CACHE.get(type);
|
|
||||||
if (cached) return cached;
|
|
||||||
|
|
||||||
const { url } = TEMPLATE_URLS[type];
|
|
||||||
const res = await fetch(url);
|
|
||||||
if (!res.ok) {
|
|
||||||
throw new Error(`Error descargando template ${type}: HTTP ${res.status}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const html = await res.text();
|
|
||||||
TEMPLATE_CACHE.set(type, html);
|
|
||||||
return html;
|
|
||||||
}
|
|
||||||
|
|
||||||
function renderTemplate(template: string, data: Record<string, string>): string {
|
|
||||||
let html = template;
|
|
||||||
for (const [key, value] of Object.entries(data)) {
|
|
||||||
html = html.replaceAll(new RegExp(`\\{\\{${key}\\}\\}`, "g"), value ?? "");
|
|
||||||
}
|
|
||||||
return html;
|
|
||||||
}
|
|
||||||
|
|
||||||
function stripHtml(html: string): string {
|
|
||||||
return html.replace(/<[^>]*>/g, "").replace(/\s+/g, " ").trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function sendEmail(data: Record<string, string>, to: string, type: TypeEmailData) {
|
|
||||||
const apiToken = import.meta.env.CLOUDFLARE_API_TOKEN;
|
|
||||||
const accountId = import.meta.env.CLOUDFLARE_ACCOUNT_ID;
|
|
||||||
|
|
||||||
const client = new Cloudflare({ apiToken });
|
|
||||||
const { subject } = TEMPLATE_URLS[type];
|
|
||||||
const rawHtml = await fetchTemplate(type);
|
|
||||||
const html = renderTemplate(rawHtml, data);
|
|
||||||
const text = stripHtml(html);
|
|
||||||
|
|
||||||
const response = await client.emailSending.send({
|
|
||||||
account_id: accountId,
|
|
||||||
from: "welcome@mail.centrodelreinodepazyjusticia.com",
|
|
||||||
to,
|
|
||||||
subject,
|
|
||||||
html,
|
|
||||||
text,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!response.delivered) {
|
const responseBody = await emailResponse.text();
|
||||||
console.error("Cloudflare email not delivered", response);
|
|
||||||
throw new Error("El correo no fue entregado");
|
if (!emailResponse.ok) {
|
||||||
|
console.error(`Error enviando correo (status ${emailResponse.status}): ${responseBody}`);
|
||||||
|
throw new Error(`Error en servicio de correo: ${emailResponse.status}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// ═══════════════════════════════════════════════════════════════
|
||||||
┌────────────────────────────────────────────────────────────┐
|
// CÓDIGO COMENTADO — Cloudflare (Email Workers)
|
||||||
│ ALTERNATIVA: Brevo (API v3) │
|
// Descomentar para volver a Cloudflare en lugar de n8n/Brevo
|
||||||
│ Para volver a Brevo: │
|
// ═══════════════════════════════════════════════════════════════
|
||||||
│ 1. Instalar: pnpm add @getbrevo/brevo │
|
|
||||||
│ 2. Agregar a .env: BREVO_API_KEY=xxx │
|
|
||||||
│ 3. Cambiar "from" a tu dominio verificado en Brevo │
|
|
||||||
│ 4. En sendEmail(), comentar el bloque Cloudflare │
|
|
||||||
│ y descomentar la llamada a sendEmailViaBrevo() │
|
|
||||||
└────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
import {
|
// const TEMPLATE_URLS: Record<TypeEmailData, { subject: string; url: string }> = {
|
||||||
TransactionalEmailsApi,
|
// CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION: {
|
||||||
SendSmtpEmail,
|
// subject: "Confirmación de inscripción al voluntariado",
|
||||||
} from "@getbrevo/brevo";
|
// url: "https://pub-910ed90860804520b9202194cf43c0a6.r2.dev/centro_del_reino_paz_y_justicia_postulacion_user.html",
|
||||||
|
// },
|
||||||
|
// CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO: {
|
||||||
|
// subject: "Notificación de contacto institucional",
|
||||||
|
// url: "https://pub-910ed90860804520b9202194cf43c0a6.r2.dev/centro_del_reino_paz_y_justicia_info.html",
|
||||||
|
// },
|
||||||
|
// };
|
||||||
|
|
||||||
async function sendEmailViaBrevo(
|
// const TEMPLATE_CACHE = new Map<string, string>();
|
||||||
data: Record<string, string>,
|
|
||||||
to: string,
|
|
||||||
type: TypeEmailData
|
|
||||||
) {
|
|
||||||
const apiKey = import.meta.env.BREVO_API_KEY;
|
|
||||||
const { subject } = TEMPLATE_URLS[type];
|
|
||||||
const rawHtml = await fetchTemplate(type);
|
|
||||||
const html = renderTemplate(rawHtml, data);
|
|
||||||
const text = stripHtml(html);
|
|
||||||
|
|
||||||
const api = new TransactionalEmailsApi();
|
// async function fetchTemplate(type: TypeEmailData): Promise<string> {
|
||||||
api.setApiKey(0, apiKey);
|
// const cached = TEMPLATE_CACHE.get(type);
|
||||||
|
// if (cached) return cached;
|
||||||
|
|
||||||
const email = new SendSmtpEmail();
|
// const { url } = TEMPLATE_URLS[type];
|
||||||
email.subject = subject;
|
// const res = await fetch(url);
|
||||||
email.sender = { name: "Centro del Reino de Paz y Justicia", email: "welcome@mail.centrodelreinodepazyjusticia.com" };
|
// if (!res.ok) {
|
||||||
email.to = [{ email: to }];
|
// throw new Error(`Error descargando template ${type}: HTTP ${res.status}`);
|
||||||
email.htmlContent = html;
|
// }
|
||||||
email.textContent = text;
|
|
||||||
|
|
||||||
const response = await api.sendTransacEmail(email);
|
// const html = await res.text();
|
||||||
console.log("Brevo email sent:", response.body?.messageId);
|
// TEMPLATE_CACHE.set(type, html);
|
||||||
}
|
// return html;
|
||||||
*/
|
// }
|
||||||
|
|
||||||
|
// function renderTemplate(template: string, data: Record<string, string>): string {
|
||||||
|
// let html = template;
|
||||||
|
// for (const [key, value] of Object.entries(data)) {
|
||||||
|
// html = html.replaceAll(new RegExp(`\\{\\{${key}\\}\\}`, "g"), value ?? "");
|
||||||
|
// }
|
||||||
|
// return html;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// function stripHtml(html: string): string {
|
||||||
|
// return html.replace(/<[^>]*>/g, "").replace(/\s+/g, " ").trim();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// export async function sendEmailCf(data: Record<string, string>, to: string, type: TypeEmailData) {
|
||||||
|
// const apiToken = import.meta.env.CLOUDFLARE_API_TOKEN;
|
||||||
|
// const accountId = import.meta.env.CLOUDFLARE_ACCOUNT_ID;
|
||||||
|
|
||||||
|
// const client = new Cloudflare({ apiToken });
|
||||||
|
// const { subject } = TEMPLATE_URLS[type];
|
||||||
|
// const rawHtml = await fetchTemplate(type);
|
||||||
|
// const html = renderTemplate(rawHtml, data);
|
||||||
|
// const text = stripHtml(html);
|
||||||
|
|
||||||
|
// const response = await client.emailSending.send({
|
||||||
|
// account_id: accountId,
|
||||||
|
// from: "welcome@mail.centrodelreinodepazyjusticia.com",
|
||||||
|
// to,
|
||||||
|
// subject,
|
||||||
|
// html,
|
||||||
|
// text,
|
||||||
|
// });
|
||||||
|
|
||||||
|
// if (!response.delivered) {
|
||||||
|
// console.error("Cloudflare email not delivered", response);
|
||||||
|
// throw new Error("El correo no fue entregado");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// ═══════════════════════════════════════════════════════════════
|
||||||
|
// ALTERNATIVA: Brevo (SDK directo)
|
||||||
|
// Descomentar y usar sendEmailViaBrevo() en lugar de lo de arriba
|
||||||
|
// Requiere: pnpm add @getbrevo/brevo + BREVO_API_KEY en .env
|
||||||
|
// ═══════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
|
// import {
|
||||||
|
// TransactionalEmailsApi,
|
||||||
|
// SendSmtpEmail,
|
||||||
|
// } from "@getbrevo/brevo";
|
||||||
|
|
||||||
|
// async function sendEmailViaBrevo(
|
||||||
|
// data: Record<string, string>,
|
||||||
|
// to: string,
|
||||||
|
// type: TypeEmailData
|
||||||
|
// ) {
|
||||||
|
// const apiKey = import.meta.env.BREVO_API_KEY;
|
||||||
|
// const { subject } = TEMPLATE_URLS[type];
|
||||||
|
// const rawHtml = await fetchTemplate(type);
|
||||||
|
// const html = renderTemplate(rawHtml, data);
|
||||||
|
// const text = stripHtml(html);
|
||||||
|
|
||||||
|
// const api = new TransactionalEmailsApi();
|
||||||
|
// api.setApiKey(0, apiKey);
|
||||||
|
|
||||||
|
// const email = new SendSmtpEmail();
|
||||||
|
// email.subject = subject;
|
||||||
|
// email.sender = { name: "Centro del Reino de Paz y Justicia", email: "welcome@mail.centrodelreinodepazyjusticia.com" };
|
||||||
|
// email.to = [{ email: to }];
|
||||||
|
// email.htmlContent = html;
|
||||||
|
// email.textContent = text;
|
||||||
|
|
||||||
|
// const response = await api.sendTransacEmail(email);
|
||||||
|
// console.log("Brevo email sent:", response.body?.messageId);
|
||||||
|
// }
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue