Skip to content

Commit cfefba6

Browse files
authored
Revert "perf: use repository for webhooks list query & caching in /settings/developer/webhooks/... RSC (calcom#21781)" (calcom#22963)
1 parent 815e133 commit cfefba6

11 files changed

Lines changed: 79 additions & 170 deletions

File tree

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"use server";
22

3-
import { revalidateTag } from "next/cache";
3+
import { revalidatePath } from "next/cache";
44

5-
export async function revalidateWebhooksListGetByViewer() {
6-
revalidateTag("viewer.webhook.getByViewer");
5+
export async function revalidateWebhooksList() {
6+
revalidatePath("/settings/developer/webhooks");
77
}

apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/page.tsx

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1+
import { createRouterCaller } from "app/_trpc/context";
12
import { _generateMetadata } from "app/_utils";
2-
import { unstable_cache } from "next/cache";
33
import { cookies, headers } from "next/headers";
44
import { redirect } from "next/navigation";
55

66
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
77
import WebhooksView from "@calcom/features/webhooks/pages/webhooks-view";
88
import { APP_NAME } from "@calcom/lib/constants";
9-
import { WebhookRepository } from "@calcom/lib/server/repository/webhook";
109
import { UserPermissionRole } from "@calcom/prisma/enums";
10+
import { webhookRouter } from "@calcom/trpc/server/routers/viewer/webhook/_router";
1111

1212
import { buildLegacyRequest } from "@lib/buildLegacyCtx";
1313

@@ -20,27 +20,15 @@ export const generateMetadata = async () =>
2020
"/settings/developer/webhooks"
2121
);
2222

23-
const getCachedWebhooksList = unstable_cache(
24-
async ({ userId, userRole }: { userId: number; userRole?: UserPermissionRole }) => {
25-
return await WebhookRepository.getAllWebhooksByUserId({
26-
userId,
27-
userRole,
28-
});
29-
},
30-
undefined,
31-
{ revalidate: 3600, tags: ["viewer.webhook.getByViewer"] }
32-
);
33-
3423
const WebhooksViewServerWrapper = async () => {
3524
const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) });
3625
if (!session?.user?.id) {
3726
redirect("/auth/login");
3827
}
3928

4029
const isAdmin = session.user.role === UserPermissionRole.ADMIN;
41-
const userRole = session.user.role !== "INACTIVE_ADMIN" ? session.user.role : undefined;
42-
43-
const data = await getCachedWebhooksList({ userId: session.user.id, userRole });
30+
const caller = await createRouterCaller(webhookRouter);
31+
const data = await caller.getByViewer();
4432

4533
return <WebhooksView data={data} isAdmin={isAdmin} />;
4634
};

apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/[id]/actions.ts

Lines changed: 0 additions & 7 deletions
This file was deleted.

apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/[id]/page.tsx

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type { PageProps } from "app/_types";
22
import { getTranslate, _generateMetadata } from "app/_utils";
3-
import { unstable_cache } from "next/cache";
43

