From 7f7ff7d9042f489388223699a6c588f840fbfe46 Mon Sep 17 00:00:00 2001 From: Vegard Kyrkjedelen Hovland Date: Wed, 1 Oct 2025 17:06:23 +0200 Subject: [PATCH 1/5] feat: :sparkles: Add interviews and interviewHandler table --- db/tables/applications.ts | 2 ++ db/tables/interviews.ts | 46 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 db/tables/interviews.ts diff --git a/db/tables/applications.ts b/db/tables/applications.ts index 1082ed2..ac4af53 100644 --- a/db/tables/applications.ts +++ b/db/tables/applications.ts @@ -4,6 +4,7 @@ import { date, integer, serial, text } from "drizzle-orm/pg-core"; import { teamsTable } from "@/db/tables/teams"; import { fieldsOfStudyTable } from "./fields-of-study"; +import { interviewsTable } from "./interviews"; export const gendersEnum = mainSchema.enum("gender", [ "female", @@ -81,5 +82,6 @@ export const assistantApplicationsRelations = relations( fields: [assistantApplicationsTable.id], references: [applicationsTable.id], }), + interview: one(interviewsTable), }), ); diff --git a/db/tables/interviews.ts b/db/tables/interviews.ts new file mode 100644 index 0000000..5e4d0cd --- /dev/null +++ b/db/tables/interviews.ts @@ -0,0 +1,46 @@ +import { assistantApplicationsTable } from "@/db/tables/applications"; +import { mainSchema } from "@/db/tables/schema"; +import { teamUsersTable } from "@/db/tables/users"; +import { relations } from "drizzle-orm"; +import { primaryKey } from "drizzle-orm/pg-core"; +import { integer, json, serial } from "drizzle-orm/pg-core"; + +export const interviewsTable = mainSchema.table("interviews", { + id: serial("id").primaryKey(), + applicationId: integer("applicationId") + .notNull() + .references(() => assistantApplicationsTable.id), + interviewAnswers: json("interviewAnswers"), +}); + +export const interviewsRelations = relations(interviewsTable, ({ one }) => ({ + department: one(assistantApplicationsTable, { + fields: [interviewsTable.applicationId], + references: [assistantApplicationsTable.id], + }), +})); + +export const interviewHoldersTable = mainSchema.table("interviewHolders", { + interviewId: integer("integerId") + .notNull() + .references(() => interviewsTable.id), + interviewHolderId: integer("interviewHolderId") + .notNull() + .references(() => teamUsersTable.id), +}, (table) => ({ + compositePrimaryKey: primaryKey({columns: [table.interviewId, table.interviewHolderId]}) +})); + +export const interviewHoldersRelations = relations( + interviewHoldersTable, + ({ one }) => ({ + interview: one(interviewsTable, { + fields: [interviewHoldersTable.interviewId], + references: [interviewsTable.id], + }), + interviewHolder: one(teamUsersTable, { + fields: [interviewHoldersTable.interviewHolderId], + references: [teamUsersTable.id], + }), + }), +); From f12a663d030a287a7dd2c98a43af4e6f636868be Mon Sep 17 00:00:00 2001 From: Vegard Kyrkjedelen Hovland Date: Mon, 6 Oct 2025 16:47:32 +0200 Subject: [PATCH 2/5] feat: :sparkles: Add interview-schemas table --- db/tables/interview-schemas.ts | 13 +++++++++++++ db/tables/interviews.ts | 8 +++++++- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 db/tables/interview-schemas.ts diff --git a/db/tables/interview-schemas.ts b/db/tables/interview-schemas.ts new file mode 100644 index 0000000..84a5b6f --- /dev/null +++ b/db/tables/interview-schemas.ts @@ -0,0 +1,13 @@ +import { serial, json } from "drizzle-orm/pg-core"; +import { mainSchema } from "./schema"; +import { interviewsTable } from "./interviews"; +import { relations } from "drizzle-orm"; + +export const interviewSchemasTable = mainSchema.table("interviewSchemas", { + id: serial("id").primaryKey(), + jsonSchema: json("jsonSchema").notNull(), // used to validate corresponding interviews interviewAnswers +}); + +export const interviewsRelations = relations(interviewsTable, ({ many }) => ({ + interviews: many(interviewsTable) +})); \ No newline at end of file diff --git a/db/tables/interviews.ts b/db/tables/interviews.ts index 5e4d0cd..2b25adc 100644 --- a/db/tables/interviews.ts +++ b/db/tables/interviews.ts @@ -4,13 +4,15 @@ import { teamUsersTable } from "@/db/tables/users"; import { relations } from "drizzle-orm"; import { primaryKey } from "drizzle-orm/pg-core"; import { integer, json, serial } from "drizzle-orm/pg-core"; +import { interviewSchemasTable } from "./interview-schemas"; export const interviewsTable = mainSchema.table("interviews", { id: serial("id").primaryKey(), applicationId: integer("applicationId") .notNull() .references(() => assistantApplicationsTable.id), - interviewAnswers: json("interviewAnswers"), + interviewSchemaId: integer("interviewSchemaId").notNull().references(() => interviewSchemasTable.id), + interviewAnswers: json("interviewAnswers").notNull(), }); export const interviewsRelations = relations(interviewsTable, ({ one }) => ({ @@ -18,6 +20,10 @@ export const interviewsRelations = relations(interviewsTable, ({ one }) => ({ fields: [interviewsTable.applicationId], references: [assistantApplicationsTable.id], }), + interviewSchema: one(interviewSchemasTable, { + fields: [interviewsTable.interviewSchemaId], + references: [interviewSchemasTable.id], + }) })); export const interviewHoldersTable = mainSchema.table("interviewHolders", { From 9ac468a5fb829a0079f06e6362090b61b5da505d Mon Sep 17 00:00:00 2001 From: Vegard Kyrkjedelen Hovland Date: Wed, 8 Oct 2025 17:03:24 +0200 Subject: [PATCH 3/5] feat: :sparkles: Add new fields to interview --- db/tables/applications.ts | 1 + db/tables/interviews.ts | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/db/tables/applications.ts b/db/tables/applications.ts index ac4af53..b375563 100644 --- a/db/tables/applications.ts +++ b/db/tables/applications.ts @@ -38,6 +38,7 @@ export const applicationsRelations = relations( references: [assistantApplicationsTable.id], }), teamApplication: many(teamApplicationsTable), + interview: many(interviewsTable), }), ); diff --git a/db/tables/interviews.ts b/db/tables/interviews.ts index 2b25adc..277a852 100644 --- a/db/tables/interviews.ts +++ b/db/tables/interviews.ts @@ -3,7 +3,7 @@ import { mainSchema } from "@/db/tables/schema"; import { teamUsersTable } from "@/db/tables/users"; import { relations } from "drizzle-orm"; import { primaryKey } from "drizzle-orm/pg-core"; -import { integer, json, serial } from "drizzle-orm/pg-core"; +import { integer, json, serial, boolean, timestamp } from "drizzle-orm/pg-core"; import { interviewSchemasTable } from "./interview-schemas"; export const interviewsTable = mainSchema.table("interviews", { @@ -12,7 +12,10 @@ export const interviewsTable = mainSchema.table("interviews", { .notNull() .references(() => assistantApplicationsTable.id), interviewSchemaId: integer("interviewSchemaId").notNull().references(() => interviewSchemasTable.id), - interviewAnswers: json("interviewAnswers").notNull(), + interviewAnswers: json("interviewAnswers"), + isCancelled: boolean("isCancelled").notNull(), + plannedTime: timestamp("plannedTime").notNull(), + finishedTime: timestamp("timeFinished") }); export const interviewsRelations = relations(interviewsTable, ({ one }) => ({ From 59a721ea7e05cc1855b49fd7815078f6dafa388f Mon Sep 17 00:00:00 2001 From: Vegard Kyrkjedelen Hovland Date: Wed, 8 Oct 2025 17:12:04 +0200 Subject: [PATCH 4/5] style: :rotating_light: vf-320 Fix biome problems --- db/tables/interview-schemas.ts | 14 ++++++------- db/tables/interviews.ts | 36 +++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/db/tables/interview-schemas.ts b/db/tables/interview-schemas.ts index 84a5b6f..8954405 100644 --- a/db/tables/interview-schemas.ts +++ b/db/tables/interview-schemas.ts @@ -1,13 +1,13 @@ -import { serial, json } from "drizzle-orm/pg-core"; -import { mainSchema } from "./schema"; -import { interviewsTable } from "./interviews"; import { relations } from "drizzle-orm"; +import { json, serial } from "drizzle-orm/pg-core"; +import { interviewsTable } from "./interviews"; +import { mainSchema } from "./schema"; export const interviewSchemasTable = mainSchema.table("interviewSchemas", { - id: serial("id").primaryKey(), - jsonSchema: json("jsonSchema").notNull(), // used to validate corresponding interviews interviewAnswers + id: serial("id").primaryKey(), + jsonSchema: json("jsonSchema").notNull(), // used to validate corresponding interviews interviewAnswers }); export const interviewsRelations = relations(interviewsTable, ({ many }) => ({ - interviews: many(interviewsTable) -})); \ No newline at end of file + interviews: many(interviewsTable), +})); diff --git a/db/tables/interviews.ts b/db/tables/interviews.ts index 277a852..f05ab59 100644 --- a/db/tables/interviews.ts +++ b/db/tables/interviews.ts @@ -3,7 +3,7 @@ import { mainSchema } from "@/db/tables/schema"; import { teamUsersTable } from "@/db/tables/users"; import { relations } from "drizzle-orm"; import { primaryKey } from "drizzle-orm/pg-core"; -import { integer, json, serial, boolean, timestamp } from "drizzle-orm/pg-core"; +import { boolean, integer, json, serial, timestamp } from "drizzle-orm/pg-core"; import { interviewSchemasTable } from "./interview-schemas"; export const interviewsTable = mainSchema.table("interviews", { @@ -11,11 +11,13 @@ export const interviewsTable = mainSchema.table("interviews", { applicationId: integer("applicationId") .notNull() .references(() => assistantApplicationsTable.id), - interviewSchemaId: integer("interviewSchemaId").notNull().references(() => interviewSchemasTable.id), + interviewSchemaId: integer("interviewSchemaId") + .notNull() + .references(() => interviewSchemasTable.id), interviewAnswers: json("interviewAnswers"), isCancelled: boolean("isCancelled").notNull(), plannedTime: timestamp("plannedTime").notNull(), - finishedTime: timestamp("timeFinished") + finishedTime: timestamp("timeFinished"), }); export const interviewsRelations = relations(interviewsTable, ({ one }) => ({ @@ -26,19 +28,25 @@ export const interviewsRelations = relations(interviewsTable, ({ one }) => ({ interviewSchema: one(interviewSchemasTable, { fields: [interviewsTable.interviewSchemaId], references: [interviewSchemasTable.id], - }) + }), })); -export const interviewHoldersTable = mainSchema.table("interviewHolders", { - interviewId: integer("integerId") - .notNull() - .references(() => interviewsTable.id), - interviewHolderId: integer("interviewHolderId") - .notNull() - .references(() => teamUsersTable.id), -}, (table) => ({ - compositePrimaryKey: primaryKey({columns: [table.interviewId, table.interviewHolderId]}) -})); +export const interviewHoldersTable = mainSchema.table( + "interviewHolders", + { + interviewId: integer("integerId") + .notNull() + .references(() => interviewsTable.id), + interviewHolderId: integer("interviewHolderId") + .notNull() + .references(() => teamUsersTable.id), + }, + (table) => ({ + compositePrimaryKey: primaryKey({ + columns: [table.interviewId, table.interviewHolderId], + }), + }), +); export const interviewHoldersRelations = relations( interviewHoldersTable, From 6690088cfac4da211856cd201544358441e45c5d Mon Sep 17 00:00:00 2001 From: Vegard Kyrkjedelen Hovland Date: Wed, 8 Oct 2025 17:26:13 +0200 Subject: [PATCH 5/5] fix: :bug: vf-320 Fixed a bug where the interviewScemasRelations was defined wrong --- db/tables/interview-schemas.ts | 13 ++++++++----- db/tables/interviews.ts | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/db/tables/interview-schemas.ts b/db/tables/interview-schemas.ts index 8954405..9e97344 100644 --- a/db/tables/interview-schemas.ts +++ b/db/tables/interview-schemas.ts @@ -1,13 +1,16 @@ +import { interviewsTable } from "@/db/tables/interviews"; +import { mainSchema } from "@/db/tables/schema"; import { relations } from "drizzle-orm"; import { json, serial } from "drizzle-orm/pg-core"; -import { interviewsTable } from "./interviews"; -import { mainSchema } from "./schema"; export const interviewSchemasTable = mainSchema.table("interviewSchemas", { id: serial("id").primaryKey(), jsonSchema: json("jsonSchema").notNull(), // used to validate corresponding interviews interviewAnswers }); -export const interviewsRelations = relations(interviewsTable, ({ many }) => ({ - interviews: many(interviewsTable), -})); +export const interviewScemasRelations = relations( + interviewSchemasTable, + ({ many }) => ({ + interviews: many(interviewsTable), + }), +); diff --git a/db/tables/interviews.ts b/db/tables/interviews.ts index f05ab59..3cdc0ab 100644 --- a/db/tables/interviews.ts +++ b/db/tables/interviews.ts @@ -1,10 +1,10 @@ import { assistantApplicationsTable } from "@/db/tables/applications"; +import { interviewSchemasTable } from "@/db/tables/interview-schemas"; import { mainSchema } from "@/db/tables/schema"; import { teamUsersTable } from "@/db/tables/users"; import { relations } from "drizzle-orm"; import { primaryKey } from "drizzle-orm/pg-core"; import { boolean, integer, json, serial, timestamp } from "drizzle-orm/pg-core"; -import { interviewSchemasTable } from "./interview-schemas"; export const interviewsTable = mainSchema.table("interviews", { id: serial("id").primaryKey(),