Skip to content
Merged
Show file tree
Hide file tree
Changes from 250 commits
Commits
Show all changes
267 commits
Select commit Hold shift + click to select a range
206300c
Merge branch 'main' into link-based-coupon-codes
steven-tey Jul 13, 2025
0c8937e
Refactor discount actions to remove unused provider parameter and str…
devkiran Jul 14, 2025
56daee4
Refactor promotion code creation logic
devkiran Jul 14, 2025
1a31aab
Delete coupon.ts
devkiran Jul 14, 2025
6e059ef
Merge branch 'main' into link-based-coupon-codes
devkiran Jul 19, 2025
6b6587b
Merge branch 'main' into link-based-coupon-codes
devkiran Jul 21, 2025
6e782e5
wip
devkiran Jul 21, 2025
0625682
wip
devkiran Jul 14, 2025
5da4148
Update types.ts
devkiran Jul 21, 2025
8ae89d4
Update import-partnerstack-modal.tsx
devkiran Jul 21, 2025
33dc5f2
Refactor Stripe client initialization to use VERCEL_ENV for livemode …
devkiran Jul 21, 2025
6c8b511
Improve Stripe coupon creation and error handling
devkiran Jul 21, 2025
262d1e6
Update create-coupon.ts
devkiran Jul 21, 2025
4d66307
Update add-edit-discount-sheet.tsx
devkiran Jul 21, 2025
705cc1d
Update route.ts
devkiran Jul 21, 2025
6fc3ec5
Update create-promotion-code.ts
devkiran Jul 21, 2025
63ae63d
Update checkout-session-completed.ts
devkiran Jul 21, 2025
23c0be9
Add coupon deleted webhook handler and integrate with route
devkiran Jul 21, 2025
c5bc5df
add getPromotionCode
devkiran Jul 21, 2025
98dc15d
add recordFakeClick
devkiran Jul 21, 2025
c552743
Update checkout-session-completed.ts
devkiran Jul 21, 2025
d7923bb
Update checkout-session-completed.ts
devkiran Jul 21, 2025
485f99d
Merge branch 'main' into link-based-coupon-codes
steven-tey Jul 21, 2025
096d04d
Merge branch 'main' into link-based-coupon-codes
steven-tey Jul 22, 2025
e96202c
Merge branch 'main' into link-based-coupon-codes
steven-tey Jul 22, 2025
41de2d2
Merge branch 'main' into link-based-coupon-codes
devkiran Jul 23, 2025
dfb32cc
send discount has been deleted email
devkiran Jul 23, 2025
714be7a
Update delete-discount.ts
devkiran Jul 23, 2025
0a93a55
Update delete-discount.ts
devkiran Jul 23, 2025
08456cd
Merge branch 'main' into link-based-coupon-codes
devkiran Aug 6, 2025
8623821
Update record-fake-click.ts
devkiran Aug 6, 2025
ef3e1e5
create promotion code when adding a new link
devkiran Aug 6, 2025
e47b608
Refactor link creation to include discount and program details, strea…
devkiran Aug 6, 2025
94a1210
Create disable-promotion-code.ts
devkiran Aug 7, 2025
7e5c5cf
Merge branch 'main' into link-based-coupon-codes
devkiran Aug 7, 2025
befd2af
Update disable-promotion-code.ts
devkiran Aug 7, 2025
b5d55b6
Refactor bulk link deletion to include workspace across multiple API …
devkiran Aug 7, 2025
6ab362f
rename
devkiran Aug 7, 2025
1545e7f
Update route.ts
devkiran Aug 7, 2025
747c734
Update route.ts
devkiran Aug 7, 2025
f83ad9f
update the link with new coupon code
devkiran Aug 7, 2025
4d814f0
handle the coupon code management in link update
devkiran Aug 7, 2025
a403713
Merge branch 'main' into link-based-coupon-codes
steven-tey Aug 8, 2025
073c64d
Update route.ts
devkiran Aug 8, 2025
d066275
rename
devkiran Aug 8, 2025
a14a750
Update coupon-deleted.ts
devkiran Aug 8, 2025
d91e9e3
Update discount.prisma
devkiran Aug 8, 2025
1ce2c45
revert some changes (will do this in separate PR)
devkiran Aug 8, 2025
931a23f
Refactor discount creation to include program data
devkiran Aug 8, 2025
4a56797
Refactor disableStripePromotionCode to use explicit params
devkiran Aug 8, 2025
3bd7196
Update create-partner-link.ts
devkiran Aug 8, 2025
98f520b
fix build
devkiran Aug 8, 2025
1404d5b
address coderabbit feedback
devkiran Aug 8, 2025
d214f2f
Update bulk-delete-links.ts
devkiran Aug 8, 2025
3c9e93a
Refactor link creation to use workspace and skip coupon option
devkiran Aug 8, 2025
f923041
Update bulk-approve-partners.ts
devkiran Aug 8, 2025
741aadd
Update import-partners.ts
devkiran Aug 8, 2025
699979f
Update update-link.ts
devkiran Aug 8, 2025
f0c8422
Update create-link.ts
devkiran Aug 8, 2025
6aff485
Update create-stripe-promotion-code.ts
devkiran Aug 8, 2025
1644fa4
Update route.ts
devkiran Aug 8, 2025
dae24a8
Update route.ts
devkiran Aug 8, 2025
54dab41
Update delete-discount.ts
devkiran Aug 8, 2025
db9c336
Update route.ts
devkiran Aug 8, 2025
a16d874
Merge branch 'main' into link-based-coupon-codes
devkiran Aug 8, 2025
7680b93
Merge branch 'main' into link-based-coupon-codes
devkiran Aug 17, 2025
41afcc9
Merge branch 'main' into link-based-coupon-codes
devkiran Aug 18, 2025
07f10a3
Update add-edit-discount-sheet.tsx
devkiran Aug 18, 2025
744276c
Update add-edit-discount-sheet.tsx
devkiran Aug 18, 2025
d2a63d7
Update add-edit-discount-sheet.tsx
devkiran Aug 18, 2025
cc3d03b
Refactor discount sheet and update related logic
devkiran Aug 18, 2025
48f86ae
Merge branch 'main' into link-based-coupon-codes
devkiran Aug 18, 2025
e64deb8
Refactor discount actions and schema, remove promotion code cron
devkiran Aug 18, 2025
a5c546a
Update add-edit-discount-sheet.tsx
devkiran Aug 18, 2025
e736d0c
Update create-discount.ts
devkiran Aug 18, 2025
088e98b
Update add-edit-discount-sheet.tsx
devkiran Aug 18, 2025
1ded8e8
Update inline-badge-popover.tsx
devkiran Aug 18, 2025
1a0f279
fix the "coupon.deleted" webhook
devkiran Aug 18, 2025
d673d0a
simplify email
devkiran Aug 18, 2025
edaf1ee
Merge branch 'main' into link-based-coupon-codes
devkiran Aug 19, 2025
2bada47
Update route.ts
devkiran Aug 19, 2025
2ae570c
Refactor coupon code tracking to discount schema
devkiran Aug 19, 2025
347dc43
add /api/cron/links/create-promotion-codes and /api/cron/links/delet…
devkiran Aug 19, 2025
eec3829
Refactor promotion code creation to use partner group ID instead of d…
devkiran Aug 19, 2025
0d809d3
Update route.ts
devkiran Aug 19, 2025
0d3a7b6
Delete delete-partner.ts
devkiran Aug 19, 2025
2636391
Revert "Delete delete-partner.ts"
devkiran Aug 19, 2025
03637bc
Update discount.ts
devkiran Aug 19, 2025
bcd9639
Update route.ts
devkiran Aug 19, 2025
0535e83
Update checkout-session-completed.ts
devkiran Aug 19, 2025
8ad7b78
Update add-edit-discount-sheet.tsx
devkiran Aug 19, 2025
460ad47
Add coupon code support to PartnerLinkCard and update schemas
devkiran Aug 19, 2025
73995c5
Merge branch 'main' into link-based-coupon-codes
devkiran Aug 29, 2025
78b76ae
Update import-partners.ts
devkiran Aug 29, 2025
3325476
Update route.ts
devkiran Aug 29, 2025
748a25e
Update disable-stripe-promotion-code.ts
devkiran Aug 29, 2025
cf966cd
Update create-discount.ts
devkiran Aug 29, 2025
958b862
Update create-stripe-coupon.ts
devkiran Aug 29, 2025
ebf3178
Refactor Stripe promotion code and coupon APIs
devkiran Aug 29, 2025
a8e9b8f
Refactor promotion code creation logic
devkiran Aug 29, 2025
ad1097d
skip coupon code creation if existing code exists
devkiran Aug 29, 2025
feb38cf
Update ban-partner.ts
devkiran Aug 29, 2025
ac1c411
Update create-link.ts
devkiran Aug 29, 2025
257e0a1
Update create-stripe-promotion-code.ts
devkiran Aug 29, 2025
f51c562
Update disable-stripe-promotion-code.ts
devkiran Aug 29, 2025
2edcffa
fix coupon deletion
devkiran Aug 29, 2025
13c4a5e
improve the cron job
devkiran Aug 29, 2025
079e4b7
Update route.ts
devkiran Aug 29, 2025
257ec79
fix cron job
devkiran Aug 29, 2025
5189f3d
Merge branch 'main' into link-based-coupon-codes
devkiran Sep 1, 2025
f9d40dd
Merge branch 'group-links' into link-based-coupon-codes
devkiran Sep 1, 2025
c7f4f7c
Refactor promotion code creation jobs and API routes
devkiran Sep 2, 2025
d4d515a
improve the cron job
devkiran Sep 2, 2025
35fe8c0
rename
devkiran Sep 3, 2025
27dbcd1
Add new API routes for enqueuing promotion code creation and deletion…
devkiran Sep 7, 2025
bd84c12
Refactor promotion code to coupon code naming
devkiran Sep 7, 2025
f5139d5
Merge branch 'main' into link-based-coupon-codes
devkiran Sep 7, 2025
076ea6b
Refactor enqueueCouponCodeDeleteJobs to accept links array
devkiran Sep 7, 2025
a58ceea
Refactor coupon job enqueuing to accept single or multiple links
devkiran Sep 7, 2025
545bba5
Refactor createLink to simplify parameters and discount logic
devkiran Sep 7, 2025
b4c90fa
Merge branch 'group-links' into link-based-coupon-codes
devkiran Sep 7, 2025
5e504f6
Update links.ts
devkiran Sep 7, 2025
478136a
Update partners.ts
devkiran Sep 7, 2025
7d726d3
Update route.ts
devkiran Sep 7, 2025
a4b7fb2
Update partner-profile.ts
devkiran Sep 7, 2025
77ed8c1
Update payouts.ts
devkiran Sep 7, 2025
9ed3298
Update pnpm-lock.yaml
devkiran Sep 7, 2025
4ae412e
fix build
devkiran Sep 7, 2025
9d93ef3
add coupon code creation during bulk create links
devkiran Sep 8, 2025
97c7b3a
Update delete-discount.ts
devkiran Sep 8, 2025
8985d7f
fix cron URL
devkiran Sep 8, 2025
bce917a
some fixes after testing
devkiran Sep 8, 2025
3c9f699
Refactor bulk link deletion to remove workspace parameter and streaml…
devkiran Sep 8, 2025
18b0011
Update coupon-deleted.ts
devkiran Sep 8, 2025
26ec96f
remove skipCouponCreation
devkiran Sep 8, 2025
8a9c540
Update bulk-ban-partners.ts
devkiran Sep 8, 2025
a4ebf3b
Update schemas.ts
devkiran Sep 8, 2025
fe61555
Update bulk-create-links.ts
devkiran Sep 8, 2025
299625f
Update create-link.ts
devkiran Sep 8, 2025
7c2920e
fix the TS errors
devkiran Sep 8, 2025
6aa44d3
Merge branch 'main' into link-based-coupon-codes
devkiran Sep 9, 2025
24192c1
Update coupon-deleted.ts
devkiran Sep 9, 2025
8c9f724
Merge branch 'group-links' into link-based-coupon-codes
devkiran Sep 9, 2025
23334d1
Update create-stripe-coupon.ts
devkiran Sep 9, 2025
bc4dd00
Update disable-stripe-promotion-code.ts
devkiran Sep 9, 2025
10a785f
Update checkout-session-completed.ts
devkiran Sep 9, 2025
96d5de6
Update link.prisma
devkiran Sep 9, 2025
07bd9ba
Update checkout-session-completed.ts
devkiran Sep 9, 2025
e3ac1e6
Merge branch 'main' into link-based-coupon-codes
devkiran Sep 10, 2025
d4f0ebf
finalize the Stripe webhook
devkiran Sep 10, 2025
8f16cf2
format
devkiran Sep 10, 2025
5a1d437
Merge branch 'group-links' into link-based-coupon-codes
devkiran Sep 10, 2025
6251659
Merge branch 'main' into link-based-coupon-codes
steven-tey Sep 19, 2025
1a31fde
Merge branch 'main' into link-based-coupon-codes
steven-tey Sep 21, 2025
4934a7c
Merge branch 'main' into link-based-coupon-codes
devkiran Sep 22, 2025
b705ddb
some cleanup
devkiran Sep 22, 2025
108ca09
Add discount code API endpoints and schemas
devkiran Sep 22, 2025
8a31e8c
Update route.ts
devkiran Sep 22, 2025
f47455f
remove unused
devkiran Sep 22, 2025
642fc5d
wip
devkiran Sep 22, 2025
dbbb006
wip
devkiran Sep 22, 2025
098d7db
fix discount code creation
devkiran Sep 22, 2025
ef1bbc3
Update coupon-deleted.ts
devkiran Sep 22, 2025
370ea22
Merge branch 'main' into link-based-coupon-codes
devkiran Sep 24, 2025
7dab69e
wip
devkiran Sep 24, 2025
1b78fa9
Merge branch 'main' into link-based-coupon-codes
devkiran Sep 24, 2025
237f139
Add delete discount code API endpoint and refactor discount deletion …
devkiran Sep 24, 2025
0875cd0
some fixes
devkiran Sep 24, 2025
cd95bc5
add discount codes API
devkiran Sep 24, 2025
ce00462
Refactor discount code deletion logic and API usage
devkiran Sep 24, 2025
a1f1fed
Update coupon-deleted.ts
devkiran Sep 24, 2025
5c1883a
Update bulk-ban-partners.ts
devkiran Sep 24, 2025
02256b6
revert the changes
devkiran Sep 24, 2025
94ed3ff
listen for promotion_code.updated" webhook
devkiran Sep 24, 2025
885afa1
format
devkiran Sep 24, 2025
8435c62
Update checkout-session-completed.ts
devkiran Sep 24, 2025
c57a17f
display discount codes on the partner links card
devkiran Sep 24, 2025
23f2eee
record audit log
devkiran Sep 24, 2025
4c6246a
add discount code modal
devkiran Sep 24, 2025
10836c8
wip
devkiran Sep 25, 2025
da8fb3f
Merge branch 'main' into link-based-coupon-codes
devkiran Sep 25, 2025
ecbfd06
fix cron jobs
devkiran Sep 25, 2025
a4d12c5
display the dicounts on the parter profile page
devkiran Sep 25, 2025
09a528d
remove couponCodeTrackingEnabledAt
devkiran Sep 25, 2025
c0af060
Refactor discount code creation logic and improve error handling
devkiran Sep 25, 2025
aec6609
Update discount.ts
devkiran Sep 25, 2025
3378d3c
add table action button
devkiran Sep 25, 2025
50fd75c
delete discount code
devkiran Sep 25, 2025
b3a2a8a
Refactor discount code deletion
devkiran Sep 25, 2025
26959fc
Refactor discount code handling to use queueDiscountCodeDeletion acro…
devkiran Sep 25, 2025
961196b
Add API endpoint to delete discount codes and refactor related logic
devkiran Sep 25, 2025
1c24905
Update ban-partner.ts
devkiran Sep 25, 2025
77f267d
Update route.ts
devkiran Sep 25, 2025
c0ae40e
Update bulk-ban-partners.ts
devkiran Sep 25, 2025
3e90815
Update queue-discount-code-deletion.ts
devkiran Sep 25, 2025
db21f37
Update update-discount.ts
devkiran Sep 25, 2025
a52b099
Update delete-link.ts
devkiran Sep 25, 2025
a16a10f
Update get-program-enrollment-or-throw.ts
devkiran Sep 25, 2025
0f45b51
Delete discount.ts
devkiran Sep 25, 2025
d1d21c7
Delete workflow.ts
devkiran Sep 25, 2025
0a15fc4
Update page-client.tsx
devkiran Sep 25, 2025
fc7d678
Update use-api-mutation.ts
devkiran Sep 25, 2025
b2bdc6b
Update add-discount-code-modal.tsx
devkiran Sep 25, 2025
3d705bb
fix coupon creation modal
devkiran Sep 25, 2025
638cace
Update add-edit-discount-sheet.tsx
devkiran Sep 25, 2025
ee5a7c3
add /api/cron/discounts/remap-discount-codes
devkiran Sep 25, 2025
81d5c98
Refactor discount code deletion logic
devkiran Sep 25, 2025
0e9894d
format
devkiran Sep 25, 2025
1030c62
Merge branch 'main' into link-based-coupon-codes
devkiran Sep 26, 2025
c3f85e2
update the discount table UI
devkiran Sep 26, 2025
57af06d
improve the delete discount code modal
devkiran Sep 26, 2025
f6216a2
add empty states to the discount table
devkiran Sep 26, 2025
1859ed6
add a loading state
devkiran Sep 26, 2025
db03a5b
add UpgradeRequiredToast
devkiran Sep 26, 2025
0224f20
add custom cta to UpgradeRequiredToast
devkiran Sep 26, 2025
0967b8c
fix ban partner to include program
devkiran Sep 26, 2025
21b0ddc
final cleanup
devkiran Sep 26, 2025
8460086
Update queue-discount-code-deletion.ts
devkiran Sep 26, 2025
5b941d8
Update route.ts
devkiran Sep 26, 2025
692acb0
Update page-client.tsx
devkiran Sep 26, 2025
87aa841
Update queue-discount-code-deletion.ts
devkiran Sep 26, 2025
68a5b6c
move the url to /groups/remap-discount-codes
devkiran Sep 26, 2025
5ea7b2f
Update route.ts
devkiran Sep 26, 2025
7c81f0f
Update bulk-ban-partners.ts
devkiran Sep 26, 2025
bad087f
Update route.ts
devkiran Sep 26, 2025
aff528e
Update create-discount.ts
devkiran Sep 26, 2025
789e6ad
add STRIPE_ERROR_MAP
devkiran Sep 26, 2025
0b4b16f
Merge branch 'main' into link-based-coupon-codes
devkiran Sep 26, 2025
7c68590
Merge branch 'main' into link-based-coupon-codes
steven-tey Sep 29, 2025
8fd04e8
fix params
steven-tey Sep 29, 2025
0e235c7
Merge branch 'main' into link-based-coupon-codes
steven-tey Sep 29, 2025
6c1a7aa
Merge branch 'main' into link-based-coupon-codes
devkiran Oct 1, 2025
6a23bcb
Update route.ts
devkiran Oct 1, 2025
b46d7c5
Update route.ts
devkiran Oct 1, 2025
d60d4ab
Update route.ts
devkiran Oct 1, 2025
3d78347
Update route.ts
devkiran Oct 1, 2025
242e1ec
Update programs.ts
devkiran Oct 1, 2025
92439b4
Merge branch 'main' into link-based-coupon-codes
steven-tey Oct 3, 2025
d12b65d
moved modals
steven-tey Oct 3, 2025
64fe760
redirect partner when not exist
steven-tey Oct 3, 2025
5a4c91b
style changes
steven-tey Oct 3, 2025
c268afd
Merge branch 'main' into link-based-coupon-codes
steven-tey Oct 3, 2025
7c27b6e
rearrange isDiscountEquivalent
steven-tey Oct 3, 2025
6c3800d
use dcode_ prefix
steven-tey Oct 3, 2025
6fc58cc
rearrange some stuff
steven-tey Oct 3, 2025
2975282
finalize checkout.session.completed webhook
steven-tey Oct 3, 2025
52fa2b1
address coderabbit feedback
steven-tey Oct 3, 2025
c4395ac
update PartnerLinkCard, misc final changes
steven-tey Oct 3, 2025
f5083cf
use group name in discount name
steven-tey Oct 3, 2025
db09f48
final bug fixes
steven-tey Oct 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 21 additions & 23 deletions apps/web/app/(ee)/api/commissions/[commissionId]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,29 +166,27 @@ export const PATCH = withWorkspace(
}

