From dd712ff061a24c2875bdf0c51b28ef2590dde7a1 Mon Sep 17 00:00:00 2001 From: percyfikri Date: Mon, 5 Aug 2024 18:51:17 +0700 Subject: [PATCH 1/3] create : seeder of aspects and subAspects --- apps/backend/src/drizzle/seed.ts | 4 + .../src/drizzle/seeds/aspectsSeeder.ts | 69 +++++ .../src/drizzle/seeds/subAspectsSeeder.ts | 273 ++++++++++++++++++ 3 files changed, 346 insertions(+) create mode 100644 apps/backend/src/drizzle/seeds/aspectsSeeder.ts create mode 100644 apps/backend/src/drizzle/seeds/subAspectsSeeder.ts diff --git a/apps/backend/src/drizzle/seed.ts b/apps/backend/src/drizzle/seed.ts index 305be1b..bb98014 100644 --- a/apps/backend/src/drizzle/seed.ts +++ b/apps/backend/src/drizzle/seed.ts @@ -2,6 +2,8 @@ import db from "."; import permissionSeeder from "./seeds/permissionSeeder"; import roleSeeder from "./seeds/rolesSeeder"; import userSeeder from "./seeds/userSeeder"; +import aspectsSeeder from "./seeds/aspectsSeeder"; +import subAspectsSeeder from "./seeds/subAspectsSeeder"; (async () => { console.time("Done seeding"); @@ -9,6 +11,8 @@ import userSeeder from "./seeds/userSeeder"; await permissionSeeder(); await roleSeeder(); await userSeeder(); + await aspectsSeeder(); + await subAspectsSeeder(); })().then(() => { console.log("\n"); console.timeEnd("Done seeding"); diff --git a/apps/backend/src/drizzle/seeds/aspectsSeeder.ts b/apps/backend/src/drizzle/seeds/aspectsSeeder.ts new file mode 100644 index 0000000..0438d9d --- /dev/null +++ b/apps/backend/src/drizzle/seeds/aspectsSeeder.ts @@ -0,0 +1,69 @@ +import { aspects } from "../schema/aspects"; +import db from ".."; +import { eq } from "drizzle-orm"; + + +const aspectsSeeder = async () => { + const aspectsData: (typeof aspects.$inferInsert)[] = [ + { + name: "Tata Kelola", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + }, + { + name: "Identifikasi", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + }, + { + name: "Proteksi", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + }, + { + name: "Deteksi", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + }, + { + name: "Respon", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + }, + ]; + + console.log("Seeding aspects..."); + + for (let aspect of aspectsData) { + // Check if the aspect already exists + const existingAspect = await db + .select() + .from(aspects) + .where(eq(aspects.name, aspect.name)) + .limit(1); + + if (existingAspect.length === 0) { + // If the aspect does not exist, insert it + const insertedAspect = ( + await db + .insert(aspects) + .values(aspect) + .onConflictDoNothing() + .returning() + )[0]; + + if (insertedAspect) { + console.log(`Aspect ${aspect.name} created`); + } + } else { + console.log(`Aspect ${aspect.name} already exists`); + } + } +}; + +export default aspectsSeeder; diff --git a/apps/backend/src/drizzle/seeds/subAspectsSeeder.ts b/apps/backend/src/drizzle/seeds/subAspectsSeeder.ts new file mode 100644 index 0000000..7c082d2 --- /dev/null +++ b/apps/backend/src/drizzle/seeds/subAspectsSeeder.ts @@ -0,0 +1,273 @@ +import { subAspects } from "../schema/subAspects"; +import db from ".."; +import { aspects } from "../schema/aspects"; +import { eq, and } from "drizzle-orm"; + +const subAspectSeeder = async () => { + const subAspectsData: (typeof subAspects.$inferInsert & { aspectName: string })[] = [ + /////// Aspect 1 + { + name: "Kesadaran", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Tata Kelola", + }, + { + name: "Audit", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Tata Kelola", + }, + { + name: "Kontrol", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Tata Kelola", + }, + { + name: "Pemenuhan", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Tata Kelola", + }, + { + name: "Kebijakan", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Tata Kelola", + }, + { + name: "Proses", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Tata Kelola", + }, + /////// Aspect 2 + { + name: "Manajemen Aset", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Identifikasi", + }, + { + name: "Inventaris", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Identifikasi", + }, + { + name: "Manajemen Risiko", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Identifikasi", + }, + { + name: "Prioritas", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Identifikasi", + }, + { + name: "Pelaporan", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Identifikasi", + }, + { + name: "Klasifikasi", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Identifikasi", + }, + /////// Aspect 3 + { + name: "Jaringan", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Proteksi", + }, + { + name: "Aplikasi", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Proteksi", + }, + { + name: "Pengguna", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Proteksi", + }, + { + name: "Manajemen Identitas dan Aset", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Proteksi", + }, + { + name: "Cloud", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Proteksi", + }, + { + name: "Data", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Proteksi", + }, + /////// Aspect 4 + { + name: "Perubahan", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Deteksi", + }, + { + name: "Monitor", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Deteksi", + }, + { + name: "Peringatan", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Deteksi", + }, + { + name: "Pemberitahuan", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Deteksi", + }, + { + name: "Intelijen", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Deteksi", + }, + { + name: "Pelaporan", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Deteksi", + }, + /////// Aspect 5 + { + name: "Penahanan", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Respon", + }, + { + name: "Penanggulangan", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Respon", + }, + { + name: "Pemulihan", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Respon", + }, + { + name: "Kegiatan Paska Insiden", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Respon", + }, + { + name: "Pelaporan", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Respon", + }, + ]; + + console.log("Seeding subAspects..."); + + const memoizedAspectIds: Map = new Map(); + + for (let subAspect of subAspectsData) { + // Check if aspect ID is already memoized + if (!memoizedAspectIds.has(subAspect.aspectName)) { + const aspect = ( + await db + .select({ id: aspects.id }) + .from(aspects) + .where(eq(aspects.name, subAspect.aspectName)) + )[0]; + + if (!aspect) { + throw new Error(`Aspect ${subAspect.aspectName} does not exist in the database`); + } + + memoizedAspectIds.set(subAspect.aspectName, aspect.id); + } + + const aspectId = memoizedAspectIds.get(subAspect.aspectName)!; + + // Check if the subAspect already exists + const existingSubAspect = await db + .select() + .from(subAspects) + .where(and(eq(subAspects.name, subAspect.name), eq(subAspects.aspectId, aspectId))) + .limit(1); + + if (existingSubAspect.length === 0) { + // If the subAspect does not exist, insert it + const insertedSubAspect = ( + await db + .insert(subAspects) + .values({ + name: subAspect.name, + createdAt: subAspect.createdAt, + updatedAt: subAspect.updatedAt, + deletedAt: subAspect.deletedAt, + aspectId: aspectId + }) + .onConflictDoNothing() + .returning() + )[0]; + + if (insertedSubAspect) { + console.log(`SubAspect ${subAspect.name} created and linked to aspect ${subAspect.aspectName}`); + } + } else { + console.log(`SubAspect ${subAspect.name} already exists`); + } + } +}; + +export default subAspectSeeder; From 0c8dbba12c1fc50f8e195f521c75671589e54c7f Mon Sep 17 00:00:00 2001 From: percyfikri Date: Mon, 5 Aug 2024 20:28:37 +0700 Subject: [PATCH 2/3] update: move the fk column below id --- apps/backend/src/drizzle/schema/subAspects.ts | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/apps/backend/src/drizzle/schema/subAspects.ts b/apps/backend/src/drizzle/schema/subAspects.ts index fd142c5..e1df105 100644 --- a/apps/backend/src/drizzle/schema/subAspects.ts +++ b/apps/backend/src/drizzle/schema/subAspects.ts @@ -1,18 +1,14 @@ import { createId } from "@paralleldrive/cuid2"; -import { - pgTable, - timestamp, - varchar, -} from "drizzle-orm/pg-core"; +import { pgTable, timestamp, varchar } from "drizzle-orm/pg-core"; import { aspects } from "./aspects"; export const subAspects = pgTable("sub_aspects", { - id: varchar("id", {length: 50}) - .primaryKey() - .$defaultFn(() => createId()), - name: varchar("name", { length: 255 }).notNull(), - createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), - updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), - deletedAt: timestamp("deletedAt", { mode: "date" }), - aspectId: varchar("aspectId").references(() => aspects.id) + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + aspectId: varchar("aspectId").references(() => aspects.id), + name: varchar("name", { length: 255 }).notNull(), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), + deletedAt: timestamp("deletedAt", { mode: "date" }), }); From 96dd94f83f2072ddcb67c6265ad5f2398a815541 Mon Sep 17 00:00:00 2001 From: abiyasa05 Date: Mon, 5 Aug 2024 20:32:37 +0700 Subject: [PATCH 3/3] update: respondents schema --- apps/backend/src/drizzle/schema/respondents.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/backend/src/drizzle/schema/respondents.ts b/apps/backend/src/drizzle/schema/respondents.ts index 631a923..2ec8b14 100644 --- a/apps/backend/src/drizzle/schema/respondents.ts +++ b/apps/backend/src/drizzle/schema/respondents.ts @@ -7,6 +7,7 @@ export const respondents = pgTable("respondents", { id: varchar("id", { length: 50 }) .primaryKey() .$defaultFn(() => createId()), + userId: varchar('userId').references(() => users.id).unique(), companyName: varchar("companyName").notNull(), position: varchar("position").notNull(), workExperience: varchar("workExperience").notNull(), @@ -15,7 +16,6 @@ export const respondents = pgTable("respondents", { createdAt: timestamp("createdAt", { mode: "date" }), updatedAt: timestamp("updatedAt", { mode: "date" }), deletedAt: timestamp("deletetAt", { mode: "date" }), - userId: varchar('userId').references(() => users.id).unique(), }); export const respondentsRelations = relations(respondents, ({ one }) => ({