54
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
65
import { EditWebhookView } from "@calcom/features/webhooks/pages/webhook-edit-view";
@@ -16,24 +15,12 @@ export const generateMetadata = async ({ params }: { params: Promise<{ id: strin
1615
`/settings/developer/webhooks/${(await params).id}`
1716
);
1817

19-
const getCachedWebhook = (id?: string) => {
20-
const fn = unstable_cache(
21-
async () => {
22-
return await WebhookRepository.findByWebhookId(id);
23-
},
24-
undefined,
25-
{ revalidate: 3600, tags: [`viewer.webhook.get:${id}`] }
26-
);
27-
28-
return fn();
29-
};
30-
3118
const Page = async ({ params: _params }: PageProps) => {
3219
const t = await getTranslate();
3320
const params = await _params;
3421
const id = typeof params?.id === "string" ? params.id : undefined;
3522

36-
const webhook = await getCachedWebhook(id);
23+
const webhook = await WebhookRepository.findByWebhookId(id);
3724

3825
return (
3926
<SettingsHeader

apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/new/actions.ts

Lines changed: 0 additions & 7 deletions
This file was deleted.

apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/new/page.tsx

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
11
import { createRouterCaller } from "app/_trpc/context";
22
import { _generateMetadata } from "app/_utils";
3-
import { unstable_cache } from "next/cache";
4-
import { cookies, headers } from "next/headers";
5-
import { redirect } from "next/navigation";
63

7-
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
84
import { NewWebhookView } from "@calcom/features/webhooks/pages/webhook-new-view";
95
import { APP_NAME } from "@calcom/lib/constants";
10-
import { WebhookRepository } from "@calcom/lib/server/repository/webhook";
116
import { appsRouter } from "@calcom/trpc/server/routers/viewer/apps/_router";
12-
13-
import { buildLegacyRequest } from "@lib/buildLegacyCtx";
7+
import { webhookRouter } from "@calcom/trpc/server/routers/viewer/webhook/_router";
148

159
export const generateMetadata = async () =>
1610
await _generateMetadata(
@@ -21,25 +15,15 @@ export const generateMetadata = async () =>
2115
"/settings/developer/webhooks/new"
2216
);
2317

24-
const getCachedWebhooksList = unstable_cache(
25-
async ({ userId }: { userId: number }) => {
26-
return await WebhookRepository.findWebhooksByFilters({ userId });
27-
},
28-
undefined,
29-
{ revalidate: 3600, tags: ["viewer.webhook.list"] }
30-
);
31-
3218
const Page = async () => {
33-
const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) });
34-
if (!session?.user?.id) {
35-
redirect("/auth/login");
36-
}
37-
38-
const appsCaller = await createRouterCaller(appsRouter);
19+
const [appsCaller, webhookCaller] = await Promise.all([
20+
createRouterCaller(appsRouter),
21+
createRouterCaller(webhookRouter),
22+
]);
3923

4024
const [installedApps, webhooks] = await Promise.all([
4125
appsCaller.integrations({ variant: "other", onlyInstalled: true }),
42-
getCachedWebhooksList({ userId: session.user.id }),
26+
webhookCaller.list(),
4327
]);
4428

4529
return <NewWebhookView webhooks={webhooks} installedApps={installedApps} />;

packages/features/webhooks/components/WebhookListItem.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ import { Switch } from "@calcom/ui/components/form";
1818
import { showToast } from "@calcom/ui/components/toast";
1919
import { Tooltip } from "@calcom/ui/components/tooltip";
2020
import { revalidateEventTypeEditPage } from "@calcom/web/app/(use-page-wrapper)/event-types/[type]/actions";
21-
import { revalidateWebhooksListGetByViewer } from "@calcom/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/actions";
22-
import { revalidateWebhookList } from "@calcom/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/new/actions";
21+
import { revalidateWebhooksList } from "@calcom/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/actions";
2322

2423
type WebhookProps = {
2524
id: string;
@@ -47,19 +46,21 @@ export default function WebhookListItem(props: {
4746
const deleteWebhook = trpc.viewer.webhook.delete.useMutation({
4847
async onSuccess() {
4948
if (webhook.eventTypeId) revalidateEventTypeEditPage(webhook.eventTypeId);
50-
revalidateWebhooksListGetByViewer();
51-
revalidateWebhookList();
49+
revalidateWebhooksList();
5250
showToast(t("webhook_removed_successfully"), "success");
51+
await utils.viewer.webhook.getByViewer.invalidate();
52+
await utils.viewer.webhook.list.invalidate();
5353
await utils.viewer.eventTypes.get.invalidate();
5454
},
5555
});
5656
const toggleWebhook = trpc.viewer.webhook.edit.useMutation({
5757
async onSuccess(data) {
5858
if (webhook.eventTypeId) revalidateEventTypeEditPage(webhook.eventTypeId);
59-
revalidateWebhooksListGetByViewer();
60-
revalidateWebhookList();
59+
revalidateWebhooksList();
6160
// TODO: Better success message
6261
showToast(t(data?.active ? "enabled" : "disabled"), "success");
62+
await utils.viewer.webhook.getByViewer.invalidate();
63+
await utils.viewer.webhook.list.invalidate();
6364
await utils.viewer.eventTypes.get.invalidate();
6465
},
6566
});

packages/features/webhooks/pages/webhook-edit-view.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ import type { WebhookTriggerEvents } from "@calcom/prisma/enums";
77
import { trpc } from "@calcom/trpc/react";
88
import { SkeletonContainer } from "@calcom/ui/components/skeleton";
99
import { showToast } from "@calcom/ui/components/toast";
10-
import { revalidateWebhooksListGetByViewer } from "@calcom/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/actions";
11-
import { revalidateWebhookById } from "@calcom/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/[id]/actions";
12-
import { revalidateWebhookList } from "@calcom/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/new/actions";
10+
import { revalidateWebhooksList } from "@calcom/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/actions";
1311

1412
import type { WebhookFormSubmitData } from "../components/WebhookForm";
1513
import WebhookForm from "../components/WebhookForm";
@@ -45,10 +43,10 @@ export function EditWebhookView({ webhook }: { webhook?: WebhookProps }) {
4543
});
4644
const editWebhookMutation = trpc.viewer.webhook.edit.useMutation({
4745
async onSuccess() {
48-
revalidateWebhookById(webhook?.id ?? "");
49-
revalidateWebhookList();
46+
await utils.viewer.webhook.list.invalidate();
47+
await utils.viewer.webhook.get.invalidate({ webhookId: webhook?.id });
5048
showToast(t("webhook_updated_successfully"), "success");
51-
revalidateWebhooksListGetByViewer();
49+
revalidateWebhooksList();
5250
router.push("/settings/developer/webhooks");
5351
},
5452
onError(error) {

packages/features/webhooks/pages/webhook-new-view.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ import { useLocale } from "@calcom/lib/hooks/useLocale";
1010
import { trpc } from "@calcom/trpc/react";
1111
import type { RouterOutputs } from "@calcom/trpc/react";
1212
import { showToast } from "@calcom/ui/components/toast";
13-
import { revalidateWebhooksListGetByViewer } from "@calcom/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/actions";
14-
import { revalidateWebhookList } from "@calcom/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/new/actions";
13+
import { revalidateWebhooksList } from "@calcom/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/actions";
1514

1615
import type { WebhookFormSubmitData } from "../components/WebhookForm";
1716
import WebhookForm from "../components/WebhookForm";
@@ -36,8 +35,7 @@ export const NewWebhookView = ({ webhooks, installedApps }: Props) => {
3635
async onSuccess() {
3736
showToast(t("webhook_created_successfully"), "success");
3837
await utils.viewer.webhook.list.invalidate();
39-
revalidateWebhookList();
40-
revalidateWebhooksListGetByViewer();
38+
revalidateWebhooksList();
4139
router.push("/settings/developer/webhooks");
4240
},
4341
onError(error) {

packages/lib/server/repository/webhook.ts

Lines changed: 0 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
import type { Prisma } from "@prisma/client";
2-
import { z } from "zod";
3-
4-
import { WEBHOOK_TRIGGER_EVENTS } from "@calcom/features/webhooks/lib/constants";
51
import { getPlaceholderAvatar } from "@calcom/lib/defaultAvatarImage";
62
import { compareMembership } from "@calcom/lib/event-types/getEventTypesByViewer";
73
import { getUserAvatarUrl } from "@calcom/lib/getAvatarUrl";
@@ -23,24 +19,6 @@ type WebhookGroup = {
2319
webhooks: Webhook[];
2420
};
2521

26-
const webhookIdAndEventTypeIdSchema = z.object({
27-
// Webhook ID
28-
id: z.string().optional(),
29-
eventTypeId: z.number().optional(),
30-
teamId: z.number().optional(),
31-
});
32-
33-
const ZFindWebhooksByFiltersInputSchema = webhookIdAndEventTypeIdSchema
34-
.extend({
35-
appId: z.string().optional(),
36-
teamId: z.number().optional(),
37-
eventTypeId: z.number().optional(),
38-
eventTriggers: z.enum(WEBHOOK_TRIGGER_EVENTS).array().optional(),
39-
})
40-
.optional();
41-
42-
export type TFindWebhooksByFiltersInputSchema = z.infer<typeof ZFindWebhooksByFiltersInputSchema>;
43-
4422
const filterWebhooks = (webhook: Webhook) => {
4523
const appIds = [
4624
"zapier",
@@ -202,65 +180,4 @@ export class WebhookRepository {
202180
},
203181
});
204182
}
205-
206-
static async findWebhooksByFilters({
207-
userId,
208-
input,
209-
}: {
210-
userId: number;
211-
input?: TFindWebhooksByFiltersInputSchema;
212-
}) {
213-
const where: Prisma.WebhookWhereInput = {
214-
/* Don't mixup zapier webhooks with normal ones */
215-
AND: [{ appId: !input?.appId ? null : input.appId }],
216-
};
217-
218-
const user = await prisma.user.findUnique({
219-
where: {
220-
id: userId,
221-
},
222-
select: {
223-
teams: true,
224-
},
225-
});
226-
227-
if (Array.isArray(where.AND)) {
228-
if (input?.eventTypeId) {
229-
const managedParentEvt = await prisma.eventType.findFirst({
230-
where: {
231-
id: input.eventTypeId,
232-
parentId: {
233-
not: null,
234-
},
235-
},
236-
select: {
237-
parentId: true,
238-
},
239-
});
240-
241-
if (managedParentEvt?.parentId) {
242-
where.AND?.push({
243-
OR: [
244-
{ eventTypeId: input.eventTypeId },
245-
{ eventTypeId: managedParentEvt.parentId, active: true },
246-
],
247-
});
248-
} else {
249-
where.AND?.push({ eventTypeId: input.eventTypeId });
250-
}
251-
} else {
252-
where.AND?.push({
253-
OR: [{ userId }, { teamId: { in: user?.teams.map((membership) => membership.teamId) } }],
254-
});
255-
}
256-
257-
if (input?.eventTriggers) {
258-
where.AND?.push({ eventTriggers: { hasEvery: input.eventTriggers } });
259-
}
260-
}
261-
262-
return await prisma.webhook.findMany({
263-
where,
264-
});
265-
}
266183
}

0 commit comments

Comments
 (0)