diff --git a/db/tables/applications.ts b/db/tables/applications.ts index 1082ed2..b375563 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", @@ -37,6 +38,7 @@ export const applicationsRelations = relations( references: [assistantApplicationsTable.id], }), teamApplication: many(teamApplicationsTable), + interview: many(interviewsTable), }), ); @@ -81,5 +83,6 @@ export const assistantApplicationsRelations = relations( fields: [assistantApplicationsTable.id], references: [applicationsTable.id], }), + interview: one(interviewsTable), }), ); diff --git a/db/tables/interview-schemas.ts b/db/tables/interview-schemas.ts new file mode 100644 index 0000000..9e97344 --- /dev/null +++ b/db/tables/interview-schemas.ts @@ -0,0 +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"; + +export const interviewSchemasTable = mainSchema.table("interviewSchemas", { + id: serial("id").primaryKey(), + jsonSchema: json("jsonSchema").notNull(), // used to validate corresponding interviews interviewAnswers +}); + +export const interviewScemasRelations = relations( + interviewSchemasTable, + ({ many }) => ({ + interviews: many(interviewsTable), + }), +); diff --git a/db/tables/interviews.ts b/db/tables/interviews.ts new file mode 100644 index 0000000..3cdc0ab --- /dev/null +++ b/db/tables/interviews.ts @@ -0,0 +1,63 @@ +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"; + +export const interviewsTable = mainSchema.table("interviews", { + id: serial("id").primaryKey(), + applicationId: integer("applicationId") + .notNull() + .references(() => assistantApplicationsTable.id), + interviewSchemaId: integer("interviewSchemaId") + .notNull() + .references(() => interviewSchemasTable.id), + interviewAnswers: json("interviewAnswers"), + isCancelled: boolean("isCancelled").notNull(), + plannedTime: timestamp("plannedTime").notNull(), + finishedTime: timestamp("timeFinished"), +}); + +export const interviewsRelations = relations(interviewsTable, ({ one }) => ({ + department: one(assistantApplicationsTable, { + fields: [interviewsTable.applicationId], + references: [assistantApplicationsTable.id], + }), + 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 interviewHoldersRelations = relations( + interviewHoldersTable, + ({ one }) => ({ + interview: one(interviewsTable, { + fields: [interviewHoldersTable.interviewId], + references: [interviewsTable.id], + }), + interviewHolder: one(teamUsersTable, { + fields: [interviewHoldersTable.interviewHolderId], + references: [teamUsersTable.id], + }), + }), +);