diff --git a/apps/web/pages/api/twilio/webhook.ts b/apps/web/pages/api/twilio/webhook.ts index a61a64b58c..ae1bec54e9 100644 --- a/apps/web/pages/api/twilio/webhook.ts +++ b/apps/web/pages/api/twilio/webhook.ts @@ -84,6 +84,9 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { where: { userId: parsedUserId, accepted: true, + team: { + slug: { not: null }, + }, }, select: { teamId: true, diff --git a/packages/features/ee/billing/credit-service.test.ts b/packages/features/ee/billing/credit-service.test.ts index e94a93962a..1856048916 100644 --- a/packages/features/ee/billing/credit-service.test.ts +++ b/packages/features/ee/billing/credit-service.test.ts @@ -143,7 +143,7 @@ describe("CreditService", () => { describe("getTeamWithAvailableCredits", () => { it("should return team with available credits", async () => { - vi.mocked(MembershipRepository.findAllAcceptedMemberships).mockResolvedValue([ + vi.mocked(MembershipRepository.findAllAcceptedPublishedTeamMemberships).mockResolvedValue([ { id: 1, teamId: 1, @@ -169,7 +169,7 @@ describe("CreditService", () => { }); it("should return first team if no team has available credits", async () => { - vi.mocked(MembershipRepository.findAllAcceptedMemberships).mockResolvedValue([ + vi.mocked(MembershipRepository.findAllAcceptedPublishedTeamMemberships).mockResolvedValue([ { id: 1, teamId: 1, @@ -357,7 +357,9 @@ describe("CreditService", () => { }); it("should return team with available credits when userId is provided", async () => { - vi.mocked(MembershipRepository.findAllAcceptedMemberships).mockResolvedValue([{ teamId: 1 }]); + vi.mocked(MembershipRepository.findAllAcceptedPublishedTeamMemberships).mockResolvedValue([ + { teamId: 1 }, + ]); vi.mocked(CreditsRepository.findCreditBalance).mockResolvedValue({ id: "1", diff --git a/packages/features/ee/billing/credit-service.ts b/packages/features/ee/billing/credit-service.ts index 72e5e0c636..e7881ba186 100644 --- a/packages/features/ee/billing/credit-service.ts +++ b/packages/features/ee/billing/credit-service.ts @@ -191,9 +191,9 @@ export class CreditService { If user has memberships, it always returns a team, even if all have limit reached. In that case, limitReached: true is returned */ protected async _getTeamWithAvailableCredits({ userId, tx }: { userId: number; tx: PrismaTransaction }) { - const memberships = await MembershipRepository.findAllAcceptedMemberships(userId, tx); + const memberships = await MembershipRepository.findAllAcceptedPublishedTeamMemberships(userId, tx); - if (memberships.length === 0) { + if (!memberships || memberships.length === 0) { return null; } diff --git a/packages/lib/server/repository/membership.ts b/packages/lib/server/repository/membership.ts index 6eca01ff58..01b4021d82 100644 --- a/packages/lib/server/repository/membership.ts +++ b/packages/lib/server/repository/membership.ts @@ -343,17 +343,22 @@ export class MembershipRepository { }, }); } - static async findAllAcceptedMemberships(userId: number, tx?: PrismaTransaction) { + + static async findAllAcceptedPublishedTeamMemberships(userId: number, tx?: PrismaTransaction) { return (tx ?? prisma).membership.findMany({ where: { userId, accepted: true, + team: { + slug: { not: null }, + }, }, select: { teamId: true, }, }); } + /** * Get all team IDs that a user is a member of */ diff --git a/packages/trpc/server/routers/viewer/credits/buyCredits.handler.ts b/packages/trpc/server/routers/viewer/credits/buyCredits.handler.ts index f8cdf3547c..60f538ec2d 100644 --- a/packages/trpc/server/routers/viewer/credits/buyCredits.handler.ts +++ b/packages/trpc/server/routers/viewer/credits/buyCredits.handler.ts @@ -34,9 +34,9 @@ export const buyCreditsHandler = async ({ ctx, input }: BuyCreditsOptions) => { } } else { // if user id is part of a team, user can't buy credits for themselves - const memberships = await MembershipRepository.findAllAcceptedMemberships(ctx.user.id); + const memberships = await MembershipRepository.findAllAcceptedPublishedTeamMemberships(ctx.user.id); - if (memberships.length > 0) { + if (!memberships || memberships.length > 0) { throw new TRPCError({ code: "UNAUTHORIZED", }); diff --git a/packages/trpc/server/routers/viewer/credits/getAllCredits.handler.ts b/packages/trpc/server/routers/viewer/credits/getAllCredits.handler.ts index 60d9a64001..f191eeda7f 100644 --- a/packages/trpc/server/routers/viewer/credits/getAllCredits.handler.ts +++ b/packages/trpc/server/routers/viewer/credits/getAllCredits.handler.ts @@ -25,9 +25,9 @@ export const getAllCreditsHandler = async ({ ctx, input }: GetAllCreditsOptions) } } else { //if user is part of team, don't return any credits if teamId is not given - const memberships = await MembershipRepository.findAllAcceptedMemberships(ctx.user.id); + const memberships = await MembershipRepository.findAllAcceptedPublishedTeamMemberships(ctx.user.id); - if (memberships.length > 0) { + if (!memberships || memberships.length > 0) { return null; } }