-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Expand file tree
/
Copy pathdelete-discount.ts
More file actions
112 lines (97 loc) · 2.77 KB
/
Copy pathdelete-discount.ts
File metadata and controls
112 lines (97 loc) · 2.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
"use server";
import { recordAuditLog } from "@/lib/api/audit-logs/record-audit-log";
import { getDiscountOrThrow } from "@/lib/api/partners/get-discount-or-throw";
import { getDefaultProgramIdOrThrow } from "@/lib/api/programs/get-default-program-id-or-throw";
import { qstash } from "@/lib/cron";
import { deleteDiscountCodes } from "@/lib/discounts/delete-discount-code";
import { prisma } from "@/lib/prisma";
import { APP_DOMAIN_WITH_NGROK } from "@dub/utils";
import { waitUntil } from "@vercel/functions";
import * as z from "zod/v4";
import { authActionClient } from "../safe-action";
import { throwIfNoPermission } from "../throw-if-no-permission";
const deleteDiscountSchema = z.object({
workspaceId: z.string(),
discountId: z.string(),
});
export const deleteDiscountAction = authActionClient
.inputSchema(deleteDiscountSchema)
.action(async ({ parsedInput, ctx }) => {
const { workspace, user } = ctx;
const { discountId } = parsedInput;
throwIfNoPermission({
role: workspace.role,
requiredRoles: ["owner", "member"],
});
const programId = getDefaultProgramIdOrThrow(workspace);
const discount = await getDiscountOrThrow({
programId,
discountId,
});
// Cache discount codes to delete them later
const discountCodes = await prisma.discountCode.findMany({
where: {
discountId: discount.id,
},
include: {
discount: true,
},
});
const group = await prisma.$transaction(async (tx) => {
const group = await tx.partnerGroup.update({
where: {
discountId: discount.id,
},
data: {
discountId: null,
},
});
await tx.programEnrollment.updateMany({
where: {
discountId: discount.id,
},
data: {
discountId: null,
},
});
await tx.discountCode.updateMany({
where: {
discountId: discount.id,
},
data: {
discountId: null,
},
});
await tx.discount.delete({
where: {
id: discount.id,
},
});
return group;
});
waitUntil(
Promise.allSettled([
qstash.publishJSON({
url: `${APP_DOMAIN_WITH_NGROK}/api/cron/links/invalidate-for-discounts`,
body: {
groupId: group.id,
},
}),
deleteDiscountCodes(discountCodes),
recordAuditLog({
workspaceId: workspace.id,
programId,
action: "discount.deleted",
description: `Discount ${discountId} deleted`,
actor: user,
targets: [
{
type: "discount",
id: discountId,
metadata: discount,
},
],
}),
]),
);
});