Skip to content
Closed
19 changes: 14 additions & 5 deletions db/tables/interviews.ts
Original file line number Diff line number Diff line change
@@ -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";

Check warning on line 8 in db/tables/interviews.ts

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

'drizzle-orm/pg-core' imported multiple times.

See more on https://sonarcloud.io/project/issues?id=vektorprogrammet_api&issues=AaFY72At3K4N9GlePLJo&open=AaFY72At3K4N9GlePLJo&pullRequest=153
import { boolean, integer, json, serial, timestamp } from "drizzle-orm/pg-core";

export const interviewsTable = mainSchema.table("interviews", {
Expand Down Expand Up @@ -38,14 +39,19 @@
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],
}),
}),
);

Expand All @@ -57,8 +63,11 @@
references: [interviewsTable.id],
}),
interviewHolder: one(teamUsersTable, {
fields: [interviewHoldersTable.interviewHolderId],
references: [teamUsersTable.id],
fields: [
interviewHoldersTable.interviewHolderId,
interviewHoldersTable.teamId,
],
references: [teamUsersTable.id, teamUsersTable.teamId],
}),
}),
);
45 changes: 30 additions & 15 deletions db/tables/parent-meetings.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { relations } from "drizzle-orm";
import {
foreignKey,
integer,
interval,
serial,
Expand All @@ -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,
Expand All @@ -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],
}),
}),
);
7 changes: 0 additions & 7 deletions db/tables/team-roles.ts

This file was deleted.

28 changes: 20 additions & 8 deletions db/tables/team-semester-user.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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],
}),
}),
);
24 changes: 17 additions & 7 deletions db/tables/users.ts
Original file line number Diff line number Diff line change
@@ -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,

Check warning on line 6 in db/tables/users.ts

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this unused import of 'primaryKey'.

See more on https://sonarcloud.io/project/issues?id=vektorprogrammet_api&issues=AaFZFoxmFtqRPisq1XHc&open=AaFZFoxmFtqRPisq1XHc&pullRequest=153
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", {
Expand All @@ -32,6 +37,11 @@
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()
Expand All @@ -40,9 +50,9 @@
.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(
Expand All @@ -57,9 +67,9 @@
references: [teamsTable.id],
}),
teamSemesters: many(teamSemesterUsersTable),
teamUserRole: one(teamUserRolesTable, {
fields: [teamUsersTable.teamUserRoleId],
references: [teamUserRolesTable.id],
teamRole: one(teamRoleTable, {
fields: [teamUsersTable.teamRoleId],
references: [teamRoleTable.id],
}),
}),
);
Expand Down
26 changes: 13 additions & 13 deletions src/db-access/users.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion src/request-handling/users.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
})
Expand Down
2 changes: 1 addition & 1 deletion src/response-handling/users.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<typeof teamUserSelectSchema>;
Expand Down
Loading