1#!/usr/bin/env node
2
32import { PrismaClient } from "@prisma/client";
33
34const WORKSPACE_ID = process.env.K6_WORKSPACE_ID || "load-ws";
35const USER_COUNT = parseInt(process.env.K6_USERS || "1000", 10);
36const PAGE_IDS = String(process.env.K6_PAGES || "")
37 .split(",")
38 .filter(Boolean);
39const pages =
40 PAGE_IDS.length > 0
41 ? PAGE_IDS
42 : Array.from({ length: 10 }, (_, i) => `load-p-${String(i).padStart(3, "0")}`);
43
44const prisma = new PrismaClient();
45
46function pad4(n) {
47 return String(n).padStart(4, "0");
48}
49
50async function main() {
51
52
53
54
55 const membership = await prisma.workspaceMember.count({ where: { workspaceId: WORKSPACE_ID } });
56 if (membership >= USER_COUNT) {
57 console.log(`already seeded (${membership} memberships in ${WORKSPACE_ID} ≥ ${USER_COUNT})`);
58 console.log(`workspace=${WORKSPACE_ID} pages=${pages.join(",")}`);
59 return;
60 }
61
62
63 const ws = await prisma.workspace.upsert({
64 where: { id: WORKSPACE_ID },
65 update: {},
66 create: {
67 id: WORKSPACE_ID,
68 name: "k6 Load (TASK-0091)",
69 slug: `k6-load-${WORKSPACE_ID}`,
70 settings: {},
71 },
72 });
73 if (!ws) throw new Error("workspace upsert failed");
74
75
76 for (const pageId of pages) {
77 await prisma.page.upsert({
78 where: { id: pageId },
79 update: {},
80 create: { id: pageId, workspaceId: WORKSPACE_ID, title: `k6 load page ${pageId}` },
81 });
82 }
83
84
85 const BATCH = 500;
86 let created = 0;
87 for (let start = 0; start < USER_COUNT; start += BATCH) {
88 const ids = [];
89 const users = [];
90 const members = [];
91 const grants = [];
92 for (let i = start; i < Math.min(start + BATCH, USER_COUNT); i += 1) {
93
94 const id = `k6-load-u-${pad4(i)}`;
95 ids.push(id);
96 users.push({ id, email: `${id}@factory.local`, name: `k6 Load ${pad4(i + 1)}` });
97 members.push({ workspaceId: WORKSPACE_ID, userId: id, role: "MEMBER" });
98
99
100
101 grants.push({
102 workspaceId: WORKSPACE_ID,
103 granteeType: "user",
104 granteeId: id,
105 resourceType: "workspace",
106 resourceId: WORKSPACE_ID,
107 level: "EDIT",
108 });
109 }
110 await prisma.$transaction([
111 ...users.map((u) => prisma.user.upsert({ where: { id: u.id }, update: {}, create: u })),
112 ...members.map((m) =>
113
114
115
116 prisma.workspaceMember.upsert({
117 where: { workspaceId_userId: { workspaceId: m.workspaceId, userId: m.userId } },
118 update: {},
119 create: m,
120 }),
121 ),
122 ...grants.map((g) =>
123 prisma.permission.upsert({
124 where: {
125 workspaceId_granteeType_granteeId_resourceType_resourceId: {
126 workspaceId: g.workspaceId,
127 granteeType: g.granteeType,
128 granteeId: g.granteeId,
129 resourceType: g.resourceType,
130 resourceId: g.resourceId,
131 },
132 },
133 update: {},
134 create: g,
135 }),
136 ),
137 ]);
138 created += ids.length;
139 process.stdout.write(` ${created}/${USER_COUNT}\r`);
140 }
141 console.log(`\nseeded ${created} load users in workspace ${WORKSPACE_ID}`);
142 console.log(`workspace=${WORKSPACE_ID} pages=${pages.join(",")}`);
143 console.log("run the suite with:");
144 console.log(` K6_WORKSPACE_ID=${WORKSPACE_ID} K6_PAGE_IDS=${pages.join(",")} pnpm --dir tests/performance realtime:1k`);
145}
146
147main()
148 .catch((err) => {
149 console.error(err);
150 process.exitCode = 1;
151 })
152 .finally(() => prisma.$disconnect());
153