Skip to content

Commit 4963d24

Browse files
CarinaWolliCarinaWolli
andauthored
fix: don't use unpublished org for credit usage (calcom#22154)
* only return publichsed orgs * fix twilioWebhook tests * code clean up * add missing import --------- Co-authored-by: CarinaWolli <wollencarina@gmail.com>
1 parent 9405bc9 commit 4963d24

3 files changed

Lines changed: 64 additions & 38 deletions

File tree

apps/web/pages/api/twilio/webhook.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { z } from "zod";
33

44
import * as twilio from "@calcom/features/ee/workflows/lib/reminders/providers/twilioProvider";
55
import { IS_SMS_CREDITS_ENABLED, WEBAPP_URL } from "@calcom/lib/constants";
6-
import getOrgIdFromMemberOrTeamId from "@calcom/lib/getOrgIdFromMemberOrTeamId";
6+
import { getPublishedOrgIdFromMemberOrTeamId } from "@calcom/lib/getOrgIdFromMemberOrTeamId";
77
import { defaultHandler } from "@calcom/lib/server/defaultHandler";
88
import prisma from "@calcom/prisma";
99

@@ -120,7 +120,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
120120
}
121121

122122
if (!orgId) {
123-
orgId = await getOrgIdFromMemberOrTeamId({
123+
orgId = await getPublishedOrgIdFromMemberOrTeamId({
124124
...(!parsedTeamId ? { memberId: parsedUserId } : {}),
125125
teamId: parsedTeamId,
126126
});

packages/features/ee/workflows/lib/test/twilioWebhook.test.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ vi.mock("@calcom/prisma", () => ({
3434
},
3535
}));
3636

37+
vi.mock("@calcom/lib/getOrgIdFromMemberOrTeamId", () => ({
38+
default: vi.fn().mockResolvedValue(null),
39+
getPublishedOrgIdFromMemberOrTeamId: vi.fn().mockResolvedValue(null),
40+
}));
41+
3742
describe("Twilio Webhook Handler", () => {
3843
beforeEach(() => {
3944
vi.clearAllMocks();
@@ -117,10 +122,6 @@ describe("Twilio Webhook Handler", () => {
117122
mockFindFirst.mockResolvedValue(null);
118123
const webhookHandler = (await import("../../../../../../apps/web/pages/api/twilio/webhook")).default;
119124

120-
vi.mock("@calcom/lib/getOrgIdFromMemberOrTeamId", () => ({
121-
default: vi.fn().mockResolvedValue(null),
122-
}));
123-
124125
const mockRequest = {
125126
method: "POST",
126127
headers: {

packages/lib/getOrgIdFromMemberOrTeamId.ts

Lines changed: 57 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,70 @@
11
import prisma from "@calcom/prisma";
2+
import type { Prisma } from "@calcom/prisma/client";
23

3-
export default async function getOrgIdFromMemberOrTeamId(args: {
4-
memberId?: number | null;
5-
teamId?: number | null;
6-
}) {
7-
const userId = args.memberId ?? 0;
8-
const teamId = args.teamId ?? 0;
4+
const getOrgMemberOrTeamWhere = (memberId?: number | null, teamId?: number | null) => {
5+
const conditions: Prisma.TeamWhereInput[] = [];
96

10-
const orgId = await prisma.team.findFirst({
11-
where: {
12-
OR: [
7+
if (memberId) {
8+
conditions.push({
9+
AND: [
1310
{
14-
AND: [
15-
{
16-
members: {
17-
some: {
18-
userId,
19-
accepted: true,
20-
},
21-
},
22-
},
23-
{
24-
isOrganization: true,
11+
members: {
12+
some: {
13+
userId: memberId,
14+
accepted: true,
2515
},
26-
],
16+
},
2717
},
2818
{
29-
AND: [
30-
{
31-
children: {
32-
some: {
33-
id: teamId,
34-
},
35-
},
36-
},
37-
{
38-
isOrganization: true,
19+
isOrganization: true,
20+
},
21+
],
22+
});
23+
}
24+
25+
if (teamId) {
26+
conditions.push({
27+
AND: [
28+
{
29+
children: {
30+
some: {
31+
id: teamId,
3932
},
40-
],
33+
},
34+
},
35+
{
36+
isOrganization: true,
4137
},
4238
],
39+
});
40+
}
41+
42+
return {
43+
OR: conditions,
44+
};
45+
};
46+
47+
export default async function getOrgIdFromMemberOrTeamId(args: {
48+
memberId?: number | null;
49+
teamId?: number | null;
50+
}) {
51+
const orgId = await prisma.team.findFirst({
52+
where: getOrgMemberOrTeamWhere(args.memberId, args.teamId),
53+
select: {
54+
id: true,
55+
},
56+
});
57+
return orgId?.id;
58+
}
59+
60+
export async function getPublishedOrgIdFromMemberOrTeamId(args: {
61+
memberId?: number | null;
62+
teamId?: number | null;
63+
}) {
64+
const orgId = await prisma.team.findFirst({
65+
where: {
66+
...getOrgMemberOrTeamWhere(args.memberId, args.teamId),
67+
slug: { not: null },
4368
},
4469
select: {
4570
id: true,

0 commit comments

Comments
 (0)