fix: don't use unpublished org in any credit context (#22600)

* fix: don't use unpublished org for any credit context

* type error

* fix test

* update
This commit is contained in:
Anik Dhabal Babu
2025-07-18 10:03:50 +00:00
committed by GitHub
parent 2c91c0e309
commit c8de8ca681
6 changed files with 20 additions and 10 deletions
+3
View File
@@ -84,6 +84,9 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
where: {
userId: parsedUserId,
accepted: true,
team: {
slug: { not: null },
},
},
select: {
teamId: true,
@@ -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",
@@ -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;
}
+6 -1
View File
@@ -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
*/
@@ -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",
});
@@ -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;
}
}