Skip to content

Commit

Permalink
🌱 Add seeding script (#460)
Browse files Browse the repository at this point in the history
  • Loading branch information
nezouse committed May 8, 2024
1 parent 03220fd commit 712c0df
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 1 deletion.
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
"drizzle:migrate-test": "tsx -r dotenv/config ./src/drizzle/migrate.ts dotenv_config_path=.env.test",
"drizzle:studio": "drizzle-kit studio",
"drizzle:generate": "drizzle-kit generate:pg",
"drizzle:push": "drizzle-kit push:pg"
"drizzle:push": "drizzle-kit push:pg",
"drizzle:seed": "tsx -r dotenv/config ./src/drizzle/seed.ts dotenv_config_path=.env"
},
"dependencies": {
"@auth0/nextjs-auth0": "^3.5.0",
Expand Down Expand Up @@ -73,6 +74,7 @@
"zod": "^3.22.4"
},
"devDependencies": {
"@faker-js/faker": "^8.4.1",
"@ianvs/prettier-plugin-sort-imports": "^4.2.1",
"@playwright/test": "^1.43.1",
"@storybook/addon-essentials": "^7.6.17",
Expand Down
8 changes: 8 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

102 changes: 102 additions & 0 deletions src/drizzle/seed.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import { faker } from "@faker-js/faker";

import { categoryColors } from "@/types/CategoryColor";
import { addDays } from "@/lib/dates";

import { connection, db } from "./db";
import { Application, Category, Wave } from "./schema";

function getRandomWave(): typeof Wave.$inferInsert {
return {
name: faker.music.genre() + " Wave",
summary: faker.lorem.paragraph(10),
openStartDate: addDays(new Date(), 1),
denoisingStartDate: addDays(new Date(), 2),
assesmentStartDate: addDays(new Date(), 3),
closeDate: addDays(new Date(), 4),
};
}

function getRandomCategory(waveId: number): typeof Category.$inferInsert {
return {
waveId,
name: faker.commerce.productAdjective(),
color: faker.helpers.arrayElement(categoryColors),
description: faker.lorem.paragraph(),
};
}

interface RandomApplicationArgs {
categoryIds: Array<string>;
userIds: Array<string>;
waveId: number;
}

function getRandomApplication({
categoryIds,
userIds,
waveId,
}: RandomApplicationArgs): typeof Application.$inferInsert {
return {
draft: faker.datatype.boolean(),
name: faker.word.words({ count: { min: 1, max: 6 } }),
summary: faker.lorem.paragraph(10),
entityName: faker.company.name(),
email: faker.internet.email(),
duration: String(faker.number.int({ min: 30, max: 900 })),
budget: faker.number.int({ min: 1_000, max: 10_000_000 }),
categoryId: faker.helpers.arrayElement(categoryIds),

teamSummary: faker.lorem.paragraph(10),

idea: faker.lorem.paragraph(10),
reason: faker.lorem.paragraph(10),
state: faker.lorem.paragraph(10),
goals: faker.lorem.paragraph(10),
requirements: faker.lorem.paragraph(10),

tbd: faker.lorem.paragraph(10),

imageId: null,
waveId,
userId: faker.helpers.arrayElement(userIds),
};
}

async function main() {
await db.delete(Wave);
const userIds = (await db.query.User.findMany()).map((user) => user.id);

const waves = await db
.insert(Wave)
.values(
faker.helpers.multiple(getRandomWave, { count: { min: 2, max: 10 } }),
)
.returning();
const waveIds = waves.map((wave) => wave.id);

for (const waveId of waveIds) {
const categories = await db
.insert(Category)
.values(
faker.helpers.multiple(() => getRandomCategory(waveId), {
count: { min: 1, max: 5 },
}),
)
.returning({ id: Category.id });
const categoryIds = categories.map((category) => category.id);

await db
.insert(Application)
.values(
faker.helpers.multiple(
() => getRandomApplication({ categoryIds, userIds, waveId }),
{ count: { min: 5, max: 2000 } },
),
);
}
}

main().then(() => {
connection.end();
});

0 comments on commit 712c0df

Please sign in to comment.