waitUntil(
(async () => {
await Promise.allSettled([
syncTotalCommissions({
partnerId: commission.partnerId,
programId: commission.programId,
}),

recordAuditLog({
workspaceId: workspace.id,
programId,
action: "commission.updated",
description: `Commission ${commissionId} updated`,
actor: session.user,
targets: [
{
type: "commission",
id: commission.id,
metadata: updatedCommission,
},
],
}),
]);
})(),
Promise.allSettled([
syncTotalCommissions({
partnerId: commission.partnerId,
programId: commission.programId,
}),

recordAuditLog({
workspaceId: workspace.id,
programId,
action: "commission.updated",
description: `Commission ${commissionId} updated`,
actor: session.user,
targets: [
{
type: "commission",
id: commission.id,
metadata: updatedCommission,
},
],
}),
]),
);

return NextResponse.json(CommissionEnrichedSchema.parse(updatedCommission));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { handleAndReturnErrorResponse } from "@/lib/api/errors";
import { verifyQstashSignature } from "@/lib/cron/verify-qstash";
import { disableStripeDiscountCode } from "@/lib/stripe/disable-stripe-discount-code";
import { prisma } from "@dub/prisma";
import { logAndRespond } from "../../../utils";

export const dynamic = "force-dynamic";

// POST /api/cron/discount-codes/[discountCodeId]/delete
export async function POST(
req: Request,
{ params }: { params: Promise<{ discountCodeId: string }> },
) {
try {
const { discountCodeId } = await params;

const rawBody = await req.text();

await verifyQstashSignature({
req,
rawBody,
});

const discountCode = await prisma.discountCode.findUnique({
where: {
id: discountCodeId,
},
});

if (!discountCode) {
return logAndRespond(`Discount code ${discountCodeId} not found.`);
}

const workspace = await prisma.project.findUniqueOrThrow({
where: {
defaultProgramId: discountCode.programId,
},
select: {
stripeConnectId: true,
},
});

const disabledDiscountCode = await disableStripeDiscountCode({
code: discountCode.code,
stripeConnectId: workspace.stripeConnectId,
});

if (disabledDiscountCode) {
await prisma.discountCode.delete({
where: {
id: discountCodeId,
},
});
}

return logAndRespond(
`Discount code ${discountCode.code} disabled from Stripe for ${workspace.stripeConnectId}.`,
);
} catch (error) {
return handleAndReturnErrorResponse(error);
}
}
113 changes: 113 additions & 0 deletions apps/web/app/(ee)/api/cron/groups/remap-discount-codes/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
import { isDiscountEquivalent } from "@/lib/api/discounts/is-discount-equivalent";
import { queueDiscountCodeDeletion } from "@/lib/api/discounts/queue-discount-code-deletion";
import { handleAndReturnErrorResponse } from "@/lib/api/errors";
import { verifyQstashSignature } from "@/lib/cron/verify-qstash";
import { prisma } from "@dub/prisma";
import { z } from "zod";
import { logAndRespond } from "../../utils";

