From b933938eba04c783dbb95e232b7c034139a23cb3 Mon Sep 17 00:00:00 2001 From: TobiasH05 Date: Mon, 31 Mar 2025 16:49:24 +0200 Subject: [PATCH 1/9] docs: :memo: added the new tables to diagram --- database-diagram.md | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/database-diagram.md b/database-diagram.md index 13fd15f..b489584 100644 --- a/database-diagram.md +++ b/database-diagram.md @@ -58,7 +58,7 @@ erDiagram int id PK int userId FK int interviewId FK - int admissionPeriodId FK + int semesterId FK string yearOfStudy int substitute int doublePosition @@ -71,7 +71,6 @@ erDiagram string specialNeeds string language string preferredSchool - } PRIORITY_DAY{ int id PK @@ -81,6 +80,28 @@ erDiagram int thursday int friday } + SEMESTER{ + int id PK + int lastSemester FK + date startDate + date endDate + int departmentId FK + string name + } + SCHOOL{ + int id PK + int departmentId FK + string name + string contactPersonName + string contactPersonPhoneNumber + string contactPersonEMail + boolean isInternational + } + SCHOOL_SEMESTER_USER{ + int school FK + int semester FK + int user FK + } USER ||--o{ EXPENSE : "pays" USER ||--o{ FIELD_OF_STUDY : studys VEKTOR_DEPARTMENT ||--o{ FIELD_OF_STUDY : oversee @@ -91,4 +112,11 @@ erDiagram USER ||--|| PRIORITY_DAY : wants TEAM }o--o{ ASSISTENT_APPLICATION : interest VEKTOR_DEPARTMENT ||--O{ TEAM : belongsTo + SEMESTER ||--o| SEMESTER : lastSemester + SEMESTER }|--|| VEKTOR_DEPARTMENT : department + SCHOOL }|--|| VEKTOR_DEPARTMENT : department + SEMESTER }o--|| ASSISTENT_APPLICATION : admissionPeriod + SCHOOL_SEMESTER_USER ||--o{ SCHOOL : schoolSemesterUser + SCHOOL_SEMESTER_USER ||--o{ SEMESTER : schoolSemesterUser + SCHOOL_SEMESTER_USER ||--o{ USER : shcoolSemesterUser ``` From 900bfd62ea6e0922f13b94b6cb642658d4803d20 Mon Sep 17 00:00:00 2001 From: TobiasH05 Date: Mon, 31 Mar 2025 18:04:47 +0200 Subject: [PATCH 2/9] feat: :sparkles: Added base tables for schools and semesters --- database-diagram.md | 13 +++++++------ db/tables/schools.ts | 21 +++++++++++++++++++++ db/tables/semesters.ts | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 db/tables/schools.ts create mode 100644 db/tables/semesters.ts diff --git a/database-diagram.md b/database-diagram.md index b489584..120d796 100644 --- a/database-diagram.md +++ b/database-diagram.md @@ -7,9 +7,9 @@ title: Database prototype erDiagram USER { int id PK + int fieldOfStudyId FK string firstName string lastName - int fieldOfStudyId FK } EXPENSE { int id PK @@ -82,10 +82,12 @@ erDiagram } SEMESTER{ int id PK - int lastSemester FK - date startDate - date endDate + int lastSemesterId FK int departmentId FK + date semesterStartDate + date semesterEndDate + date recruitmentStartDate + date recruitmentEndDate string name } SCHOOL{ @@ -94,7 +96,7 @@ erDiagram string name string contactPersonName string contactPersonPhoneNumber - string contactPersonEMail + string contactPersonEmail boolean isInternational } SCHOOL_SEMESTER_USER{ @@ -112,7 +114,6 @@ erDiagram USER ||--|| PRIORITY_DAY : wants TEAM }o--o{ ASSISTENT_APPLICATION : interest VEKTOR_DEPARTMENT ||--O{ TEAM : belongsTo - SEMESTER ||--o| SEMESTER : lastSemester SEMESTER }|--|| VEKTOR_DEPARTMENT : department SCHOOL }|--|| VEKTOR_DEPARTMENT : department SEMESTER }o--|| ASSISTENT_APPLICATION : admissionPeriod diff --git a/db/tables/schools.ts b/db/tables/schools.ts new file mode 100644 index 0000000..117522c --- /dev/null +++ b/db/tables/schools.ts @@ -0,0 +1,21 @@ +import { relations } from "drizzle-orm"; +import { boolean, integer, serial, text } from "drizzle-orm/pg-core"; +import { departmentsTable } from "./departments"; +import { mainSchema } from "./schema"; + +export const schoolsTable = mainSchema.table("schools", { + id: serial("id").primaryKey(), + departmentId: integer("departmentId").references(() => departmentsTable.id), + name: text("name").notNull(), + contactPersonName: text("contactPersonName").notNull(), + contactPersonPhoneNumber: text("contactPersonPhoneNumber").notNull(), + contactPersonEmail: text("contactpersonEmail").notNull(), + isInternational: boolean("isInternational").notNull(), +}); + +export const schoolsRelations = relations(schoolsTable, ({ one }) => ({ + department: one(departmentsTable, { + fields: [schoolsTable.departmentId], + references: [departmentsTable.id], + }), +})); diff --git a/db/tables/semesters.ts b/db/tables/semesters.ts new file mode 100644 index 0000000..9ad3dac --- /dev/null +++ b/db/tables/semesters.ts @@ -0,0 +1,37 @@ +import { relations } from "drizzle-orm"; +import { date, foreignKey, integer, serial, text } from "drizzle-orm/pg-core"; +import { departmentsTable } from "./departments"; +import { mainSchema } from "./schema"; + +export const semestersTable = mainSchema.table( + "semesters", + { + id: serial("id").primaryKey(), + lastSemesterId: integer("lastSemesterId"), + semesterStartDate: date("semesterStartDate").notNull(), + semesterEndDate: date("semesterEndDate").notNull(), + recruitmentStartDate: date("recruitmentStartDate").notNull(), + recruitmentEndDate: date("recruitmentEndDate").notNull(), + departmentId: integer("departmentId").notNull().references(() => departmentsTable.id), + name: text("name").notNull(), + }, + (table) => { + return { + parentReference: foreignKey({ + columns: [table.departmentId], + foreignColumns: [table.id], + }), + }; + }, +); + +export const semestersRelations = relations(semestersTable, ({ one }) => ({ + department: one(departmentsTable, { + fields: [semestersTable.departmentId], + references: [departmentsTable.id], + }), + semester: one(semestersTable, { + fields: [semestersTable.lastSemesterId], + references: [semestersTable.id], + }), +})); From 71c45d5713ee1b483eb6637513fbf0c77fc30507 Mon Sep 17 00:00:00 2001 From: TobiasH05 Date: Thu, 3 Apr 2025 11:37:35 +0200 Subject: [PATCH 3/9] feat: :sparkles: Finished tables for semesters and schools --- db/tables/semesters.ts | 16 +++++---- lib/lib.ts | 4 +++ src/request-handling/schools.ts | 31 +++++++++++++++++ src/request-handling/semesters.ts | 42 +++++++++++++++++++++++ src/request-handling/team-applications.ts | 8 ++--- src/response-handling/schools.ts | 10 ++++++ src/response-handling/semesters.ts | 10 ++++++ src/routers/schools.ts | 4 +++ src/routers/semesters.ts | 4 +++ 9 files changed, 118 insertions(+), 11 deletions(-) create mode 100644 src/request-handling/schools.ts create mode 100644 src/request-handling/semesters.ts create mode 100644 src/response-handling/schools.ts create mode 100644 src/response-handling/semesters.ts create mode 100644 src/routers/schools.ts create mode 100644 src/routers/semesters.ts diff --git a/db/tables/semesters.ts b/db/tables/semesters.ts index 9ad3dac..ae17495 100644 --- a/db/tables/semesters.ts +++ b/db/tables/semesters.ts @@ -10,9 +10,11 @@ export const semestersTable = mainSchema.table( lastSemesterId: integer("lastSemesterId"), semesterStartDate: date("semesterStartDate").notNull(), semesterEndDate: date("semesterEndDate").notNull(), - recruitmentStartDate: date("recruitmentStartDate").notNull(), - recruitmentEndDate: date("recruitmentEndDate").notNull(), - departmentId: integer("departmentId").notNull().references(() => departmentsTable.id), + recruitmentStartDate: date("recruitmentStartDate").notNull(), + recruitmentEndDate: date("recruitmentEndDate").notNull(), + departmentId: integer("departmentId") + .notNull() + .references(() => departmentsTable.id), name: text("name").notNull(), }, (table) => { @@ -30,8 +32,8 @@ export const semestersRelations = relations(semestersTable, ({ one }) => ({ fields: [semestersTable.departmentId], references: [departmentsTable.id], }), - semester: one(semestersTable, { - fields: [semestersTable.lastSemesterId], - references: [semestersTable.id], - }), + semester: one(semestersTable, { + fields: [semestersTable.lastSemesterId], + references: [semestersTable.id], + }), })); diff --git a/lib/lib.ts b/lib/lib.ts index cc87441..1c91475 100644 --- a/lib/lib.ts +++ b/lib/lib.ts @@ -7,3 +7,7 @@ export function zodEnumFromObjKeys( const [firstKey, ...otherKeys] = Object.keys(obj) as K[]; return z.enum([firstKey, ...otherKeys]); } +const phoneNumberRegex = /^\d{8}$/; +export const phoneNumberParser = z + .string() + .regex(phoneNumberRegex, "Phone number must be 8 digits"); diff --git a/src/request-handling/schools.ts b/src/request-handling/schools.ts new file mode 100644 index 0000000..d766b99 --- /dev/null +++ b/src/request-handling/schools.ts @@ -0,0 +1,31 @@ +import { schoolsTable } from "@/db/tables/schools"; +import { phoneNumberParser } from "@/lib/lib"; +import { createInsertSchema } from "drizzle-zod"; +import { z } from "zod"; +import { serialIdParser } from "./common"; + +export const schoolRequestParser = z + .object({ + id: serialIdParser.describe("Id of school"), + departmentId: serialIdParser.describe("Id of corresponding department"), + name: z.string().describe("Name of school"), + contactPersonName: z.string().describe("Name of contact person on school"), + contactPersonPhoneNumber: phoneNumberParser.describe( + "Phone number of contact person", + ), + contactPersonEmail: z.string().describe("Email of contact person"), + isInternational: z + .boolean() + .describe("Whether the school is international or not"), + }) + .strict(); + +export const schoolRequestToInsertParser = schoolRequestParser + .extend({ + name: schoolRequestParser.shape.name.trim(), + contactPersonName: schoolRequestParser.shape.contactPersonName.trim(), + contactPersonEmail: schoolRequestParser.shape.contactPersonEmail.trim(), + }) + .pipe(createInsertSchema(schoolsTable).strict().readonly()); + +export type NewSchool = z.infer; diff --git a/src/request-handling/semesters.ts b/src/request-handling/semesters.ts new file mode 100644 index 0000000..9fda4d3 --- /dev/null +++ b/src/request-handling/semesters.ts @@ -0,0 +1,42 @@ +import { semestersTable } from "@/db/tables/semesters"; +import { timeStringParser } from "@/lib/time-parsers"; +import { createInsertSchema } from "drizzle-zod"; +import { z } from "zod"; +import { serialIdParser } from "./common"; + +export const semesterRequestParser = z + .object({ + id: serialIdParser.describe("Id of semester"), + lastSemesterId: serialIdParser.describe("Id of last semester"), + semesterStartDate: timeStringParser.describe("Date of semester start"), + semesterEndDate: timeStringParser.describe("Date of semester end"), + recruitmentStartDate: timeStringParser.describe( + "Date of recruitment period start", + ), + recruitmentEndDate: timeStringParser.describe( + "Date of recruitment period end", + ), + departmentId: serialIdParser.describe("Id of corresponding department"), + name: z.string().describe("Name of semester"), + }) + .strict(); + +export const semesterRequestToInsertParser = semesterRequestParser + .extend({ + name: semesterRequestParser.shape.name.trim(), + semesterStartDate: semesterRequestParser.shape.semesterStartDate.pipe( + z.coerce.date(), + ), + semesterEndDate: semesterRequestParser.shape.semesterEndDate.pipe( + z.coerce.date(), + ), + recruitmentStartDate: semesterRequestParser.shape.recruitmentStartDate.pipe( + z.coerce.date(), + ), + recruitmentEndDate: semesterRequestParser.shape.recruitmentEndDate.pipe( + z.coerce.date(), + ), + }) + .pipe(createInsertSchema(semestersTable).strict().readonly()); + +export type NewSemester = z.infer; diff --git a/src/request-handling/team-applications.ts b/src/request-handling/team-applications.ts index 352629c..c320137 100644 --- a/src/request-handling/team-applications.ts +++ b/src/request-handling/team-applications.ts @@ -1,5 +1,6 @@ import { teamApplicationsTable } from "@/db/tables/team-applications"; import { MAX_TEXT_LENGTH } from "@/lib/global-variables"; +import { phoneNumberParser } from "@/lib/lib"; import { serialIdParser } from "@/src/request-handling/common"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; @@ -27,10 +28,9 @@ export const teamApplicationParser = z.object({ .string() .max(MAX_TEXT_LENGTH) .describe("The biography of the user applying for a team"), - phonenumber: z - .string() - .regex(/^\d{8}$/, "Phone number must be 8 digits") - .describe("The phonenumber of the user applying for a team"), + phonenumber: phoneNumberParser.describe( + "The phonenumber of the user applying for a team", + ), }); export const teamApplicationToInsertParser = teamApplicationParser diff --git a/src/response-handling/schools.ts b/src/response-handling/schools.ts new file mode 100644 index 0000000..72bbf00 --- /dev/null +++ b/src/response-handling/schools.ts @@ -0,0 +1,10 @@ +import { schoolsTable } from "@/db/tables/schools"; +import { createSelectSchema } from "drizzle-zod"; +import type { z } from "zod"; + +export const schoolsSelectSchema = createSelectSchema(schoolsTable) + .strict() + .readonly(); + +export type School = z.infer; +export type SchoolsKey = School["id"]; diff --git a/src/response-handling/semesters.ts b/src/response-handling/semesters.ts new file mode 100644 index 0000000..50bdd94 --- /dev/null +++ b/src/response-handling/semesters.ts @@ -0,0 +1,10 @@ +import { semestersTable } from "@/db/tables/semesters"; +import { createSelectSchema } from "drizzle-zod"; +import type { z } from "zod"; + +export const semestersSelectSchema = createSelectSchema(semestersTable) + .strict() + .readonly(); + +export type Semester = z.infer; +export type SemesterKey = Semester["id"]; diff --git a/src/routers/schools.ts b/src/routers/schools.ts new file mode 100644 index 0000000..c4e726a --- /dev/null +++ b/src/routers/schools.ts @@ -0,0 +1,4 @@ +import { Router, json } from "express"; + +export const schoolsRouter = Router(); +schoolsRouter.use(json()); diff --git a/src/routers/semesters.ts b/src/routers/semesters.ts new file mode 100644 index 0000000..f7e385d --- /dev/null +++ b/src/routers/semesters.ts @@ -0,0 +1,4 @@ +import { Router, json } from "express"; + +export const semestersRouter = Router(); +semestersRouter.use(json()); From fced5c0c6ae9da9f413a0c0407eb559618a50ef5 Mon Sep 17 00:00:00 2001 From: TobiasH05 Date: Thu, 10 Apr 2025 10:56:37 +0200 Subject: [PATCH 4/9] fix: :bug: fixed semester relations --- db/tables/departments.ts | 2 ++ db/tables/semesters.ts | 51 ++++++++++++++++++++-------------------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/db/tables/departments.ts b/db/tables/departments.ts index 95beeef..dd8eda6 100644 --- a/db/tables/departments.ts +++ b/db/tables/departments.ts @@ -3,6 +3,7 @@ import { mainSchema } from "@/db/tables/schema"; import { teamsTable } from "@/db/tables/teams"; import { relations } from "drizzle-orm"; import { serial } from "drizzle-orm/pg-core"; +import { semestersTable } from "./semesters"; export const citiesEnum = mainSchema.enum("city", [ "Trondheim", @@ -19,4 +20,5 @@ export const departmentsTable = mainSchema.table("departments", { export const departmentsRelations = relations(departmentsTable, ({ many }) => ({ fieldsOfStudy: many(fieldsOfStudyTable), teams: many(teamsTable), + semesters: many(semestersTable), })); diff --git a/db/tables/semesters.ts b/db/tables/semesters.ts index ae17495..fc1ddec 100644 --- a/db/tables/semesters.ts +++ b/db/tables/semesters.ts @@ -1,39 +1,40 @@ import { relations } from "drizzle-orm"; -import { date, foreignKey, integer, serial, text } from "drizzle-orm/pg-core"; +import { + type AnyPgColumn, + date, + integer, + serial, + text, +} from "drizzle-orm/pg-core"; import { departmentsTable } from "./departments"; import { mainSchema } from "./schema"; -export const semestersTable = mainSchema.table( - "semesters", - { - id: serial("id").primaryKey(), - lastSemesterId: integer("lastSemesterId"), - semesterStartDate: date("semesterStartDate").notNull(), - semesterEndDate: date("semesterEndDate").notNull(), - recruitmentStartDate: date("recruitmentStartDate").notNull(), - recruitmentEndDate: date("recruitmentEndDate").notNull(), - departmentId: integer("departmentId") - .notNull() - .references(() => departmentsTable.id), - name: text("name").notNull(), - }, - (table) => { - return { - parentReference: foreignKey({ - columns: [table.departmentId], - foreignColumns: [table.id], - }), - }; - }, -); +export const semestersTable = mainSchema.table("semesters", { + id: serial("id").primaryKey(), + lastSemesterId: integer("lastSemesterId").references( + (): AnyPgColumn => semestersTable.id, + ), + semesterStartDate: date("semesterStartDate").notNull(), + semesterEndDate: date("semesterEndDate").notNull(), + recruitmentStartDate: date("recruitmentStartDate").notNull(), + recruitmentEndDate: date("recruitmentEndDate").notNull(), + departmentId: integer("departmentId") + .notNull() + .references(() => departmentsTable.id), + name: text("name").notNull(), +}); export const semestersRelations = relations(semestersTable, ({ one }) => ({ department: one(departmentsTable, { fields: [semestersTable.departmentId], references: [departmentsTable.id], }), - semester: one(semestersTable, { + lastSemester: one(semestersTable, { fields: [semestersTable.lastSemesterId], references: [semestersTable.id], }), + nextSemester: one(semestersTable, { + fields: [semestersTable.id], + references: [semestersTable.lastSemesterId], + }), })); From 84802e7a44fc07d986f7d42e50a0b10563770f65 Mon Sep 17 00:00:00 2001 From: TobiasH05 Date: Thu, 24 Apr 2025 10:40:07 +0200 Subject: [PATCH 5/9] feat: :sparkles: Added tables for relations between schools and semester tables --- database-diagram.md | 16 +++++++++---- db/tables/school-semester-assistant.ts | 33 ++++++++++++++++++++++++++ db/tables/semesters.ts | 1 + db/tables/team-semester-user.ts | 30 +++++++++++++++++++++++ db/tables/teams.ts | 4 ++-- 5 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 db/tables/school-semester-assistant.ts create mode 100644 db/tables/team-semester-user.ts diff --git a/database-diagram.md b/database-diagram.md index 120d796..86adad1 100644 --- a/database-diagram.md +++ b/database-diagram.md @@ -99,11 +99,16 @@ erDiagram string contactPersonEmail boolean isInternational } - SCHOOL_SEMESTER_USER{ + SCHOOL_SEMESTER_ASSISTANT{ int school FK int semester FK int user FK } + TEAM_SEMESTER_USER{ + int team FK + int semester FK + int user FK + } USER ||--o{ EXPENSE : "pays" USER ||--o{ FIELD_OF_STUDY : studys VEKTOR_DEPARTMENT ||--o{ FIELD_OF_STUDY : oversee @@ -117,7 +122,10 @@ erDiagram SEMESTER }|--|| VEKTOR_DEPARTMENT : department SCHOOL }|--|| VEKTOR_DEPARTMENT : department SEMESTER }o--|| ASSISTENT_APPLICATION : admissionPeriod - SCHOOL_SEMESTER_USER ||--o{ SCHOOL : schoolSemesterUser - SCHOOL_SEMESTER_USER ||--o{ SEMESTER : schoolSemesterUser - SCHOOL_SEMESTER_USER ||--o{ USER : shcoolSemesterUser + SCHOOL_SEMESTER_ASSISTANT ||--o{ SCHOOL : schoolSemesterAssistant + SCHOOL_SEMESTER_ASSISTANT ||--o{ SEMESTER : schoolSemesterAssistant + SCHOOL_SEMESTER_ASSISTANT ||--o{ USER : shcoolSemesterAssistant + TEAM_SEMESTER_USER ||--o{ TEAM : teamSemesterUser + TEAM_SEMESTER_USER ||--o{ SEMESTER : teamSemesterUser + TEAM_SEMESTER_USER ||--o{ USER : teamSemesterUser ``` diff --git a/db/tables/school-semester-assistant.ts b/db/tables/school-semester-assistant.ts new file mode 100644 index 0000000..5df90bd --- /dev/null +++ b/db/tables/school-semester-assistant.ts @@ -0,0 +1,33 @@ +import { relations } from "drizzle-orm"; +import { integer } from "drizzle-orm/pg-core"; +import { mainSchema } from "./schema"; +import { schoolsTable } from "./schools"; +import { semestersTable } from "./semesters"; +import { assistantUsersTable } from "./users"; + +export const schoolSemesterAssistantsTable = mainSchema.table( + "schoolSemesterAssistant", + { + schoolId: integer("schoolId").references(() => schoolsTable.id), + semesterId: integer("semesterId").references(() => semestersTable.id), + assistantUserId: integer("userId").references(() => assistantUsersTable.id), + }, +); + +export const schoolSemesterAssistantsRelations = relations( + schoolSemesterAssistantsTable, + ({ one }) => ({ + school: one(schoolsTable, { + fields: [schoolSemesterAssistantsTable.schoolId], + references: [schoolsTable.id], + }), + semester: one(semestersTable, { + fields: [schoolSemesterAssistantsTable.semesterId], + references: [semestersTable.id], + }), + assistantUser: one(assistantUsersTable, { + fields: [schoolSemesterAssistantsTable.assistantUserId], + references: [assistantUsersTable.id], + }), + }), +); diff --git a/db/tables/semesters.ts b/db/tables/semesters.ts index fc1ddec..df541be 100644 --- a/db/tables/semesters.ts +++ b/db/tables/semesters.ts @@ -37,4 +37,5 @@ export const semestersRelations = relations(semestersTable, ({ one }) => ({ fields: [semestersTable.id], references: [semestersTable.lastSemesterId], }), + })); diff --git a/db/tables/team-semester-user.ts b/db/tables/team-semester-user.ts new file mode 100644 index 0000000..86de272 --- /dev/null +++ b/db/tables/team-semester-user.ts @@ -0,0 +1,30 @@ +import { relations } from "drizzle-orm"; +import { integer } from "drizzle-orm/pg-core"; +import { mainSchema } from "./schema"; +import { semestersTable } from "./semesters"; +import { teamsTable } from "./teams"; +import { teamUsersTable } from "./users"; + +export const teamSemesterUsersTable = mainSchema.table("teamSemesterUser", { + teamId: integer("teamId").references(() => teamsTable.id), + semesterId: integer("semesterId").references(() => semestersTable.id), + teamUserId: integer("teamUserId").references(() => teamUsersTable.id), +}); + +export const teamSemesterUsersRelations = relations( + teamSemesterUsersTable, + ({ one }) => ({ + team: one(teamsTable, { + fields: [teamSemesterUsersTable.teamId], + references: [teamsTable.id], + }), + semester: one(semestersTable, { + fields: [teamSemesterUsersTable.semesterId], + references: [semestersTable.id], + }), + teamUser: one(teamUsersTable, { + fields: [teamSemesterUsersTable.teamUserId], + references: [teamUsersTable.id], + }), + }), +); diff --git a/db/tables/teams.ts b/db/tables/teams.ts index 480caa7..86e4df6 100644 --- a/db/tables/teams.ts +++ b/db/tables/teams.ts @@ -1,10 +1,10 @@ import { teamApplicationsTable } from "@/db/tables/applications"; import { departmentsTable } from "@/db/tables/departments"; import { mainSchema } from "@/db/tables/schema"; -import { teamUsersTable } from "@/db/tables/users"; import { relations } from "drizzle-orm"; import { boolean, serial, text, timestamp } from "drizzle-orm/pg-core"; import { integer } from "drizzle-orm/pg-core"; +import { teamSemesterUsersTable } from "./team-semester-user"; export const teamsTable = mainSchema.table("teams", { id: serial("id").primaryKey(), @@ -26,5 +26,5 @@ export const teamRelations = relations(teamsTable, ({ one, many }) => ({ references: [departmentsTable.id], }), teamApplications: many(teamApplicationsTable), - teamMembers: many(teamUsersTable), + teamUsersInSemester: many(teamSemesterUsersTable), })); From f6eac9724c65c9a60259f6667e485540f0cbeaf1 Mon Sep 17 00:00:00 2001 From: TobiasH05 Date: Thu, 24 Apr 2025 11:07:22 +0200 Subject: [PATCH 6/9] feat: :sparkles: Added relations back to new tables --- db/tables/schools.ts | 4 +++- db/tables/semesters.ts | 7 +++++-- db/tables/users.ts | 6 +++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/db/tables/schools.ts b/db/tables/schools.ts index 117522c..2084e28 100644 --- a/db/tables/schools.ts +++ b/db/tables/schools.ts @@ -2,6 +2,7 @@ import { relations } from "drizzle-orm"; import { boolean, integer, serial, text } from "drizzle-orm/pg-core"; import { departmentsTable } from "./departments"; import { mainSchema } from "./schema"; +import { schoolSemesterAssistantsTable } from "./school-semester-assistant"; export const schoolsTable = mainSchema.table("schools", { id: serial("id").primaryKey(), @@ -13,9 +14,10 @@ export const schoolsTable = mainSchema.table("schools", { isInternational: boolean("isInternational").notNull(), }); -export const schoolsRelations = relations(schoolsTable, ({ one }) => ({ +export const schoolsRelations = relations(schoolsTable, ({ one, many }) => ({ department: one(departmentsTable, { fields: [schoolsTable.departmentId], references: [departmentsTable.id], }), + semesterAssistants: many(schoolSemesterAssistantsTable), })); diff --git a/db/tables/semesters.ts b/db/tables/semesters.ts index df541be..19f7799 100644 --- a/db/tables/semesters.ts +++ b/db/tables/semesters.ts @@ -8,6 +8,8 @@ import { } from "drizzle-orm/pg-core"; import { departmentsTable } from "./departments"; import { mainSchema } from "./schema"; +import { schoolSemesterAssistantsTable } from "./school-semester-assistant"; +import { teamSemesterUsersTable } from "./team-semester-user"; export const semestersTable = mainSchema.table("semesters", { id: serial("id").primaryKey(), @@ -24,7 +26,7 @@ export const semestersTable = mainSchema.table("semesters", { name: text("name").notNull(), }); -export const semestersRelations = relations(semestersTable, ({ one }) => ({ +export const semestersRelations = relations(semestersTable, ({ one, many }) => ({ department: one(departmentsTable, { fields: [semestersTable.departmentId], references: [departmentsTable.id], @@ -37,5 +39,6 @@ export const semestersRelations = relations(semestersTable, ({ one }) => ({ fields: [semestersTable.id], references: [semestersTable.lastSemesterId], }), - + schoolAssistants: many(schoolSemesterAssistantsTable), + teamUsers: many(teamSemesterUsersTable), })); diff --git a/db/tables/users.ts b/db/tables/users.ts index f0106ae..6ce280c 100644 --- a/db/tables/users.ts +++ b/db/tables/users.ts @@ -5,6 +5,8 @@ import { integer, serial, text } from "drizzle-orm/pg-core"; import { expensesTable } from "@/db/tables/expenses"; import { fieldsOfStudyTable } from "@/db/tables/fields-of-study"; import { teamsTable } from "@/db/tables/teams"; +import { schoolSemesterAssistantsTable } from "./school-semester-assistant"; +import { teamSemesterUsersTable } from "./team-semester-user"; export const usersTable = mainSchema.table("users", { id: serial("id").primaryKey(), @@ -54,10 +56,12 @@ export const assistantUsersTable = mainSchema.table("assistantUsers", { }); export const assistantUsersRelation = relations( assistantUsersTable, - ({ one }) => ({ + ({ one, many }) => ({ superUser: one(usersTable, { fields: [assistantUsersTable.id], references: [usersTable.id], }), + schoolSemesters: many(schoolSemesterAssistantsTable), + teamSemesters: many(teamSemesterUsersTable), }), ); From db0d8a6e6a5cb808d37efdbd795587ab276c3d4a Mon Sep 17 00:00:00 2001 From: TobiasH05 Date: Thu, 24 Apr 2025 11:10:08 +0200 Subject: [PATCH 7/9] style: :art: pnpm check --- db/tables/semesters.ts | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/db/tables/semesters.ts b/db/tables/semesters.ts index 19f7799..dc9e824 100644 --- a/db/tables/semesters.ts +++ b/db/tables/semesters.ts @@ -26,19 +26,22 @@ export const semestersTable = mainSchema.table("semesters", { name: text("name").notNull(), }); -export const semestersRelations = relations(semestersTable, ({ one, many }) => ({ - department: one(departmentsTable, { - fields: [semestersTable.departmentId], - references: [departmentsTable.id], +export const semestersRelations = relations( + semestersTable, + ({ one, many }) => ({ + department: one(departmentsTable, { + fields: [semestersTable.departmentId], + references: [departmentsTable.id], + }), + lastSemester: one(semestersTable, { + fields: [semestersTable.lastSemesterId], + references: [semestersTable.id], + }), + nextSemester: one(semestersTable, { + fields: [semestersTable.id], + references: [semestersTable.lastSemesterId], + }), + schoolAssistants: many(schoolSemesterAssistantsTable), + teamUsers: many(teamSemesterUsersTable), }), - lastSemester: one(semestersTable, { - fields: [semestersTable.lastSemesterId], - references: [semestersTable.id], - }), - nextSemester: one(semestersTable, { - fields: [semestersTable.id], - references: [semestersTable.lastSemesterId], - }), - schoolAssistants: many(schoolSemesterAssistantsTable), - teamUsers: many(teamSemesterUsersTable), -})); +); From c9fa54e86f5f8fc43ce040836e8a40f46a192b11 Mon Sep 17 00:00:00 2001 From: TobiasH05 Date: Thu, 24 Apr 2025 11:13:36 +0200 Subject: [PATCH 8/9] fix: :bug: Moved relation from assistant user to team user --- db/tables/users.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/tables/users.ts b/db/tables/users.ts index 6ce280c..2e28aed 100644 --- a/db/tables/users.ts +++ b/db/tables/users.ts @@ -38,7 +38,7 @@ export const teamUsersTable = mainSchema.table("teamUsers", { .references(() => teamsTable.id), username: text("username").notNull().unique(), }); -export const teamUsersRelations = relations(teamUsersTable, ({ one }) => ({ +export const teamUsersRelations = relations(teamUsersTable, ({ one, many }) => ({ superUser: one(usersTable, { fields: [teamUsersTable.id], references: [usersTable.id], @@ -47,6 +47,7 @@ export const teamUsersRelations = relations(teamUsersTable, ({ one }) => ({ fields: [teamUsersTable.teamId], references: [teamsTable.id], }), + teamSemesters: many(teamSemesterUsersTable), })); export const assistantUsersTable = mainSchema.table("assistantUsers", { @@ -62,6 +63,5 @@ export const assistantUsersRelation = relations( references: [usersTable.id], }), schoolSemesters: many(schoolSemesterAssistantsTable), - teamSemesters: many(teamSemesterUsersTable), }), ); From d4db70e1a97605943647d790af2cbe008144b368 Mon Sep 17 00:00:00 2001 From: TobiasH05 Date: Thu, 24 Apr 2025 11:14:01 +0200 Subject: [PATCH 9/9] docs: :art: pnpm check --- db/tables/users.ts | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/db/tables/users.ts b/db/tables/users.ts index 2e28aed..b0ba0ab 100644 --- a/db/tables/users.ts +++ b/db/tables/users.ts @@ -38,17 +38,20 @@ export const teamUsersTable = mainSchema.table("teamUsers", { .references(() => teamsTable.id), username: text("username").notNull().unique(), }); -export const teamUsersRelations = relations(teamUsersTable, ({ one, many }) => ({ - superUser: one(usersTable, { - fields: [teamUsersTable.id], - references: [usersTable.id], - }), - team: one(teamsTable, { - fields: [teamUsersTable.teamId], - references: [teamsTable.id], +export const teamUsersRelations = relations( + teamUsersTable, + ({ one, many }) => ({ + superUser: one(usersTable, { + fields: [teamUsersTable.id], + references: [usersTable.id], + }), + team: one(teamsTable, { + fields: [teamUsersTable.teamId], + references: [teamsTable.id], + }), + teamSemesters: many(teamSemesterUsersTable), }), - teamSemesters: many(teamSemesterUsersTable), -})); +); export const assistantUsersTable = mainSchema.table("assistantUsers", { id: integer("id")