diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/api-keys/actions.ts b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/api-keys/actions.ts index 4351daf7dc..231b5c697f 100644 --- a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/api-keys/actions.ts +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/api-keys/actions.ts @@ -1,7 +1,7 @@ "use server"; -import { revalidatePath } from "next/cache"; +import { revalidateTag } from "next/cache"; export async function revalidateApiKeysList() { - revalidatePath("/settings/developer/api-keys"); + revalidateTag("viewer.apiKeys.list"); } diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/api-keys/page.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/api-keys/page.tsx index ec4b1db182..50743a9339 100644 --- a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/api-keys/page.tsx +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/api-keys/page.tsx @@ -1,8 +1,13 @@ -import { createRouterCaller } from "app/_trpc/context"; import { _generateMetadata } from "app/_utils"; +import { unstable_cache } from "next/cache"; +import { cookies, headers } from "next/headers"; +import { redirect } from "next/navigation"; +import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; import { APP_NAME } from "@calcom/lib/constants"; -import { apiKeysRouter } from "@calcom/trpc/server/routers/viewer/apiKeys/_router"; +import { ApiKeyRepository } from "@calcom/lib/server/repository/apiKey"; + +import { buildLegacyRequest } from "@lib/buildLegacyCtx"; import ApiKeysView from "~/settings/developer/api-keys-view"; @@ -15,9 +20,24 @@ export const generateMetadata = async () => "/settings/developer/api-keys" ); +const getCachedApiKeys = unstable_cache( + async (userId: number) => { + return await ApiKeyRepository.findApiKeysFromUserId({ userId }); + }, + undefined, + { revalidate: 3600, tags: ["viewer.apiKeys.list"] } // Cache for 1 hour +); + const Page = async () => { - const caller = await createRouterCaller(apiKeysRouter); - const apiKeys = await caller.list(); + const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) }); + + if (!session) { + redirect("/auth/login?callbackUrl=/settings/developer/api-keys"); + } + + const userId = session.user.id; + const apiKeys = await getCachedApiKeys(userId); + return ; }; diff --git a/packages/lib/server/repository/apiKey.ts b/packages/lib/server/repository/apiKey.ts new file mode 100644 index 0000000000..4253269e0d --- /dev/null +++ b/packages/lib/server/repository/apiKey.ts @@ -0,0 +1,22 @@ +import prisma from "@calcom/prisma"; + +export class ApiKeyRepository { + static async findApiKeysFromUserId({ userId }: { userId: number }) { + return await prisma.apiKey.findMany({ + where: { + userId, + OR: [ + { + NOT: { + appId: "zapier", + }, + }, + { + appId: null, + }, + ], + }, + orderBy: { createdAt: "desc" }, + }); + } +} diff --git a/packages/trpc/server/routers/viewer/apiKeys/list.handler.ts b/packages/trpc/server/routers/viewer/apiKeys/list.handler.ts index c9ae03e0e0..87a38fa82f 100644 --- a/packages/trpc/server/routers/viewer/apiKeys/list.handler.ts +++ b/packages/trpc/server/routers/viewer/apiKeys/list.handler.ts @@ -1,4 +1,4 @@ -import prisma from "@calcom/prisma"; +import { ApiKeyRepository } from "@calcom/lib/server/repository/apiKey"; import type { TrpcSessionUser } from "../../../types"; @@ -9,20 +9,5 @@ type ListOptions = { }; export const listHandler = async ({ ctx }: ListOptions) => { - return await prisma.apiKey.findMany({ - where: { - userId: ctx.user.id, - OR: [ - { - NOT: { - appId: "zapier", - }, - }, - { - appId: null, - }, - ], - }, - orderBy: { createdAt: "desc" }, - }); + return ApiKeyRepository.findApiKeysFromUserId({ userId: ctx.user.id }); };