From 0bf9d420489751fa3cc088de94c21ba5a2cfe76d Mon Sep 17 00:00:00 2001 From: abiyasa05 Date: Sun, 4 Aug 2024 21:00:16 +0700 Subject: [PATCH 01/18] update: users(change datatype) --- apps/backend/src/drizzle/schema/permissions.ts | 6 +++--- .../src/drizzle/schema/permissionsToRoles.ts | 6 +++--- .../src/drizzle/schema/permissionsToUsers.ts | 6 +++--- apps/backend/src/drizzle/schema/roles.ts | 6 +++--- apps/backend/src/drizzle/schema/rolesToUsers.ts | 6 +++--- apps/backend/src/drizzle/schema/users.ts | 17 +++++++++++------ 6 files changed, 26 insertions(+), 21 deletions(-) diff --git a/apps/backend/src/drizzle/schema/permissions.ts b/apps/backend/src/drizzle/schema/permissions.ts index f4a2461..90b13ba 100644 --- a/apps/backend/src/drizzle/schema/permissions.ts +++ b/apps/backend/src/drizzle/schema/permissions.ts @@ -5,13 +5,13 @@ import { permissionsToUsers } from "./permissionsToUsers"; import { permissionsToRoles } from "./permissionsToRoles"; export const permissionsSchema = pgTable("permissions", { - id: text("id") + id: varchar("id", { length: 50 }) .primaryKey() .$defaultFn(() => createId()), code: varchar("code", { length: 50 }).notNull().unique(), description: varchar("description", { length: 255 }), - createdAt: timestamp("created_at").defaultNow(), - updatedAt: timestamp("updated_at").defaultNow(), + createdAt: timestamp("createdAt").defaultNow(), + updatedAt: timestamp("updatedAt").defaultNow(), }); export const permissionsRelations = relations( diff --git a/apps/backend/src/drizzle/schema/permissionsToRoles.ts b/apps/backend/src/drizzle/schema/permissionsToRoles.ts index ddce625..72ead8c 100644 --- a/apps/backend/src/drizzle/schema/permissionsToRoles.ts +++ b/apps/backend/src/drizzle/schema/permissionsToRoles.ts @@ -1,4 +1,4 @@ -import { pgTable, primaryKey, text } from "drizzle-orm/pg-core"; +import { pgTable, primaryKey, varchar } from "drizzle-orm/pg-core"; import { permissionsSchema } from "./permissions"; import { relations } from "drizzle-orm"; import { rolesSchema } from "./roles"; @@ -6,10 +6,10 @@ import { rolesSchema } from "./roles"; export const permissionsToRoles = pgTable( "permissions_to_roles", { - roleId: text("roleId") + roleId: varchar("roleId", { length: 50 }) .notNull() .references(() => rolesSchema.id), - permissionId: text("permissionId") + permissionId: varchar("permissionId", { length: 50 }) .notNull() .references(() => permissionsSchema.id), }, diff --git a/apps/backend/src/drizzle/schema/permissionsToUsers.ts b/apps/backend/src/drizzle/schema/permissionsToUsers.ts index 110b433..117c030 100644 --- a/apps/backend/src/drizzle/schema/permissionsToUsers.ts +++ b/apps/backend/src/drizzle/schema/permissionsToUsers.ts @@ -1,4 +1,4 @@ -import { pgTable, primaryKey, text } from "drizzle-orm/pg-core"; +import { pgTable, primaryKey, varchar } from "drizzle-orm/pg-core"; import { users } from "./users"; import { permissionsSchema } from "./permissions"; import { relations } from "drizzle-orm"; @@ -6,10 +6,10 @@ import { relations } from "drizzle-orm"; export const permissionsToUsers = pgTable( "permissions_to_users", { - userId: text("userId") + userId: varchar("userId", { length: 50 }) .notNull() .references(() => users.id), - permissionId: text("permissionId") + permissionId: varchar("permissionId", { length: 50 }) .notNull() .references(() => permissionsSchema.id), }, diff --git a/apps/backend/src/drizzle/schema/roles.ts b/apps/backend/src/drizzle/schema/roles.ts index 6b8bfe5..61e585d 100644 --- a/apps/backend/src/drizzle/schema/roles.ts +++ b/apps/backend/src/drizzle/schema/roles.ts @@ -4,14 +4,14 @@ import { pgTable, text, timestamp, varchar } from "drizzle-orm/pg-core"; import { permissionsToRoles } from "./permissionsToRoles"; export const rolesSchema = pgTable("roles", { - id: text("id") + id: varchar("id", { length: 50 }) .primaryKey() .$defaultFn(() => createId()), code: varchar("code", { length: 50 }).notNull().unique(), name: varchar("name", { length: 255 }).notNull(), description: varchar("description", { length: 255 }), - createdAt: timestamp("created_at").defaultNow(), - updatedAt: timestamp("updated_at").defaultNow(), + createdAt: timestamp("createdAt").defaultNow(), + updatedAt: timestamp("updatedAt").defaultNow(), }); export const rolesRelations = relations(rolesSchema, ({ many }) => ({ diff --git a/apps/backend/src/drizzle/schema/rolesToUsers.ts b/apps/backend/src/drizzle/schema/rolesToUsers.ts index dcf422c..396cda4 100644 --- a/apps/backend/src/drizzle/schema/rolesToUsers.ts +++ b/apps/backend/src/drizzle/schema/rolesToUsers.ts @@ -1,4 +1,4 @@ -import { pgTable, primaryKey, text } from "drizzle-orm/pg-core"; +import { pgTable, primaryKey, varchar } from "drizzle-orm/pg-core"; import { users } from "./users"; import { relations } from "drizzle-orm"; import { rolesSchema } from "./roles"; @@ -6,10 +6,10 @@ import { rolesSchema } from "./roles"; export const rolesToUsers = pgTable( "roles_to_users", { - userId: text("userId") + userId: varchar("userId", { length: 50 }) .notNull() .references(() => users.id), - roleId: text("roleId") + roleId: varchar("roleId", { length: 50 }) .notNull() .references(() => rolesSchema.id), }, diff --git a/apps/backend/src/drizzle/schema/users.ts b/apps/backend/src/drizzle/schema/users.ts index af91337..0574af0 100644 --- a/apps/backend/src/drizzle/schema/users.ts +++ b/apps/backend/src/drizzle/schema/users.ts @@ -9,22 +9,27 @@ import { } from "drizzle-orm/pg-core"; import { permissionsToUsers } from "./permissionsToUsers"; import { rolesToUsers } from "./rolesToUsers"; +import { respondents } from "./respondents"; export const users = pgTable("users", { - id: text("id") + id: varchar("id", { length: 50 }) .primaryKey() .$defaultFn(() => createId()), name: varchar("name", { length: 255 }).notNull(), username: varchar("username").notNull().unique(), email: varchar("email"), password: text("password").notNull(), - isEnabled: boolean("is_enable").default(true), - createdAt: timestamp("created_at", { mode: "date" }).defaultNow(), - updatedAt: timestamp("updated_at", { mode: "date" }).defaultNow(), - deletedAt: timestamp("deleted_at", { mode: "date" }), + isEnabled: boolean("isEnabled").default(true), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), + deletedAt: timestamp("deletedAt", { mode: "date" }), }); -export const usersRelations = relations(users, ({ many }) => ({ +export const usersRelations = relations(users, ({ many, one}) => ({ permissionsToUsers: many(permissionsToUsers), rolesToUsers: many(rolesToUsers), + respondent: one(respondents, { + fields: [users.id], + references: [respondents.userId], + }), })); From a47373097c07d973e061899e8bad5ab2e0485a5d Mon Sep 17 00:00:00 2001 From: abiyasa05 Date: Sun, 4 Aug 2024 21:02:24 +0700 Subject: [PATCH 02/18] create: respondents schema --- .../backend/src/drizzle/schema/respondents.ts | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 apps/backend/src/drizzle/schema/respondents.ts diff --git a/apps/backend/src/drizzle/schema/respondents.ts b/apps/backend/src/drizzle/schema/respondents.ts new file mode 100644 index 0000000..631a923 --- /dev/null +++ b/apps/backend/src/drizzle/schema/respondents.ts @@ -0,0 +1,26 @@ +import { createId } from "@paralleldrive/cuid2"; +import { pgTable, text, timestamp, varchar } from "drizzle-orm/pg-core"; +import { relations } from "drizzle-orm"; +import { users } from "./users"; + +export const respondents = pgTable("respondents", { + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + companyName: varchar("companyName").notNull(), + position: varchar("position").notNull(), + workExperience: varchar("workExperience").notNull(), + address: text("address").notNull(), + phoneNumber: varchar("phoneNumber", { length: 13 }).notNull(), + 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 }) => ({ + user: one(users, { + fields: [respondents.userId], + references: [users.id], + }), +})); \ No newline at end of file From 252148011ed1720e75274fe0628b1880492dc197 Mon Sep 17 00:00:00 2001 From: percyfikri Date: Sun, 4 Aug 2024 21:09:18 +0700 Subject: [PATCH 03/18] create : aspects, subAspects schema --- apps/backend/src/drizzle/schema/aspects.ts | 16 ++++++++++++++++ apps/backend/src/drizzle/schema/subAspects.ts | 18 ++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 apps/backend/src/drizzle/schema/aspects.ts create mode 100644 apps/backend/src/drizzle/schema/subAspects.ts diff --git a/apps/backend/src/drizzle/schema/aspects.ts b/apps/backend/src/drizzle/schema/aspects.ts new file mode 100644 index 0000000..e8137dd --- /dev/null +++ b/apps/backend/src/drizzle/schema/aspects.ts @@ -0,0 +1,16 @@ +import { createId } from "@paralleldrive/cuid2"; +import { + pgTable, + timestamp, + varchar, +} from "drizzle-orm/pg-core"; + +export const aspects = pgTable("aspects", { + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + name: varchar("name", { length: 255 }).notNull(), + createdAt: timestamp("created_at", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updated_at", { mode: "date" }).defaultNow(), + deletedAt: timestamp("deleted_at", { mode: "date" }), +}); diff --git a/apps/backend/src/drizzle/schema/subAspects.ts b/apps/backend/src/drizzle/schema/subAspects.ts new file mode 100644 index 0000000..fd142c5 --- /dev/null +++ b/apps/backend/src/drizzle/schema/subAspects.ts @@ -0,0 +1,18 @@ +import { createId } from "@paralleldrive/cuid2"; +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) +}); From 1af996376cb16088f15923dca5ca0187238889d1 Mon Sep 17 00:00:00 2001 From: Sukma Gladys Date: Sun, 4 Aug 2024 21:10:40 +0700 Subject: [PATCH 04/18] create: questions schema --- apps/backend/src/drizzle/schema/questions.ts | 21 ++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 apps/backend/src/drizzle/schema/questions.ts diff --git a/apps/backend/src/drizzle/schema/questions.ts b/apps/backend/src/drizzle/schema/questions.ts new file mode 100644 index 0000000..3bc582d --- /dev/null +++ b/apps/backend/src/drizzle/schema/questions.ts @@ -0,0 +1,21 @@ +import { createId } from "@paralleldrive/cuid2"; +import { + boolean, + pgTable, + text, + timestamp, + varchar, +} from "drizzle-orm/pg-core"; +import { subAspects } from "./subAspects" + +export const questions = pgTable("questions", { + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + question: text("question"), + needFile: boolean("needFile").default(false), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), + deletedAt: timestamp("deletedAt", { mode: "date" }), + subAspectId: varchar("subAspectId").references(() => subAspects.id), +}); \ No newline at end of file From b192bb57bab00b3412fbb7c1cde99b773f722508 Mon Sep 17 00:00:00 2001 From: percyfikri Date: Sun, 4 Aug 2024 21:18:49 +0700 Subject: [PATCH 05/18] update : aspects schema (rename coloumn) --- apps/backend/src/drizzle/schema/aspects.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/backend/src/drizzle/schema/aspects.ts b/apps/backend/src/drizzle/schema/aspects.ts index e8137dd..f5df23c 100644 --- a/apps/backend/src/drizzle/schema/aspects.ts +++ b/apps/backend/src/drizzle/schema/aspects.ts @@ -10,7 +10,7 @@ export const aspects = pgTable("aspects", { .primaryKey() .$defaultFn(() => createId()), name: varchar("name", { length: 255 }).notNull(), - createdAt: timestamp("created_at", { mode: "date" }).defaultNow(), - updatedAt: timestamp("updated_at", { mode: "date" }).defaultNow(), - deletedAt: timestamp("deleted_at", { mode: "date" }), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), + deletedAt: timestamp("deletedAt", { mode: "date" }), }); From 4f2bba31d4f14822b8cb84820e412e3de0c3ef55 Mon Sep 17 00:00:00 2001 From: falendikategar Date: Sun, 4 Aug 2024 21:24:51 +0700 Subject: [PATCH 06/18] create: options, answers, and answerRevisions schema --- .../src/drizzle/schema/answerRevisions.ts | 24 +++++++++++++++++ apps/backend/src/drizzle/schema/answers.ts | 26 +++++++++++++++++++ apps/backend/src/drizzle/schema/options.ts | 23 ++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 apps/backend/src/drizzle/schema/answerRevisions.ts create mode 100644 apps/backend/src/drizzle/schema/answers.ts create mode 100644 apps/backend/src/drizzle/schema/options.ts diff --git a/apps/backend/src/drizzle/schema/answerRevisions.ts b/apps/backend/src/drizzle/schema/answerRevisions.ts new file mode 100644 index 0000000..f0f80ec --- /dev/null +++ b/apps/backend/src/drizzle/schema/answerRevisions.ts @@ -0,0 +1,24 @@ +import { createId } from "@paralleldrive/cuid2"; + +import { + boolean, + pgTable, + text, + timestamp, + varchar, +} from "drizzle-orm/pg-core"; +import { options } from "./options"; +import { answers } from "./answers"; + +export const answerRevisions = pgTable("answer_revisions", { + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + answerId: varchar("answerId", { length: 50 }) + .references(() => answers.id), + newOptionId: varchar("newOptionId", { length: 50 }) + .references(() => options.id), + revisedBy: varchar("revisedBy").notNull(), + newValidationInformation: text("newValidationInformation").notNull(), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), +}); diff --git a/apps/backend/src/drizzle/schema/answers.ts b/apps/backend/src/drizzle/schema/answers.ts new file mode 100644 index 0000000..6a8ab6d --- /dev/null +++ b/apps/backend/src/drizzle/schema/answers.ts @@ -0,0 +1,26 @@ +import { createId } from "@paralleldrive/cuid2"; +import { relations } from "drizzle-orm"; +import { + boolean, + pgTable, + text, + timestamp, + varchar, +} from "drizzle-orm/pg-core"; +import { options } from "./options"; +// import { assessments } from "./assessments"; + +export const answers = pgTable("answers", { + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + optionId: varchar("optionId", { length: 50 }) + .references(() => options.id), + // assessmentId: varchar("assessmentId", { length: 50 }) + // .references(() => assessments.id), + isFlagged: boolean("isFlagged").default(false), + filename: varchar("filename"), + validationInformation: text("validationInformation").notNull(), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), +}); diff --git a/apps/backend/src/drizzle/schema/options.ts b/apps/backend/src/drizzle/schema/options.ts new file mode 100644 index 0000000..59df2b1 --- /dev/null +++ b/apps/backend/src/drizzle/schema/options.ts @@ -0,0 +1,23 @@ +import { createId } from "@paralleldrive/cuid2"; +import { relations } from "drizzle-orm"; +import { + integer, + pgTable, + text, + timestamp, + varchar, +} from "drizzle-orm/pg-core"; +import { questions } from "./questions"; + +export const options = pgTable("options", { + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + questionId: varchar("questionId", { length: 50 }) + .references(() => questions.id), + text: text("text").notNull(), + score: integer("score").notNull(), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), + deletedAt: timestamp("deletedAt", { mode: "date" }), +}); From 2dc22f50bee4b6a77d36e9ec38e7f6ad1b7d6c59 Mon Sep 17 00:00:00 2001 From: ferdiansyah666 Date: Sun, 4 Aug 2024 21:38:38 +0700 Subject: [PATCH 07/18] create: assessments schema --- .../backend/src/drizzle/schema/assessments.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 apps/backend/src/drizzle/schema/assessments.ts diff --git a/apps/backend/src/drizzle/schema/assessments.ts b/apps/backend/src/drizzle/schema/assessments.ts new file mode 100644 index 0000000..fea7a54 --- /dev/null +++ b/apps/backend/src/drizzle/schema/assessments.ts @@ -0,0 +1,22 @@ +import { createId } from "@paralleldrive/cuid2"; +import { pgEnum, pgTable, timestamp, varchar } from "drizzle-orm/pg-core"; +import { relations } from "drizzle-orm"; +import { respondents } from "./respondents"; + +const statusEnum = pgEnum("status", ["tertunda", "disetujui", "ditolak", "selesai"]); + +export const assessments = pgTable("assessments", { + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + respondentName: varchar("respondentName", { length: 255 }).notNull(), + status: statusEnum("status"), + reviewedBy: varchar("reviewedBy").notNull(), + validatedBy: varchar("validatedBy").notNull(), + validatedAt: timestamp("validatedAt", { mode: "date" }), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + respondentId: varchar("respondentId").references(() => respondents.id), +}); + +// Query Tools in PosgreSQL +// CREATE TYPE status AS ENUM ('tertunda', 'disetujui', 'ditolak', 'selesai'); \ No newline at end of file From 9c1cfc2a41dbcf30c33959403f274687d0d06db7 Mon Sep 17 00:00:00 2001 From: falendikategar Date: Sun, 4 Aug 2024 21:47:39 +0700 Subject: [PATCH 08/18] update: answers schema (Import Foreign Key) --- apps/backend/src/drizzle/schema/answers.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/backend/src/drizzle/schema/answers.ts b/apps/backend/src/drizzle/schema/answers.ts index 6a8ab6d..6f8bf5c 100644 --- a/apps/backend/src/drizzle/schema/answers.ts +++ b/apps/backend/src/drizzle/schema/answers.ts @@ -8,7 +8,7 @@ import { varchar, } from "drizzle-orm/pg-core"; import { options } from "./options"; -// import { assessments } from "./assessments"; +import { assessments } from "./assessments"; export const answers = pgTable("answers", { id: varchar("id", { length: 50 }) @@ -16,8 +16,8 @@ export const answers = pgTable("answers", { .$defaultFn(() => createId()), optionId: varchar("optionId", { length: 50 }) .references(() => options.id), - // assessmentId: varchar("assessmentId", { length: 50 }) - // .references(() => assessments.id), + assessmentId: varchar("assessmentId", { length: 50 }) + .references(() => assessments.id), isFlagged: boolean("isFlagged").default(false), filename: varchar("filename"), validationInformation: text("validationInformation").notNull(), From dd712ff061a24c2875bdf0c51b28ef2590dde7a1 Mon Sep 17 00:00:00 2001 From: percyfikri Date: Mon, 5 Aug 2024 18:51:17 +0700 Subject: [PATCH 09/18] 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 10/18] 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 11/18] 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 }) => ({ From 556763a4632190f7095ef96ea13e9090421357d4 Mon Sep 17 00:00:00 2001 From: ferdiansyah666 Date: Mon, 5 Aug 2024 21:19:04 +0700 Subject: [PATCH 12/18] update: assessments schema --- apps/backend/src/drizzle/schema/assessments.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/backend/src/drizzle/schema/assessments.ts b/apps/backend/src/drizzle/schema/assessments.ts index fea7a54..782308f 100644 --- a/apps/backend/src/drizzle/schema/assessments.ts +++ b/apps/backend/src/drizzle/schema/assessments.ts @@ -9,13 +9,12 @@ export const assessments = pgTable("assessments", { id: varchar("id", { length: 50 }) .primaryKey() .$defaultFn(() => createId()), - respondentName: varchar("respondentName", { length: 255 }).notNull(), + respondentId: varchar("respondentId").references(() => respondents.id), status: statusEnum("status"), reviewedBy: varchar("reviewedBy").notNull(), validatedBy: varchar("validatedBy").notNull(), validatedAt: timestamp("validatedAt", { mode: "date" }), - createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), - respondentId: varchar("respondentId").references(() => respondents.id), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), }); // Query Tools in PosgreSQL From a5e7cf4725ed2165bc71cbbb3774d349e124fde6 Mon Sep 17 00:00:00 2001 From: ferdiansyah666 Date: Mon, 5 Aug 2024 21:26:57 +0700 Subject: [PATCH 13/18] update: assessments schema --- apps/backend/src/drizzle/schema/assessments.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/backend/src/drizzle/schema/assessments.ts b/apps/backend/src/drizzle/schema/assessments.ts index 782308f..a2e8a12 100644 --- a/apps/backend/src/drizzle/schema/assessments.ts +++ b/apps/backend/src/drizzle/schema/assessments.ts @@ -16,6 +16,5 @@ export const assessments = pgTable("assessments", { validatedAt: timestamp("validatedAt", { mode: "date" }), createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), }); - // Query Tools in PosgreSQL // CREATE TYPE status AS ENUM ('tertunda', 'disetujui', 'ditolak', 'selesai'); \ No newline at end of file From 435a7e7b957b3cada5cae2d0ebd180e7b898acc1 Mon Sep 17 00:00:00 2001 From: ferdiansyah666 Date: Mon, 5 Aug 2024 21:40:41 +0700 Subject: [PATCH 14/18] update: move the fk column below id assessments --- apps/backend/src/drizzle/schema/assessments.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/backend/src/drizzle/schema/assessments.ts b/apps/backend/src/drizzle/schema/assessments.ts index a2e8a12..c757272 100644 --- a/apps/backend/src/drizzle/schema/assessments.ts +++ b/apps/backend/src/drizzle/schema/assessments.ts @@ -14,7 +14,8 @@ export const assessments = pgTable("assessments", { reviewedBy: varchar("reviewedBy").notNull(), validatedBy: varchar("validatedBy").notNull(), validatedAt: timestamp("validatedAt", { mode: "date" }), - createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + }); // Query Tools in PosgreSQL // CREATE TYPE status AS ENUM ('tertunda', 'disetujui', 'ditolak', 'selesai'); \ No newline at end of file From 9308a173a51e4fe722457d11d02f1aa938e3948a Mon Sep 17 00:00:00 2001 From: Fikri <108330221+percyfikri@users.noreply.github.com> Date: Tue, 6 Aug 2024 09:12:15 +0700 Subject: [PATCH 15/18] update: move the fk column below id question --- apps/backend/src/drizzle/schema/questions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/backend/src/drizzle/schema/questions.ts b/apps/backend/src/drizzle/schema/questions.ts index 3bc582d..a84ba99 100644 --- a/apps/backend/src/drizzle/schema/questions.ts +++ b/apps/backend/src/drizzle/schema/questions.ts @@ -12,10 +12,10 @@ export const questions = pgTable("questions", { id: varchar("id", { length: 50 }) .primaryKey() .$defaultFn(() => createId()), + subAspectId: varchar("subAspectId").references(() => subAspects.id), question: text("question"), needFile: boolean("needFile").default(false), createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), deletedAt: timestamp("deletedAt", { mode: "date" }), - subAspectId: varchar("subAspectId").references(() => subAspects.id), -}); \ No newline at end of file +}); From 418d91b0e6f72f3292949e40961541ee77251841 Mon Sep 17 00:00:00 2001 From: abiyasa05 Date: Wed, 7 Aug 2024 13:03:11 +0700 Subject: [PATCH 16/18] update: column createdAt and updateAt --- apps/backend/src/drizzle/schema/respondents.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/backend/src/drizzle/schema/respondents.ts b/apps/backend/src/drizzle/schema/respondents.ts index 2ec8b14..744ec4f 100644 --- a/apps/backend/src/drizzle/schema/respondents.ts +++ b/apps/backend/src/drizzle/schema/respondents.ts @@ -13,8 +13,8 @@ export const respondents = pgTable("respondents", { workExperience: varchar("workExperience").notNull(), address: text("address").notNull(), phoneNumber: varchar("phoneNumber", { length: 13 }).notNull(), - createdAt: timestamp("createdAt", { mode: "date" }), - updatedAt: timestamp("updatedAt", { mode: "date" }), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), deletedAt: timestamp("deletetAt", { mode: "date" }), }); From 0a895482adcba6ff2f1c92d06cf3189e71c7a516 Mon Sep 17 00:00:00 2001 From: ferdiansyah666 Date: Wed, 7 Aug 2024 14:36:09 +0700 Subject: [PATCH 17/18] update: add coloumn reviewedAt in assessments --- apps/backend/src/drizzle/schema/assessments.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/backend/src/drizzle/schema/assessments.ts b/apps/backend/src/drizzle/schema/assessments.ts index c757272..d72ca05 100644 --- a/apps/backend/src/drizzle/schema/assessments.ts +++ b/apps/backend/src/drizzle/schema/assessments.ts @@ -12,9 +12,10 @@ export const assessments = pgTable("assessments", { respondentId: varchar("respondentId").references(() => respondents.id), status: statusEnum("status"), reviewedBy: varchar("reviewedBy").notNull(), + reviewedAt: timestamp("reviewedAt", { mode: "date" }).defaultNow(), validatedBy: varchar("validatedBy").notNull(), validatedAt: timestamp("validatedAt", { mode: "date" }), - createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), }); // Query Tools in PosgreSQL From 7b33d3d940da54e187f75c3b1190f9e277e69827 Mon Sep 17 00:00:00 2001 From: ferdiansyah666 Date: Thu, 8 Aug 2024 14:01:46 +0700 Subject: [PATCH 18/18] update: delete notnull on coloumn reviewedBy --- apps/backend/src/drizzle/schema/assessments.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/backend/src/drizzle/schema/assessments.ts b/apps/backend/src/drizzle/schema/assessments.ts index d72ca05..44eb4ed 100644 --- a/apps/backend/src/drizzle/schema/assessments.ts +++ b/apps/backend/src/drizzle/schema/assessments.ts @@ -2,6 +2,7 @@ import { createId } from "@paralleldrive/cuid2"; import { pgEnum, pgTable, timestamp, varchar } from "drizzle-orm/pg-core"; import { relations } from "drizzle-orm"; import { respondents } from "./respondents"; +import { users } from "./users"; const statusEnum = pgEnum("status", ["tertunda", "disetujui", "ditolak", "selesai"]); @@ -11,8 +12,8 @@ export const assessments = pgTable("assessments", { .$defaultFn(() => createId()), respondentId: varchar("respondentId").references(() => respondents.id), status: statusEnum("status"), - reviewedBy: varchar("reviewedBy").notNull(), - reviewedAt: timestamp("reviewedAt", { mode: "date" }).defaultNow(), + reviewedBy: varchar("reviewedBy"), + reviewedAt: timestamp("reviewedAt", { mode: "date" }), validatedBy: varchar("validatedBy").notNull(), validatedAt: timestamp("validatedAt", { mode: "date" }), createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(),