-
Notifications
You must be signed in to change notification settings - Fork 3k
Expand file tree
/
Copy pathroute.ts
More file actions
69 lines (60 loc) · 2.1 KB
/
route.ts
File metadata and controls
69 lines (60 loc) · 2.1 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
import { convertToCSV } from "@/lib/exports/convert-to-csv";
import { formatPartnersForExport } from "@/lib/exports/partners/format";
import { getPartners } from "@/lib/api/partners/get-partners";
import { getPartnersCount } from "@/lib/api/partners/get-partners-count";
import { getDefaultProgramIdOrThrow } from "@/lib/api/programs/get-default-program-id-or-throw";
import { withWorkspace } from "@/lib/auth";
import { qstash } from "@/lib/cron";
import { partnersExportQuerySchema } from "@/lib/zod/schemas/partners";
import { APP_DOMAIN_WITH_NGROK } from "@dub/utils";
import { NextResponse } from "next/server";
const MAX_PARTNERS_TO_EXPORT = 1000;
// GET /api/partners/export – export partners to CSV
export const GET = withWorkspace(
async ({ searchParams, workspace, session }) => {
const programId = getDefaultProgramIdOrThrow(workspace);
const parsedParams = partnersExportQuerySchema.parse(searchParams);
const { columns, ...filters } = parsedParams;
const partnersCount = await getPartnersCount<number>({
...filters,
groupBy: undefined,
programId,
});
// Process the export in the background if the number of partners is greater than MAX_PARTNERS_TO_EXPORT
if (partnersCount > MAX_PARTNERS_TO_EXPORT) {
await qstash.publishJSON({
url: `${APP_DOMAIN_WITH_NGROK}/api/cron/export/partners`,
body: {
...parsedParams,
columns: columns.join(","),
programId,
userId: session.user.id,
},
});
return NextResponse.json({}, { status: 202 });
}
const partners = await getPartners({
...filters,
page: 1,
pageSize: MAX_PARTNERS_TO_EXPORT,
programId,
});
const formattedPartners = formatPartnersForExport(partners, columns);
return new Response(convertToCSV(formattedPartners), {
headers: {
"Content-Type": "text/csv",
"Content-Disposition": "attachment",
},
});
},
{
requiredPlan: [
"business",
"business extra",
"business max",
"business plus",
"advanced",
"enterprise",
],
},
);