export const dynamic = "force-dynamic";

const schema = z.object({
programId: z.string(),
partnerIds: z.array(z.string()),
groupId: z.string(),
});

// POST /api/cron/groups/remap-discount-codes
export async function POST(req: Request) {
try {
const rawBody = await req.text();

await verifyQstashSignature({
req,
rawBody,
});

const { programId, partnerIds, groupId } = schema.parse(
JSON.parse(rawBody),
);

if (partnerIds.length === 0) {
return logAndRespond("No partner IDs provided.");
}

const programEnrollments = await prisma.programEnrollment.findMany({
where: {
partnerId: {
in: partnerIds,
},
programId,
},
include: {
discountCodes: {
include: {
discount: true,
},
},
},
});

if (programEnrollments.length === 0) {
return logAndRespond("No program enrollments found.");
}

const group = await prisma.partnerGroup.findUnique({
where: {
id: groupId,
},
include: {
discount: true,
},
});

if (!group) {
return logAndRespond("Group not found.");
}

const discountCodes = programEnrollments.flatMap(
({ discountCodes }) => discountCodes,
);

const discountCodesToUpdate: string[] = [];
const discountCodesToRemove: string[] = [];

for (const discountCode of discountCodes) {
const keepDiscountCode = isDiscountEquivalent(
group.discount,
discountCode.discount,
);

if (keepDiscountCode) {
discountCodesToUpdate.push(discountCode.id);
} else {
discountCodesToRemove.push(discountCode.id);
}
}

// Update the discount codes to use the new discount
if (discountCodesToUpdate.length > 0) {
await prisma.discountCode.updateMany({
where: {
id: {
in: discountCodesToUpdate,
},
},
data: {
discountId: group.discount?.id,
},
});
}

// Remove the discount codes from the group
if (discountCodesToRemove.length > 0) {
await queueDiscountCodeDeletion(discountCodesToRemove);
}

return logAndRespond(
`Updated ${discountCodesToUpdate.length} discount codes and removed ${discountCodesToRemove.length} discount codes.`,
);
} catch (error) {
return handleAndReturnErrorResponse(error);
}
}
22 changes: 11 additions & 11 deletions apps/web/app/(ee)/api/cron/links/invalidate-for-discounts/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { verifyQstashSignature } from "@/lib/cron/verify-qstash";
import { prisma } from "@dub/prisma";
import { chunk } from "@dub/utils";
import { z } from "zod";
import { logAndRespond } from "../../utils";

