diff --git a/packages/backend/package.json b/packages/backend/package.json index 40a33d72a..c248dcf57 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -12,6 +12,7 @@ "@rallly/database": "*", "@rallly/emails": "*", "@rallly/utils": "*", + "@vercel/functions": "^1.0.2", "@trpc/server": "^10.13.0", "iron-session": "^6.3.1", "spacetime": "^7.4.7", diff --git a/packages/backend/trpc/routers/polls.ts b/packages/backend/trpc/routers/polls.ts index fc7b40f8b..16705c3fb 100644 --- a/packages/backend/trpc/routers/polls.ts +++ b/packages/backend/trpc/routers/polls.ts @@ -1,5 +1,6 @@ import { prisma } from "@rallly/database"; import { TRPCError } from "@trpc/server"; +import { waitUntil } from "@vercel/functions"; import dayjs from "dayjs"; import timezone from "dayjs/plugin/timezone"; import toArray from "dayjs/plugin/toArray"; @@ -131,16 +132,18 @@ export const polls = router({ }); if (user) { - await ctx.emailClient.sendTemplate("NewPollEmail", { - to: user.email, - subject: `Let's find a date for ${poll.title}`, - props: { - title: poll.title, - name: user.name, - adminLink: pollLink, - participantLink, - }, - }); + waitUntil( + ctx.emailClient.sendTemplate("NewPollEmail", { + to: user.email, + subject: `Let's find a date for ${poll.title}`, + props: { + title: poll.title, + name: user.name, + adminLink: pollLink, + participantLink, + }, + }), + ); } } @@ -875,28 +878,30 @@ export const polls = router({ }); } - const emailToHost = ctx.emailClient.sendTemplate("FinalizeHostEmail", { - subject: `Date booked for ${poll.title}`, - to: poll.user.email, - props: { - name: poll.user.name, - pollUrl: ctx.absoluteUrl(`/poll/${poll.id}`), - location: poll.location, - title: poll.title, - attendees: poll.participants - .filter((p) => - p.votes.some( - (v) => v.optionId === input.optionId && v.type !== "no", - ), - ) - .map((p) => p.name), - date, - day, - dow, - time, - }, - attachments: [{ filename: "event.ics", content: event.value }], - }); + const emailToHost = waitUntil( + ctx.emailClient.sendTemplate("FinalizeHostEmail", { + subject: `Date booked for ${poll.title}`, + to: poll.user.email, + props: { + name: poll.user.name, + pollUrl: ctx.absoluteUrl(`/poll/${poll.id}`), + location: poll.location, + title: poll.title, + attendees: poll.participants + .filter((p) => + p.votes.some( + (v) => v.optionId === input.optionId && v.type !== "no", + ), + ) + .map((p) => p.name), + date, + day, + dow, + time, + }, + attachments: [{ filename: "event.ics", content: event.value }], + }), + ); const emailsToParticipants = participantsToEmail.map((p) => { return ctx.emailClient.sendTemplate("FinalizeParticipantEmail", { @@ -924,7 +929,7 @@ export const polls = router({ }); }); - await Promise.all([emailToHost, ...emailsToParticipants]); + waitUntil(Promise.all([emailToHost, ...emailsToParticipants])); } }), reopen: possiblyPublicProcedure diff --git a/yarn.lock b/yarn.lock index 5cced0120..764132d6c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4743,6 +4743,11 @@ resolved "https://registry.npmjs.org/@vercel/analytics/-/analytics-0.1.11.tgz" integrity sha512-mj5CPR02y0BRs1tN3oZcBNAX9a8NxsIUl9vElDPcqxnMfP0RbRc9fI9Ud7+QDg/1Izvt5uMumsr+6YsmVHcyuw== +"@vercel/functions@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@vercel/functions/-/functions-1.0.2.tgz#c26ed4e3b0ed701e28c4ebd71c76b1bfe14db02a" + integrity sha512-j3udyHOv/05Y8o3WQ/ANMWa1aYagsY5B3ouImiwgYsz5z4CBUHTY5dk74oQAXYr+bgoVDpdDlmxkpnxGzKEdLQ== + "@vitest/expect@1.3.1": version "1.3.1" resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.3.1.tgz#d4c14b89c43a25fd400a6b941f51ba27fe0cb918"