diff --git a/apps/web/pages/api/trpc/features/[trpc].ts b/apps/web/pages/api/trpc/features/[trpc].ts index 314293a648..7ef7a09c1e 100644 --- a/apps/web/pages/api/trpc/features/[trpc].ts +++ b/apps/web/pages/api/trpc/features/[trpc].ts @@ -1,4 +1,4 @@ import { featureFlagRouter } from "@calcom/features/flags/server/router"; import { createNextApiHandler } from "@calcom/trpc/server/createNextApiHandler"; -export default createNextApiHandler(featureFlagRouter); +export default createNextApiHandler(featureFlagRouter, true, "features"); diff --git a/packages/features/flags/components/FlagAdminList.tsx b/packages/features/flags/components/FlagAdminList.tsx index a6cb1f269f..8ea903285f 100644 --- a/packages/features/flags/components/FlagAdminList.tsx +++ b/packages/features/flags/components/FlagAdminList.tsx @@ -32,7 +32,7 @@ const FlagToggle = (props: { flag: Flag }) => { flag: { slug, enabled }, } = props; const utils = trpc.useContext(); - const mutation = trpc.viewer.features.toggle.useMutation({ + const mutation = trpc.viewer.admin.toggleFeatureFlag.useMutation({ onSuccess: () => { showToast("Flags successfully updated", "success"); utils.viewer.features.list.invalidate(); diff --git a/packages/features/flags/server/router.ts b/packages/features/flags/server/router.ts index 689425fb39..c70751d662 100644 --- a/packages/features/flags/server/router.ts +++ b/packages/features/flags/server/router.ts @@ -1,6 +1,3 @@ -import { z } from "zod"; - -import { authedAdminProcedure } from "@calcom/trpc/server/procedures/authedProcedure"; import publicProcedure from "@calcom/trpc/server/procedures/publicProcedure"; import { router } from "@calcom/trpc/server/trpc"; @@ -17,14 +14,4 @@ export const featureFlagRouter = router({ const { prisma } = ctx; return getFeatureFlagMap(prisma); }), - toggle: authedAdminProcedure - .input(z.object({ slug: z.string(), enabled: z.boolean() })) - .mutation(({ ctx, input }) => { - const { prisma, user } = ctx; - const { slug, enabled } = input; - return prisma.feature.update({ - where: { slug }, - data: { enabled, updatedBy: user.id }, - }); - }), }); diff --git a/packages/trpc/server/createNextApiHandler.ts b/packages/trpc/server/createNextApiHandler.ts index 53202e3f93..f9a47a8c3f 100644 --- a/packages/trpc/server/createNextApiHandler.ts +++ b/packages/trpc/server/createNextApiHandler.ts @@ -8,7 +8,7 @@ import type { AnyRouter } from "@trpc/server"; /** * Creates an API handler executed by Next.js. */ -export function createNextApiHandler(router: AnyRouter, isPublic = false) { +export function createNextApiHandler(router: AnyRouter, isPublic = false, namespace = "") { return trpcNext.createNextApiHandler({ router, /** @@ -64,10 +64,13 @@ export function createNextApiHandler(router: AnyRouter, isPublic = false) { // Revalidation time here should be 1 second, per https://github.com/calcom/cal.com/pull/6823#issuecomment-1423215321 "slots.getSchedule": `no-cache`, // FIXME cityTimezones: `max-age=${ONE_DAY_IN_SECONDS}, stale-while-revalidate`, + "features.map": `max-age=${ONE_DAY_IN_SECONDS}, stale-while-revalidate`, // "map" - Feature Flag Map } as const; - const matchedPath = paths.find((v) => v in cacheRules) as keyof typeof cacheRules; - if (matchedPath) defaultHeaders.headers["cache-control"] = cacheRules[matchedPath]; + const prependNamespace = (key: string) => + (namespace ? `${namespace}.${key}` : key) as keyof typeof cacheRules; + const matchedPath = paths.find((v) => prependNamespace(v) in cacheRules); + if (matchedPath) defaultHeaders.headers["cache-control"] = cacheRules[prependNamespace(matchedPath)]; } return defaultHeaders; diff --git a/packages/trpc/server/routers/viewer/admin/_router.ts b/packages/trpc/server/routers/viewer/admin/_router.ts index 764e2dad1f..925eaa0733 100644 --- a/packages/trpc/server/routers/viewer/admin/_router.ts +++ b/packages/trpc/server/routers/viewer/admin/_router.ts @@ -1,3 +1,5 @@ +import { z } from "zod"; + import { authedAdminProcedure } from "../../../procedures/authedProcedure"; import { router } from "../../../trpc"; import { ZListMembersSchema } from "./listPaginated.schema"; @@ -47,4 +49,14 @@ export const adminRouter = router({ input, }); }), + toggleFeatureFlag: authedAdminProcedure + .input(z.object({ slug: z.string(), enabled: z.boolean() })) + .mutation(({ ctx, input }) => { + const { prisma, user } = ctx; + const { slug, enabled } = input; + return prisma.feature.update({ + where: { slug }, + data: { enabled, updatedBy: user.id }, + }); + }), });