export const dynamic = "force-dynamic";

Expand Down Expand Up @@ -34,8 +35,9 @@ export async function POST(req: Request) {
});

if (!group) {
console.error(`Group ${groupId} not found.`);
return new Response("OK");
return logAndRespond(`Group ${groupId} not found.`, {
logLevel: "error",
});
}

// Find all the links of the partners in the group
Expand All @@ -59,30 +61,28 @@ export async function POST(req: Request) {
});

if (programEnrollments.length === 0) {
console.log(`No program enrollments found for group ${groupId}.`);
return new Response("OK");
return logAndRespond(
`No program enrollments found for group ${groupId}.`,
);
}

const links = programEnrollments.flatMap((enrollment) => enrollment.links);

if (links.length === 0) {
console.log(`No links found for partners in the group ${groupId}.`);
return new Response("OK");
return logAndRespond(
`No links found for partners in the group ${groupId}.`,
);
}

console.log(`Found ${links.length} links to invalidate the cache for.`);

const linkChunks = chunk(links, 100);

// Expire the cache for the links
for (const linkChunk of linkChunks) {
const toExpire = linkChunk.map(({ domain, key }) => ({ domain, key }));
await linkCache.expireMany(toExpire);
console.log(toExpire);
console.log(`Expired cache for ${toExpire.length} links.`);
}

