diff --git a/apps/web/package.json b/apps/web/package.json index a418276a2..8632f442e 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -44,7 +44,7 @@ "@trpc/server": "^10.13.0", "@upstash/qstash": "^2.7.17", "@upstash/ratelimit": "^1.2.1", - "@vercel/functions": "^1.0.2", + "@vercel/functions": "^1.5.2", "@vercel/kv": "^2.0.0", "accept-language-parser": "^1.5.0", "autoprefixer": "^10.4.13", @@ -77,7 +77,6 @@ "react-i18next": "^12.1.4", "react-remove-scroll": "^2.5.6", "react-use": "^17.4.0", - "request-ip": "^3.3.0", "smoothscroll-polyfill": "^0.4.4", "spacetime": "^7.4.7", "superjson": "^2.0.0", @@ -91,7 +90,6 @@ "@types/color-hash": "^1.0.2", "@types/lodash": "^4.14.178", "@types/react-big-calendar": "^1.8.8", - "@types/request-ip": "^0.0.41", "@types/smoothscroll-polyfill": "^0.3.1", "cheerio": "^1.0.0-rc.12", "cross-env": "^7.0.3", diff --git a/apps/web/src/app/api/trpc/[trpc]/route.ts b/apps/web/src/app/api/trpc/[trpc]/route.ts new file mode 100644 index 000000000..8d3dcec4e --- /dev/null +++ b/apps/web/src/app/api/trpc/[trpc]/route.ts @@ -0,0 +1,46 @@ +import * as Sentry from "@sentry/nextjs"; +import { TRPCError } from "@trpc/server"; +import { fetchRequestHandler } from "@trpc/server/adapters/fetch"; +import { ipAddress } from "@vercel/functions"; + +import { getServerSession } from "@/auth"; +import type { TRPCContext } from "@/trpc/context"; +import { appRouter } from "@/trpc/routers"; +import { getEmailClient } from "@/utils/emails"; + +const handler = (request: Request) => { + return fetchRequestHandler({ + endpoint: "/api/trpc", + req: request, + router: appRouter, + createContext: async () => { + const session = await getServerSession(); + + if (!session?.user) { + throw new TRPCError({ + code: "UNAUTHORIZED", + message: "Unauthorized", + }); + } + + return { + user: { + id: session.user.id, + isGuest: session.user.email === null, + locale: session.user.locale ?? undefined, + image: session.user.image ?? undefined, + getEmailClient: () => + getEmailClient(session.user?.locale ?? undefined), + }, + ip: ipAddress(request) ?? undefined, + } satisfies TRPCContext; + }, + onError({ error }) { + if (error.code === "INTERNAL_SERVER_ERROR") { + Sentry.captureException(error); + } + }, + }); +}; + +export { handler as GET, handler as POST }; diff --git a/apps/web/src/pages/api/trpc/[trpc].ts b/apps/web/src/pages/api/trpc/[trpc].ts deleted file mode 100644 index 5be3dfa4c..000000000 --- a/apps/web/src/pages/api/trpc/[trpc].ts +++ /dev/null @@ -1,50 +0,0 @@ -import { posthogApiHandler } from "@rallly/posthog/server"; -import * as Sentry from "@sentry/nextjs"; -import { TRPCError } from "@trpc/server"; -import { createNextApiHandler } from "@trpc/server/adapters/next"; -import requestIp from "request-ip"; - -import { getServerSession } from "@/auth"; -import type { TRPCContext } from "@/trpc/context"; -import type { AppRouter } from "@/trpc/routers"; -import { appRouter } from "@/trpc/routers"; -import { getEmailClient } from "@/utils/emails"; -import { composeApiHandlers } from "@/utils/next"; - -export const config = { - api: { - externalResolver: true, - }, -}; - -const trpcApiHandler = createNextApiHandler({ - router: appRouter, - createContext: async (opts) => { - const session = await getServerSession(opts.req, opts.res); - - if (!session) { - throw new TRPCError({ - code: "UNAUTHORIZED", - message: "Unauthorized", - }); - } - - return { - user: { - id: session.user.id, - isGuest: session.user.email === null, - locale: session.user.locale ?? undefined, - image: session.user.image ?? undefined, - getEmailClient: () => getEmailClient(session.user.locale ?? undefined), - }, - ip: requestIp.getClientIp(opts.req) ?? undefined, - } satisfies TRPCContext; - }, - onError({ error }) { - if (error.code === "INTERNAL_SERVER_ERROR") { - Sentry.captureException(error); - } - }, -}); - -export default composeApiHandlers(trpcApiHandler, posthogApiHandler); diff --git a/yarn.lock b/yarn.lock index 49c1a5edb..927c06407 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6784,13 +6784,6 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/request-ip@^0.0.41": - version "0.0.41" - resolved "https://registry.yarnpkg.com/@types/request-ip/-/request-ip-0.0.41.tgz#c22a3244df2573402989346062851b06b7a5ac4e" - integrity sha512-Qzz0PM2nSZej4lsLzzNfADIORZhhxO7PED0fXpg4FjXiHuJ/lMyUg+YFF5q8x9HPZH3Gl6N+NOM8QZjItNgGKg== - dependencies: - "@types/node" "*" - "@types/scheduler@*": version "0.16.2" resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" @@ -7023,10 +7016,10 @@ resolved "https://registry.yarnpkg.com/@vercel/functions/-/functions-1.4.1.tgz#d1a81c27f7eb5b5b2ca412a8a4e682e4cfbea32d" integrity sha512-987mKpoDCI18x2rDjrDbiuGOtxDMK/UhfhDZoN3A2SAt40BMaj8HEKwVqL6fOian5j/3RZcOuJnMOpatQGgpjw== -"@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== +"@vercel/functions@^1.5.2": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@vercel/functions/-/functions-1.5.2.tgz#9adf248fc76e082055e70543791842a1e460eb40" + integrity sha512-9XuynFoM/J1X+LSahgjhuAZCbZ96vm9mpXapCkSS1MX890U7zLh7n2RW/2KLNuxsXt8u8h2dOCw+Njtg+7pXgQ== "@vercel/kv@^2.0.0": version "2.0.0" @@ -13131,11 +13124,6 @@ replace-ext@^1.0.0: resolved "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz" integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== -request-ip@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/request-ip/-/request-ip-3.3.0.tgz#863451e8fec03847d44f223e30a5d63e369fa611" - integrity sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA== - require-in-the-middle@^7.1.1: version "7.3.0" resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-7.3.0.tgz#ce64a1083647dc07b3273b348357efac8a9945c9"