Skip to content

Commit 98b2662

Browse files
authored
Merge pull request #84 from codegasms/fix/seeder-duplicate-key
Fix seeder inserting duplicate keys
2 parents 571a57e + 048d89a commit 98b2662

File tree

1 file changed

+43
-15
lines changed

1 file changed

+43
-15
lines changed

lib/seeder.ts

+43-15
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { db } from "@/db/drizzle";
2+
import { sql } from "drizzle-orm";
23
import {
34
users,
45
orgs,
@@ -9,6 +10,7 @@ import {
910
groups,
1011
groupMemberships,
1112
sessionTable,
13+
SelectUser,
1214
} from "@/db/schema";
1315
import { hashPassword } from "./password";
1416

@@ -45,6 +47,15 @@ const seedConfig = {
4547

4648
export async function seedDatabase(config = seedConfig) {
4749
try {
50+
// Check if database is already populated
51+
/*
52+
const isEmpty = await isDatabaseEmpty();
53+
if (!isEmpty) {
54+
console.log("Database already contains data. Skipping seed operation.");
55+
return false;
56+
}
57+
*/
58+
4859
// Create users
4960
const users = await createUsers(config.users);
5061
const orgs = await createOrganizations(config.organizations, users);
@@ -59,9 +70,9 @@ export async function seedDatabase(config = seedConfig) {
5970

6071
async function createUsers(userConfig: typeof seedConfig.users) {
6172
const createdUsers = {
62-
admins: [] as any[],
63-
organizers: [] as any[],
64-
members: [] as any[],
73+
admins: [] as SelectUser[],
74+
organizers: [] as SelectUser[],
75+
members: [] as SelectUser[],
6576
};
6677

6778
const hashedPassword = await hashPassword(userConfig.password);
@@ -114,7 +125,11 @@ async function createUsers(userConfig: typeof seedConfig.users) {
114125

115126
async function createOrganizations(
116127
orgConfig: typeof seedConfig.organizations,
117-
users: ReturnType<typeof createUsers> extends Promise<infer T> ? T : never,
128+
users: {
129+
admins: SelectUser[];
130+
organizers: SelectUser[];
131+
members: SelectUser[];
132+
}
118133
) {
119134
const createdOrgs = [];
120135

@@ -151,33 +166,40 @@ async function createOrganizations(
151166
return createdOrgs;
152167
}
153168

154-
async function createOrgMemberships(orgId: number, users: any) {
155-
const memberships = [
169+
async function createOrgMemberships(
170+
orgId: number,
171+
users: {
172+
admins: SelectUser[];
173+
organizers: SelectUser[];
174+
members: SelectUser[];
175+
}
176+
) {
177+
const membershipValues = [
156178
// Assign first admin as owner
157179
{
158180
userId: users.admins[0].id,
159181
orgId,
160182
role: "owner" as const,
161183
},
162184
// Assign organizers
163-
...users.organizers.map((user) => ({
185+
...users.organizers.map((user: SelectUser) => ({
164186
userId: user.id,
165187
orgId,
166188
role: "organizer" as const,
167189
})),
168190
// Assign members
169-
...users.members.map((user) => ({
191+
...users.members.map((user: SelectUser) => ({
170192
userId: user.id,
171193
orgId,
172194
role: "member" as const,
173195
})),
174196
];
175197

176-
await db.insert(memberships).values(memberships);
198+
await db.insert(memberships).values(membershipValues);
177199
}
178200

179201
async function createProblems(orgId: number, count: number) {
180-
const createdProblems = [];
202+
const createdProblems: Array<typeof problems.$inferSelect> = [];
181203

182204
for (let i = 0; i < count; i++) {
183205
const [problem] = await db
@@ -198,7 +220,7 @@ async function createProblems(orgId: number, count: number) {
198220

199221
async function createContests(
200222
orgId: number,
201-
problems: any[],
223+
problems: Array<typeof problems.$inferSelect>,
202224
contestConfig: typeof seedConfig.contests,
203225
) {
204226
const now = new Date();
@@ -225,6 +247,8 @@ async function createContests(
225247
),
226248
organizerId: orgId,
227249
organizerKind: "org",
250+
allowList: [], // Add missing required fields
251+
disallowList: [], // Add missing required fields
228252
})
229253
.returning();
230254

@@ -243,7 +267,11 @@ async function createContests(
243267

244268
async function createGroups(
245269
orgId: number,
246-
users: any,
270+
users: {
271+
admins: SelectUser[];
272+
organizers: SelectUser[];
273+
members: SelectUser[];
274+
},
247275
groupCount: number,
248276
membersPerGroup: number,
249277
) {
@@ -259,7 +287,7 @@ async function createGroups(
259287
.returning();
260288

261289
// Add random members to group
262-
const memberUsers = users.members.slice(0, membersPerGroup).map((user) => ({
290+
const memberUsers = users.members.slice(0, membersPerGroup).map((user: SelectUser) => ({
263291
groupId: group.id,
264292
userId: user.id,
265293
}));
@@ -291,6 +319,6 @@ export async function clearDatabase() {
291319
}
292320

293321
export async function isDatabaseEmpty() {
294-
const userCount = await db.select({ count: db.fn.count() }).from(users);
295-
return userCount[0].count === 0;
322+
const userCount = await db.select({ count: sql`count(*)` }).from(users);
323+
return parseInt(userCount[0].count as string) === 0;
296324
}

0 commit comments

Comments
 (0)