diff --git a/db/tables/interviews.ts b/db/tables/interviews.ts index f9dfc0a..041fb85 100644 --- a/db/tables/interviews.ts +++ b/db/tables/interviews.ts @@ -1,10 +1,11 @@ import { assistantApplicationsTable } from "@/db/tables/applications"; import { interviewSchemasTable } from "@/db/tables/interview-schemas"; import { mainSchema } from "@/db/tables/schema"; +import { teamsTable } from "@/db/tables/teams"; import { teamUsersTable } from "@/db/tables/users"; import type { Json } from "@/lib/json-schema"; import { relations } from "drizzle-orm"; -import { primaryKey } from "drizzle-orm/pg-core"; +import { foreignKey, primaryKey } from "drizzle-orm/pg-core"; import { boolean, integer, json, serial, timestamp } from "drizzle-orm/pg-core"; export const interviewsTable = mainSchema.table("interviews", { @@ -38,14 +39,19 @@ export const interviewHoldersTable = mainSchema.table( interviewId: integer("integerId") .notNull() .references(() => interviewsTable.id), - interviewHolderId: integer("interviewHolderId") + interviewHolderId: integer("interviewHolderId").notNull(), + teamId: integer("teamId") .notNull() - .references(() => teamUsersTable.id), + .references(() => teamsTable.id), }, (table) => ({ compositePrimaryKey: primaryKey({ columns: [table.interviewId, table.interviewHolderId], }), + teamUserForeignKey: foreignKey({ + columns: [table.interviewHolderId, table.teamId], + foreignColumns: [teamUsersTable.id, teamUsersTable.teamId], + }), }), ); @@ -57,8 +63,11 @@ export const interviewHoldersRelations = relations( references: [interviewsTable.id], }), interviewHolder: one(teamUsersTable, { - fields: [interviewHoldersTable.interviewHolderId], - references: [teamUsersTable.id], + fields: [ + interviewHoldersTable.interviewHolderId, + interviewHoldersTable.teamId, + ], + references: [teamUsersTable.id, teamUsersTable.teamId], }), }), ); diff --git a/db/tables/parent-meetings.ts b/db/tables/parent-meetings.ts index 1337298..e1166d9 100644 --- a/db/tables/parent-meetings.ts +++ b/db/tables/parent-meetings.ts @@ -1,5 +1,6 @@ import { relations } from "drizzle-orm"; import { + foreignKey, integer, interval, serial, @@ -8,21 +9,32 @@ import { } from "drizzle-orm/pg-core"; import { mainSchema } from "./schema"; import { semestersTable } from "./semesters"; +import { teamsTable } from "./teams"; import { teamUsersTable } from "./users"; -export const parentMeetingsTable = mainSchema.table("parentMeetings", { - id: serial("id").primaryKey(), - dateTime: timestamp("dateTime").notNull(), - duration: interval("duration").notNull(), - place: text("place").notNull(), - semesterId: integer("semesterId") - .notNull() - .references(() => semestersTable.id), - // id of the team user responsible for organizing and conducting the parent meeting - responsibleUserId: integer("responsibleUserId") - .notNull() - .references(() => teamUsersTable.id), -}); +export const parentMeetingsTable = mainSchema.table( + "parentMeetings", + { + id: serial("id").primaryKey(), + dateTime: timestamp("dateTime").notNull(), + duration: interval("duration").notNull(), + place: text("place").notNull(), + semesterId: integer("semesterId") + .notNull() + .references(() => semestersTable.id), + // id of the team user responsible for organizing and conducting the parent meeting + responsibleUserId: integer("responsibleUserId").notNull(), + teamId: integer("teamId") + .notNull() + .references(() => teamsTable.id), + }, + (table) => ({ + teamUserForeignKey: foreignKey({ + columns: [table.responsibleUserId, table.teamId], + foreignColumns: [teamUsersTable.id, teamUsersTable.teamId], + }), + }), +); export const parentMeetingsRelations = relations( parentMeetingsTable, @@ -32,8 +44,11 @@ export const parentMeetingsRelations = relations( references: [semestersTable.id], }), teamUser: one(teamUsersTable, { - fields: [parentMeetingsTable.responsibleUserId], - references: [teamUsersTable.id], + fields: [ + parentMeetingsTable.responsibleUserId, + parentMeetingsTable.teamId, + ], + references: [teamUsersTable.id, teamUsersTable.teamId], }), }), ); diff --git a/db/tables/team-roles.ts b/db/tables/team-roles.ts deleted file mode 100644 index 9f80c02..0000000 --- a/db/tables/team-roles.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { mainSchema } from "@/db/tables/schema"; -import { serial, text } from "drizzle-orm/pg-core"; - -export const teamUserRolesTable = mainSchema.table("teamUserRoles", { - id: serial("id").primaryKey(), - name: text("name").notNull().unique(), -}); diff --git a/db/tables/team-semester-user.ts b/db/tables/team-semester-user.ts index 86de272..cd44b4a 100644 --- a/db/tables/team-semester-user.ts +++ b/db/tables/team-semester-user.ts @@ -1,15 +1,24 @@ import { relations } from "drizzle-orm"; -import { integer } from "drizzle-orm/pg-core"; +import { foreignKey, 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 teamSemesterUsersTable = mainSchema.table( + "teamSemesterUser", + { + teamId: integer("teamId").references(() => teamsTable.id), + semesterId: integer("semesterId").references(() => semestersTable.id), + teamUserId: integer("teamUserId"), + }, + (table) => ({ + teamUserForeignKey: foreignKey({ + columns: [table.teamUserId, table.teamId], + foreignColumns: [teamUsersTable.id, teamUsersTable.teamId], + }), + }), +); export const teamSemesterUsersRelations = relations( teamSemesterUsersTable, @@ -23,8 +32,11 @@ export const teamSemesterUsersRelations = relations( references: [semestersTable.id], }), teamUser: one(teamUsersTable, { - fields: [teamSemesterUsersTable.teamUserId], - references: [teamUsersTable.id], + fields: [ + teamSemesterUsersTable.teamUserId, + teamSemesterUsersTable.teamId, + ], + references: [teamUsersTable.id, teamUsersTable.teamId], }), }), ); diff --git a/db/tables/users.ts b/db/tables/users.ts index cf1583d..5762b42 100644 --- a/db/tables/users.ts +++ b/db/tables/users.ts @@ -1,12 +1,17 @@ import { mainSchema } from "@/db/tables/schema"; import { relations } from "drizzle-orm"; -import { boolean, integer, serial, text } from "drizzle-orm/pg-core"; +import { + boolean, + integer, + primaryKey, + 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 { schoolAssignmentsTable } from "./school-assignments"; -import { teamUserRolesTable } from "./team-roles"; import { teamSemesterUsersTable } from "./team-semester-user"; export const usersTable = mainSchema.table("users", { @@ -32,6 +37,11 @@ export const usersRelations = relations(usersTable, ({ one, many }) => ({ assistantUser: one(assistantUsersTable), })); +export const teamRoleTable = mainSchema.table("teamRole", { + id: serial("id").primaryKey(), + name: text("name").notNull().unique(), +}); + export const teamUsersTable = mainSchema.table("teamUsers", { id: integer("id") .primaryKey() @@ -40,9 +50,9 @@ export const teamUsersTable = mainSchema.table("teamUsers", { .notNull() .references(() => teamsTable.id), username: text("username").notNull().unique(), - teamUserRoleId: integer("teamUserRoleId") + teamRoleId: integer("teamRoleId") .notNull() - .references(() => teamUserRolesTable.id), + .references(() => teamRoleTable.id), isTeamLeader: boolean("isTeamLeader").notNull().default(false), }); export const teamUsersRelations = relations( @@ -57,9 +67,9 @@ export const teamUsersRelations = relations( references: [teamsTable.id], }), teamSemesters: many(teamSemesterUsersTable), - teamUserRole: one(teamUserRolesTable, { - fields: [teamUsersTable.teamUserRoleId], - references: [teamUserRolesTable.id], + teamRole: one(teamRoleTable, { + fields: [teamUsersTable.teamRoleId], + references: [teamRoleTable.id], }), }), ); diff --git a/src/db-access/users.ts b/src/db-access/users.ts index ba4f686..fb0fd9b 100644 --- a/src/db-access/users.ts +++ b/src/db-access/users.ts @@ -1,7 +1,7 @@ import { database } from "@/db/setup/query-postgres"; -import { teamUserRolesTable } from "@/db/tables/team-roles"; import { assistantUsersTable, + teamRoleTable, teamUsersTable, usersTable, } from "@/db/tables/users"; @@ -61,15 +61,15 @@ export async function selectTeamUsersById( companyEmail: usersTable.companyEmail, teamId: teamUsersTable.teamId, username: teamUsersTable.username, - teamUserRoleId: teamUsersTable.teamUserRoleId, - teamUserRoleName: teamUserRolesTable.name, + teamRoleId: teamUsersTable.teamRoleId, + teamRoleName: teamRoleTable.name, isTeamLeader: teamUsersTable.isTeamLeader, }) .from(teamUsersTable) .innerJoin(usersTable, eq(teamUsersTable.id, usersTable.id)) .innerJoin( - teamUserRolesTable, - eq(teamUsersTable.teamUserRoleId, teamUserRolesTable.id), + teamRoleTable, + eq(teamUsersTable.teamRoleId, teamRoleTable.id), ) .where(inArray(teamUsersTable.id, userIds)); if (users.length !== userIds.length) { @@ -142,15 +142,15 @@ export async function selectTeamUsers( companyEmail: usersTable.companyEmail, teamId: teamUsersTable.teamId, username: teamUsersTable.username, - teamUserRoleId: teamUsersTable.teamUserRoleId, - teamUserRoleName: teamUserRolesTable.name, + teamRoleId: teamUsersTable.teamRoleId, + teamRoleName: teamRoleTable.name, isTeamLeader: teamUsersTable.isTeamLeader, }) .from(teamUsersTable) .innerJoin(usersTable, eq(teamUsersTable.id, usersTable.id)) .innerJoin( - teamUserRolesTable, - eq(teamUsersTable.teamUserRoleId, teamUserRolesTable.id), + teamRoleTable, + eq(teamUsersTable.teamRoleId, teamRoleTable.id), ) .limit(queryParameters.limit) .offset(queryParameters.offset); @@ -179,15 +179,15 @@ export async function selectTeamUsersByTeamid( companyEmail: usersTable.companyEmail, teamId: teamUsersTable.teamId, username: teamUsersTable.username, - teamUserRoleId: teamUsersTable.teamUserRoleId, - teamUserRoleName: teamUserRolesTable.name, + teamRoleId: teamUsersTable.teamRoleId, + teamRoleName: teamRoleTable.name, isTeamLeader: teamUsersTable.isTeamLeader, }) .from(teamUsersTable) .innerJoin(usersTable, eq(teamUsersTable.id, usersTable.id)) .innerJoin( - teamUserRolesTable, - eq(teamUsersTable.teamUserRoleId, teamUserRolesTable.id), + teamRoleTable, + eq(teamUsersTable.teamRoleId, teamRoleTable.id), ) .limit(queryParameters.limit) .offset(queryParameters.offset) diff --git a/src/request-handling/users.ts b/src/request-handling/users.ts index 4284a91..ae41884 100644 --- a/src/request-handling/users.ts +++ b/src/request-handling/users.ts @@ -24,7 +24,7 @@ export const teamUserRequestParser = z .object({ id: serialIdParser, teamId: serialIdParser, - teamUserRoleId: serialIdParser, + teamRoleId: serialIdParser, isTeamLeader: z.boolean().optional(), username: z.string().nonempty(), }) diff --git a/src/response-handling/users.ts b/src/response-handling/users.ts index 61525b4..1727ffd 100644 --- a/src/response-handling/users.ts +++ b/src/response-handling/users.ts @@ -16,7 +16,7 @@ export type UserKey = User["id"]; export const teamUserSelectSchema = createSelectSchema(teamUsersTable) .merge(createSelectSchema(usersTable)) - .extend({ teamUserRoleName: z.string() }) + .extend({ teamRoleName: z.string() }) .strict() .readonly(); export type TeamUser = z.infer;