return new Response("OK");
return logAndRespond(`Expired cache for ${links.length} links.`);
} catch (error) {
return handleAndReturnErrorResponse(error);
}
Expand Down
78 changes: 78 additions & 0 deletions apps/web/app/(ee)/api/discount-codes/[discountCodeId]/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import { recordAuditLog } from "@/lib/api/audit-logs/record-audit-log";
import { queueDiscountCodeDeletion } from "@/lib/api/discounts/queue-discount-code-deletion";
import { DubApiError } from "@/lib/api/errors";
import { getDefaultProgramIdOrThrow } from "@/lib/api/programs/get-default-program-id-or-throw";
import { withWorkspace } from "@/lib/auth";
import { prisma } from "@dub/prisma";
import { waitUntil } from "@vercel/functions";
import { NextResponse } from "next/server";

// DELETE /api/discount-codes/[discountCodeId] - soft delete a discount code
export const DELETE = withWorkspace(
async ({ workspace, params, session }) => {
const { discountCodeId } = params;
const programId = getDefaultProgramIdOrThrow(workspace);

const discountCode = await prisma.discountCode.findUnique({
where: {
id: discountCodeId,
},
});

if (!discountCode || !discountCode.discountId) {
throw new DubApiError({
message: `Discount code (${discountCodeId}) not found.`,
code: "bad_request",
});
}

if (discountCode.programId !== programId) {
throw new DubApiError({
message: `Discount code (${discountCodeId}) is not associated with the program.`,
code: "bad_request",
});
}

await prisma.discountCode.update({
where: {
id: discountCodeId,
},
data: {
discountId: null,
},
});

waitUntil(
Promise.allSettled([
recordAuditLog({
workspaceId: workspace.id,
programId,
action: "discount_code.deleted",
description: `Discount code (${discountCode.code}) deleted`,
actor: session.user,
targets: [
{
type: "discount_code",
id: discountCode.id,
metadata: discountCode,
},
],
}),

queueDiscountCodeDeletion(discountCode.id),
]),
);

return NextResponse.json({ id: discountCode.id });
},
{
requiredPlan: [
"business",
"business plus",
"business extra",
"business max",
"advanced",
"enterprise",
],
},
);
Loading