From 631c5f7c53e510de02ddafa8c27e4dfd1dcb39fb Mon Sep 17 00:00:00 2001 From: Benny Joo Date: Mon, 10 Mar 2025 10:35:11 -0400 Subject: [PATCH] migrate webhookTriggers and workflows apis (#19875) --- .../web/app/api/cron/webhookTriggers/route.ts | 17 +++++++++++++ .../workflows/scheduleEmailReminders/route.ts | 3 +++ .../workflows/scheduleSMSReminders/route.ts | 3 +++ .../scheduleWhatsappReminders/route.ts | 3 +++ apps/web/pages/api/cron/webhookTriggers.ts | 1 - .../cron/workflows/scheduleEmailReminders.ts | 1 - .../cron/workflows/scheduleSMSReminders.ts | 1 - .../workflows/scheduleWhatsappReminders.ts | 1 - .../workflows/api/scheduleEmailReminders.ts | 24 +++++++------------ .../ee/workflows/api/scheduleSMSReminders.ts | 22 +++++++---------- .../api/scheduleWhatsappReminders.ts | 21 +++++++--------- packages/features/webhooks/lib/cron.ts | 23 ------------------ 12 files changed, 52 insertions(+), 68 deletions(-) create mode 100644 apps/web/app/api/cron/webhookTriggers/route.ts create mode 100644 apps/web/app/api/cron/workflows/scheduleEmailReminders/route.ts create mode 100644 apps/web/app/api/cron/workflows/scheduleSMSReminders/route.ts create mode 100644 apps/web/app/api/cron/workflows/scheduleWhatsappReminders/route.ts delete mode 100644 apps/web/pages/api/cron/webhookTriggers.ts delete mode 100644 apps/web/pages/api/cron/workflows/scheduleEmailReminders.ts delete mode 100644 apps/web/pages/api/cron/workflows/scheduleSMSReminders.ts delete mode 100644 apps/web/pages/api/cron/workflows/scheduleWhatsappReminders.ts delete mode 100644 packages/features/webhooks/lib/cron.ts diff --git a/apps/web/app/api/cron/webhookTriggers/route.ts b/apps/web/app/api/cron/webhookTriggers/route.ts new file mode 100644 index 0000000000..ddba48018b --- /dev/null +++ b/apps/web/app/api/cron/webhookTriggers/route.ts @@ -0,0 +1,17 @@ +import type { NextRequest } from "next/server"; +import { NextResponse } from "next/server"; + +import { handleWebhookScheduledTriggers } from "@calcom/features/webhooks/lib/handleWebhookScheduledTriggers"; +import prisma from "@calcom/prisma"; + +export async function POST(req: NextRequest) { + const apiKey = req.headers.get("authorization") || req.nextUrl.searchParams.get("apiKey"); + + if (process.env.CRON_API_KEY !== apiKey) { + return NextResponse.json({ message: "Not authenticated" }, { status: 401 }); + } + + await handleWebhookScheduledTriggers(prisma); + + return NextResponse.json({ ok: true }); +} diff --git a/apps/web/app/api/cron/workflows/scheduleEmailReminders/route.ts b/apps/web/app/api/cron/workflows/scheduleEmailReminders/route.ts new file mode 100644 index 0000000000..7208c9b0a7 --- /dev/null +++ b/apps/web/app/api/cron/workflows/scheduleEmailReminders/route.ts @@ -0,0 +1,3 @@ +import { handler } from "@calcom/features/ee/workflows/api/scheduleEmailReminders"; + +export { handler as POST }; diff --git a/apps/web/app/api/cron/workflows/scheduleSMSReminders/route.ts b/apps/web/app/api/cron/workflows/scheduleSMSReminders/route.ts new file mode 100644 index 0000000000..de024832f0 --- /dev/null +++ b/apps/web/app/api/cron/workflows/scheduleSMSReminders/route.ts @@ -0,0 +1,3 @@ +import { handler } from "@calcom/features/ee/workflows/api/scheduleSMSReminders"; + +export { handler as POST }; diff --git a/apps/web/app/api/cron/workflows/scheduleWhatsappReminders/route.ts b/apps/web/app/api/cron/workflows/scheduleWhatsappReminders/route.ts new file mode 100644 index 0000000000..d0a0d2c60e --- /dev/null +++ b/apps/web/app/api/cron/workflows/scheduleWhatsappReminders/route.ts @@ -0,0 +1,3 @@ +import { handler } from "@calcom/features/ee/workflows/api/scheduleWhatsappReminders"; + +export { handler as POST }; diff --git a/apps/web/pages/api/cron/webhookTriggers.ts b/apps/web/pages/api/cron/webhookTriggers.ts deleted file mode 100644 index f262146429..0000000000 --- a/apps/web/pages/api/cron/webhookTriggers.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from "@calcom/features/webhooks/lib/cron"; diff --git a/apps/web/pages/api/cron/workflows/scheduleEmailReminders.ts b/apps/web/pages/api/cron/workflows/scheduleEmailReminders.ts deleted file mode 100644 index 80821bbe5b..0000000000 --- a/apps/web/pages/api/cron/workflows/scheduleEmailReminders.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from "@calcom/features/ee/workflows/api/scheduleEmailReminders"; diff --git a/apps/web/pages/api/cron/workflows/scheduleSMSReminders.ts b/apps/web/pages/api/cron/workflows/scheduleSMSReminders.ts deleted file mode 100644 index 891eaac11d..0000000000 --- a/apps/web/pages/api/cron/workflows/scheduleSMSReminders.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from "@calcom/features/ee/workflows/api/scheduleSMSReminders"; diff --git a/apps/web/pages/api/cron/workflows/scheduleWhatsappReminders.ts b/apps/web/pages/api/cron/workflows/scheduleWhatsappReminders.ts deleted file mode 100644 index 2cde406ee8..0000000000 --- a/apps/web/pages/api/cron/workflows/scheduleWhatsappReminders.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from "@calcom/features/ee/workflows/api/scheduleWhatsappReminders"; diff --git a/packages/features/ee/workflows/api/scheduleEmailReminders.ts b/packages/features/ee/workflows/api/scheduleEmailReminders.ts index 06595f7636..4b411f4a5b 100644 --- a/packages/features/ee/workflows/api/scheduleEmailReminders.ts +++ b/packages/features/ee/workflows/api/scheduleEmailReminders.ts @@ -1,5 +1,6 @@ /* Schedule any workflow reminder that falls within 72 hours for email */ -import type { NextApiRequest, NextApiResponse } from "next"; +import type { NextRequest } from "next/server"; +import { NextResponse } from "next/server"; import { v4 as uuidv4 } from "uuid"; import dayjs from "@calcom/dayjs"; @@ -7,7 +8,6 @@ import generateIcsString from "@calcom/emails/lib/generateIcsString"; import { getCalEventResponses } from "@calcom/features/bookings/lib/getCalEventResponses"; import { getBookerBaseUrl } from "@calcom/lib/getBookerUrl/server"; import logger from "@calcom/lib/logger"; -import { defaultHandler } from "@calcom/lib/server/defaultHandler"; import { getTranslation } from "@calcom/lib/server/i18n"; import { getTimeFormatStringFromUserTimeFormat } from "@calcom/lib/timeFormat"; import prisma from "@calcom/prisma"; @@ -31,16 +31,15 @@ import customTemplate from "../lib/reminders/templates/customTemplate"; import emailRatingTemplate from "../lib/reminders/templates/emailRatingTemplate"; import emailReminderTemplate from "../lib/reminders/templates/emailReminderTemplate"; -async function handler(req: NextApiRequest, res: NextApiResponse) { - const apiKey = req.headers.authorization || req.query.apiKey; +export async function handler(req: NextRequest) { + const apiKey = req.headers.get("authorization") || req.nextUrl.searchParams.get("apiKey"); + if (process.env.CRON_API_KEY !== apiKey) { - res.status(401).json({ message: "Not authenticated" }); - return; + return NextResponse.json({ message: "Not authenticated" }, { status: 401 }); } if (!process.env.SENDGRID_API_KEY || !process.env.SENDGRID_EMAIL) { - res.status(405).json({ message: "No SendGrid API key or email" }); - return; + return NextResponse.json({ message: "No SendGrid API key or email" }, { status: 405 }); } // delete batch_ids with already past scheduled date from scheduled_sends @@ -105,8 +104,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { const unscheduledReminders: PartialWorkflowReminder[] = await getAllUnscheduledReminders(); if (!unscheduledReminders.length) { - res.status(200).json({ message: "No Emails to schedule" }); - return; + return NextResponse.json({ message: "No Emails to schedule" }, { status: 200 }); } for (const reminder of unscheduledReminders) { @@ -438,9 +436,5 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { }); }); - res.status(200).json({ message: `${unscheduledReminders.length} Emails to schedule` }); + return NextResponse.json({ message: `${unscheduledReminders.length} Emails to schedule` }, { status: 200 }); } - -export default defaultHandler({ - POST: Promise.resolve({ default: handler }), -}); diff --git a/packages/features/ee/workflows/api/scheduleSMSReminders.ts b/packages/features/ee/workflows/api/scheduleSMSReminders.ts index 0bd64a3c24..8c4f4b0ffb 100644 --- a/packages/features/ee/workflows/api/scheduleSMSReminders.ts +++ b/packages/features/ee/workflows/api/scheduleSMSReminders.ts @@ -1,11 +1,11 @@ /* Schedule any workflow reminder that falls within 7 days for SMS */ -import type { NextApiRequest, NextApiResponse } from "next"; +import type { NextRequest } from "next/server"; +import { NextResponse } from "next/server"; import dayjs from "@calcom/dayjs"; import { bulkShortenLinks } from "@calcom/ee/workflows/lib/reminders/utils"; import { getCalEventResponses } from "@calcom/features/bookings/lib/getCalEventResponses"; import { getBookerBaseUrl } from "@calcom/lib/getBookerUrl/server"; -import { defaultHandler } from "@calcom/lib/server/defaultHandler"; import { getTimeFormatStringFromUserTimeFormat } from "@calcom/lib/timeFormat"; import prisma from "@calcom/prisma"; import { WorkflowActions, WorkflowMethods, WorkflowTemplates } from "@calcom/prisma/enums"; @@ -19,11 +19,11 @@ import type { VariablesType } from "../lib/reminders/templates/customTemplate"; import customTemplate from "../lib/reminders/templates/customTemplate"; import smsReminderTemplate from "../lib/reminders/templates/smsReminderTemplate"; -async function handler(req: NextApiRequest, res: NextApiResponse) { - const apiKey = req.headers.authorization || req.query.apiKey; +export async function handler(req: NextRequest) { + const apiKey = req.headers.get("authorization") || req.nextUrl.searchParams.get("apiKey"); + if (process.env.CRON_API_KEY !== apiKey) { - res.status(401).json({ message: "Not authenticated" }); - return; + return NextResponse.json({ message: "Not authenticated" }, { status: 401 }); } //delete all scheduled sms reminders where scheduled date is past current date @@ -61,8 +61,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { })) as (PartialWorkflowReminder & { retryCount: number })[]; if (!unscheduledReminders.length) { - res.json({ ok: true }); - return; + return NextResponse.json({ ok: true }); } for (const reminder of unscheduledReminders) { @@ -216,9 +215,6 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { console.log(`Error scheduling SMS with error ${error}`); } } - res.status(200).json({ message: "SMS scheduled" }); -} -export default defaultHandler({ - POST: Promise.resolve({ default: handler }), -}); + return NextResponse.json({ message: "SMS scheduled" }, { status: 200 }); +} diff --git a/packages/features/ee/workflows/api/scheduleWhatsappReminders.ts b/packages/features/ee/workflows/api/scheduleWhatsappReminders.ts index e68321d8cd..b2bb350705 100644 --- a/packages/features/ee/workflows/api/scheduleWhatsappReminders.ts +++ b/packages/features/ee/workflows/api/scheduleWhatsappReminders.ts @@ -1,8 +1,8 @@ /* Schedule any workflow reminder that falls within 7 days for WHATSAPP */ -import type { NextApiRequest, NextApiResponse } from "next"; +import type { NextRequest } from "next/server"; +import { NextResponse } from "next/server"; import dayjs from "@calcom/dayjs"; -import { defaultHandler } from "@calcom/lib/server/defaultHandler"; import { getTimeFormatStringFromUserTimeFormat } from "@calcom/lib/timeFormat"; import prisma from "@calcom/prisma"; import { WorkflowActions, WorkflowMethods } from "@calcom/prisma/enums"; @@ -12,11 +12,11 @@ import type { PartialWorkflowReminder } from "../lib/getWorkflowReminders"; import { select } from "../lib/getWorkflowReminders"; import * as twilio from "../lib/reminders/providers/twilioProvider"; -async function handler(req: NextApiRequest, res: NextApiResponse) { - const apiKey = req.headers.authorization || req.query.apiKey; +export async function handler(req: NextRequest) { + const apiKey = req.headers.get("authorization") || req.nextUrl.searchParams.get("apiKey"); + if (process.env.CRON_API_KEY !== apiKey) { - res.status(401).json({ message: "Not authenticated" }); - return; + return NextResponse.json({ message: "Not authenticated" }, { status: 401 }); } //delete all scheduled whatsapp reminders where scheduled date is past current date @@ -42,8 +42,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { })) as PartialWorkflowReminder[]; if (!unscheduledReminders.length) { - res.json({ ok: true }); - return; + return NextResponse.json({ ok: true }); } for (const reminder of unscheduledReminders) { @@ -115,9 +114,5 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { } } - res.status(200).json({ message: "WHATSAPP scheduled" }); + return NextResponse.json({ message: "WHATSAPP scheduled" }, { status: 200 }); } - -export default defaultHandler({ - POST: Promise.resolve({ default: handler }), -}); diff --git a/packages/features/webhooks/lib/cron.ts b/packages/features/webhooks/lib/cron.ts deleted file mode 100644 index 720eef94f7..0000000000 --- a/packages/features/webhooks/lib/cron.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* Cron job for scheduled webhook events triggers */ -import type { NextApiRequest, NextApiResponse } from "next"; - -import { defaultHandler } from "@calcom/lib/server/defaultHandler"; -import prisma from "@calcom/prisma"; - -import { handleWebhookScheduledTriggers } from "./handleWebhookScheduledTriggers"; - -async function handler(req: NextApiRequest, res: NextApiResponse) { - const apiKey = req.headers.authorization || req.query.apiKey; - if (process.env.CRON_API_KEY !== apiKey) { - res.status(401).json({ message: "Not authenticated" }); - return; - } - - await handleWebhookScheduledTriggers(prisma); - - res.json({ ok: true }); -} - -export default defaultHandler({ - POST: Promise.resolve({ default: handler }), -});