From 2786781c43e9bc89a8fa60de68222acf224e8f57 Mon Sep 17 00:00:00 2001 From: Kristoffer Fredrik Dahle Melen Date: Tue, 20 Oct 2026 10:48:29 +0200 Subject: [PATCH 1/6] Added a teamPosition table, and added isTeamLeader and teamPositionId to teamUser table. Also added profilePictureUrl to user table. --- db/tables/teams.ts | 37 +++++++++++++++++++++------------- db/tables/users.ts | 16 ++++++++++++++- src/db-access/users.ts | 31 ++++++++++++++++++++++++++-- src/request-handling/users.ts | 3 +++ src/response-handling/users.ts | 3 ++- src/routers/teams.ts | 3 --- 6 files changed, 72 insertions(+), 21 deletions(-) diff --git a/db/tables/teams.ts b/db/tables/teams.ts index 86e4df6..93e834d 100644 --- a/db/tables/teams.ts +++ b/db/tables/teams.ts @@ -2,23 +2,32 @@ import { teamApplicationsTable } from "@/db/tables/applications"; import { departmentsTable } from "@/db/tables/departments"; import { mainSchema } from "@/db/tables/schema"; import { relations } from "drizzle-orm"; -import { boolean, serial, text, timestamp } from "drizzle-orm/pg-core"; +import { boolean, serial, text, timestamp, unique } 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(), - departmentId: integer("departmentId") - .notNull() - .references(() => departmentsTable.id), - name: text("name").notNull().unique(), - email: text("email").notNull().unique(), - description: text("description").notNull(), - shortDescription: text("shortDescription").notNull(), - acceptApplication: boolean("acceptApplication").notNull(), - active: boolean("active").notNull(), - deadline: timestamp("deadline"), -}); +export const teamsTable = mainSchema.table( + "teams", + { + id: serial("id").primaryKey(), + departmentId: integer("departmentId") + .notNull() + .references(() => departmentsTable.id), + name: text("name").notNull(), + email: text("email").notNull().unique(), + description: text("description").notNull(), + shortDescription: text("shortDescription").notNull(), + acceptApplication: boolean("acceptApplication").notNull(), + active: boolean("active").notNull(), + deadline: timestamp("deadline"), + }, + (table) => ({ + departmentIdNameUnique: unique("teams_departmentId_name_unique").on( + table.departmentId, + table.name, + ), + }), +); export const teamRelations = relations(teamsTable, ({ one, many }) => ({ department: one(departmentsTable, { diff --git a/db/tables/users.ts b/db/tables/users.ts index f3405c4..1b996ec 100644 --- a/db/tables/users.ts +++ b/db/tables/users.ts @@ -1,6 +1,6 @@ import { mainSchema } from "@/db/tables/schema"; import { relations } from "drizzle-orm"; -import { integer, serial, text } from "drizzle-orm/pg-core"; +import { boolean, integer, serial, text } from "drizzle-orm/pg-core"; import { expensesTable } from "@/db/tables/expenses"; import { fieldsOfStudyTable } from "@/db/tables/fields-of-study"; @@ -18,6 +18,7 @@ export const usersTable = mainSchema.table("users", { bankAccountNumber: text("accountNumber").unique(), personalEmail: text("personalEmail").notNull().unique(), phoneNumber: text("phoneNumber").notNull().unique(), + profilePictureUrl: text("profilePictureUrl"), }); export const usersRelations = relations(usersTable, ({ one, many }) => ({ fieldOfStudy: one(fieldsOfStudyTable, { @@ -29,6 +30,11 @@ export const usersRelations = relations(usersTable, ({ one, many }) => ({ assistantUser: one(assistantUsersTable), })); +export const teamPositionTable = mainSchema.table("teamPosition", { + id: serial("id").primaryKey(), + name: text("name").notNull().unique(), +}); + export const teamUsersTable = mainSchema.table("teamUsers", { id: integer("id") .primaryKey() @@ -37,6 +43,10 @@ export const teamUsersTable = mainSchema.table("teamUsers", { .notNull() .references(() => teamsTable.id), username: text("username").notNull().unique(), + teamPositionId: integer("teamPositionId") + .notNull() + .references(() => teamPositionTable.id), + isTeamLeader: boolean("isTeamLeader").notNull().default(false), }); export const teamUsersRelations = relations( teamUsersTable, @@ -50,6 +60,10 @@ export const teamUsersRelations = relations( references: [teamsTable.id], }), teamSemesters: many(teamSemesterUsersTable), + teamPosition: one(teamPositionTable, { + fields: [teamUsersTable.teamPositionId], + references: [teamPositionTable.id], + }), }), ); diff --git a/src/db-access/users.ts b/src/db-access/users.ts index 8c60c73..20351fa 100644 --- a/src/db-access/users.ts +++ b/src/db-access/users.ts @@ -1,6 +1,7 @@ import { database } from "@/db/setup/query-postgres"; import { assistantUsersTable, + teamPositionTable, teamUsersTable, usersTable, } from "@/db/tables/users"; @@ -56,12 +57,20 @@ export async function selectTeamUsersById( bankAccountNumber: usersTable.bankAccountNumber, phoneNumber: usersTable.phoneNumber, personalEmail: usersTable.personalEmail, + profilePictureUrl: usersTable.profilePictureUrl, teamId: teamUsersTable.teamId, username: teamUsersTable.username, + teamPositionId: teamUsersTable.teamPositionId, + teamPositionName: teamPositionTable.name, + isTeamLeader: teamUsersTable.isTeamLeader, }) .from(teamUsersTable) - .where(inArray(assistantUsersTable.id, userIds)) - .innerJoin(usersTable, eq(teamUsersTable.id, usersTable.id)); + .innerJoin(usersTable, eq(teamUsersTable.id, usersTable.id)) + .innerJoin( + teamPositionTable, + eq(teamUsersTable.teamPositionId, teamPositionTable.id), + ) + .where(inArray(teamUsersTable.id, userIds)); if (users.length !== userIds.length) { throw ormError("Couln't find all entries"); } @@ -84,6 +93,7 @@ export async function selectAssistantUsersById( phoneNumber: usersTable.phoneNumber, personalEmail: usersTable.personalEmail, bankAccountNumber: usersTable.bankAccountNumber, + profilePictureUrl: usersTable.profilePictureUrl, }) .from(assistantUsersTable) .where(inArray(assistantUsersTable.id, userIds)) @@ -126,11 +136,19 @@ export async function selectTeamUsers( bankAccountNumber: usersTable.bankAccountNumber, phoneNumber: usersTable.phoneNumber, personalEmail: usersTable.personalEmail, + profilePictureUrl: usersTable.profilePictureUrl, teamId: teamUsersTable.teamId, username: teamUsersTable.username, + teamPositionId: teamUsersTable.teamPositionId, + teamPositionName: teamPositionTable.name, + isTeamLeader: teamUsersTable.isTeamLeader, }) .from(teamUsersTable) .innerJoin(usersTable, eq(teamUsersTable.id, usersTable.id)) + .innerJoin( + teamPositionTable, + eq(teamUsersTable.teamPositionId, teamPositionTable.id), + ) .limit(queryParameters.limit) .offset(queryParameters.offset); @@ -154,11 +172,19 @@ export async function selectTeamUsersByTeamid( bankAccountNumber: usersTable.bankAccountNumber, phoneNumber: usersTable.phoneNumber, personalEmail: usersTable.personalEmail, + profilePictureUrl: usersTable.profilePictureUrl, teamId: teamUsersTable.teamId, username: teamUsersTable.username, + teamPositionId: teamUsersTable.teamPositionId, + teamPositionName: teamPositionTable.name, + isTeamLeader: teamUsersTable.isTeamLeader, }) .from(teamUsersTable) .innerJoin(usersTable, eq(teamUsersTable.id, usersTable.id)) + .innerJoin( + teamPositionTable, + eq(teamUsersTable.teamPositionId, teamPositionTable.id), + ) .limit(queryParameters.limit) .offset(queryParameters.offset) .where(inArray(teamUsersTable.teamId, teamIds)); @@ -182,6 +208,7 @@ export async function selectAssistantUsers( bankAccountNumber: usersTable.bankAccountNumber, phoneNumber: usersTable.phoneNumber, personalEmail: usersTable.personalEmail, + profilePictureUrl: usersTable.profilePictureUrl, }) .from(assistantUsersTable) .innerJoin(usersTable, eq(assistantUsersTable.id, usersTable.id)) diff --git a/src/request-handling/users.ts b/src/request-handling/users.ts index 055def6..2a85670 100644 --- a/src/request-handling/users.ts +++ b/src/request-handling/users.ts @@ -16,6 +16,7 @@ export const userRequestParser = z bankAccountNumber: z.string().length(11), personalEmail: z.string().email(), phoneNumber: z.string().min(8), + profilePictureUrl: z.string().nullable().optional(), }) .strict(); @@ -23,6 +24,8 @@ export const teamUserRequestParser = z .object({ id: serialIdParser, teamId: serialIdParser, + teamPositionId: serialIdParser, + isTeamLeader: z.boolean().optional(), username: z.string().nonempty(), }) .strict(); diff --git a/src/response-handling/users.ts b/src/response-handling/users.ts index 30ec0a8..8eae283 100644 --- a/src/response-handling/users.ts +++ b/src/response-handling/users.ts @@ -1,5 +1,5 @@ import { createSelectSchema } from "drizzle-zod"; -import type { z } from "zod"; +import { z } from "zod"; import { assistantUsersTable, @@ -16,6 +16,7 @@ export type UserKey = User["id"]; export const teamUserSelectSchema = createSelectSchema(teamUsersTable) .merge(createSelectSchema(usersTable)) + .extend({ teamPositionName: z.string() }) .strict() .readonly(); export type TeamUser = z.infer; diff --git a/src/routers/teams.ts b/src/routers/teams.ts index b1274f0..5e824cc 100644 --- a/src/routers/teams.ts +++ b/src/routers/teams.ts @@ -96,9 +96,6 @@ teamsRouter.get("/inactive", async (req, res, next) => { * tags: [teams] * summary: Get all active teams with department name and number of members * description: Return all active teams with extra info - * parameters: - * - $ref: "#/components/parameters/offset" - * - $ref: "#/components/parameters/limit" * responses: * 200: * description: Successfull response From df351514757377a6b717b05e44d4aff80da0ffcd Mon Sep 17 00:00:00 2001 From: Kristoffer Fredrik Dahle Melen Date: Tue, 20 Oct 2026 10:55:43 +0200 Subject: [PATCH 2/6] Renamed Position to Role --- db/tables/users.ts | 12 ++++++------ src/db-access/users.ts | 26 +++++++++++++------------- src/request-handling/users.ts | 2 +- src/response-handling/users.ts | 2 +- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/db/tables/users.ts b/db/tables/users.ts index 1b996ec..ce34893 100644 --- a/db/tables/users.ts +++ b/db/tables/users.ts @@ -30,7 +30,7 @@ export const usersRelations = relations(usersTable, ({ one, many }) => ({ assistantUser: one(assistantUsersTable), })); -export const teamPositionTable = mainSchema.table("teamPosition", { +export const teamRoleTable = mainSchema.table("teamRole", { id: serial("id").primaryKey(), name: text("name").notNull().unique(), }); @@ -43,9 +43,9 @@ export const teamUsersTable = mainSchema.table("teamUsers", { .notNull() .references(() => teamsTable.id), username: text("username").notNull().unique(), - teamPositionId: integer("teamPositionId") + teamRoleId: integer("teamRoleId") .notNull() - .references(() => teamPositionTable.id), + .references(() => teamRoleTable.id), isTeamLeader: boolean("isTeamLeader").notNull().default(false), }); export const teamUsersRelations = relations( @@ -60,9 +60,9 @@ export const teamUsersRelations = relations( references: [teamsTable.id], }), teamSemesters: many(teamSemesterUsersTable), - teamPosition: one(teamPositionTable, { - fields: [teamUsersTable.teamPositionId], - references: [teamPositionTable.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 20351fa..ec10813 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 { assistantUsersTable, - teamPositionTable, + teamRoleTable, teamUsersTable, usersTable, } from "@/db/tables/users"; @@ -60,15 +60,15 @@ export async function selectTeamUsersById( profilePictureUrl: usersTable.profilePictureUrl, teamId: teamUsersTable.teamId, username: teamUsersTable.username, - teamPositionId: teamUsersTable.teamPositionId, - teamPositionName: teamPositionTable.name, + teamRoleId: teamUsersTable.teamRoleId, + teamRoleName: teamRoleTable.name, isTeamLeader: teamUsersTable.isTeamLeader, }) .from(teamUsersTable) .innerJoin(usersTable, eq(teamUsersTable.id, usersTable.id)) .innerJoin( - teamPositionTable, - eq(teamUsersTable.teamPositionId, teamPositionTable.id), + teamRoleTable, + eq(teamUsersTable.teamRoleId, teamRoleTable.id), ) .where(inArray(teamUsersTable.id, userIds)); if (users.length !== userIds.length) { @@ -139,15 +139,15 @@ export async function selectTeamUsers( profilePictureUrl: usersTable.profilePictureUrl, teamId: teamUsersTable.teamId, username: teamUsersTable.username, - teamPositionId: teamUsersTable.teamPositionId, - teamPositionName: teamPositionTable.name, + teamRoleId: teamUsersTable.teamRoleId, + teamRoleName: teamRoleTable.name, isTeamLeader: teamUsersTable.isTeamLeader, }) .from(teamUsersTable) .innerJoin(usersTable, eq(teamUsersTable.id, usersTable.id)) .innerJoin( - teamPositionTable, - eq(teamUsersTable.teamPositionId, teamPositionTable.id), + teamRoleTable, + eq(teamUsersTable.teamRoleId, teamRoleTable.id), ) .limit(queryParameters.limit) .offset(queryParameters.offset); @@ -175,15 +175,15 @@ export async function selectTeamUsersByTeamid( profilePictureUrl: usersTable.profilePictureUrl, teamId: teamUsersTable.teamId, username: teamUsersTable.username, - teamPositionId: teamUsersTable.teamPositionId, - teamPositionName: teamPositionTable.name, + teamRoleId: teamUsersTable.teamRoleId, + teamRoleName: teamRoleTable.name, isTeamLeader: teamUsersTable.isTeamLeader, }) .from(teamUsersTable) .innerJoin(usersTable, eq(teamUsersTable.id, usersTable.id)) .innerJoin( - teamPositionTable, - eq(teamUsersTable.teamPositionId, teamPositionTable.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 2a85670..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, - teamPositionId: 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 8eae283..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({ teamPositionName: z.string() }) + .extend({ teamRoleName: z.string() }) .strict() .readonly(); export type TeamUser = z.infer; From 3967e7407a5dee97501de83236d43836bdd3d79a Mon Sep 17 00:00:00 2001 From: Kristoffer Fredrik Dahle Melen Date: Tue, 20 Oct 2026 11:10:05 +0200 Subject: [PATCH 3/6] Fixed test failing. --- .github/workflows/pull-request-check.yml | 4 ++-- docker-compose.yml | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull-request-check.yml b/.github/workflows/pull-request-check.yml index e6dfe30..5c2c586 100644 --- a/.github/workflows/pull-request-check.yml +++ b/.github/workflows/pull-request-check.yml @@ -44,7 +44,7 @@ jobs: - name: Install pnpm run: pnpm install - name: Docker compose - run: docker compose up -d + run: docker compose up -d --wait - name: Generate migration files run: pnpm db:generate - name: Migrate database @@ -76,7 +76,7 @@ jobs: - name: Install pnpm run: pnpm install - name: Docker compose - run: docker compose up -d + run: docker compose up -d --wait - name: Generate migration files run: pnpm db:generate - name: Migrate database diff --git a/docker-compose.yml b/docker-compose.yml index c14af96..bfa0f43 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,6 +5,12 @@ services: - POSTGRES_PASSWORD=${DATABASE_PASSWORD} - POSTGRES_USER=${DATABASE_USER} - POSTGRES_DB=${DATABASE_NAME} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] + interval: 5s + timeout: 5s + retries: 5 + start_period: 10s ports: - ${DATABASE_PORT}:5432 volumes: From b7b0d5ff4994bd7427f4ab3f7532c7c9206b25e3 Mon Sep 17 00:00:00 2001 From: Tobias Hegge Date: Tue, 20 Oct 2026 11:10:21 +0200 Subject: [PATCH 4/6] added companyEmail field to users --- db/tables/users.ts | 1 + package.json | 3 ++- src/db-access/users.ts | 5 +++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/db/tables/users.ts b/db/tables/users.ts index ce34893..3cd3fe0 100644 --- a/db/tables/users.ts +++ b/db/tables/users.ts @@ -19,6 +19,7 @@ export const usersTable = mainSchema.table("users", { personalEmail: text("personalEmail").notNull().unique(), phoneNumber: text("phoneNumber").notNull().unique(), profilePictureUrl: text("profilePictureUrl"), + companyEmail: text("companyEmail").unique(), }); export const usersRelations = relations(usersTable, ({ one, many }) => ({ fieldOfStudy: one(fieldsOfStudyTable, { diff --git a/package.json b/package.json index cfc9b90..7629e6c 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "db:migrate": "drizzle-kit migrate --config=db/config/drizzle.config.ts", "db:studio": "drizzle-kit studio --config=db/config/drizzle.config.ts", "db:seed": "tsx ./db/seeding/seeding.ts", - "docs:generate": "tsx ./openapi/generate-document.ts" + "docs:generate": "tsx ./openapi/generate-document.ts", + "db:push": "drizzle-kit push --config=db/config/drizzle.config.ts" }, "license": "ISC", "dependencies": { diff --git a/src/db-access/users.ts b/src/db-access/users.ts index ec10813..fb0fd9b 100644 --- a/src/db-access/users.ts +++ b/src/db-access/users.ts @@ -58,6 +58,7 @@ export async function selectTeamUsersById( phoneNumber: usersTable.phoneNumber, personalEmail: usersTable.personalEmail, profilePictureUrl: usersTable.profilePictureUrl, + companyEmail: usersTable.companyEmail, teamId: teamUsersTable.teamId, username: teamUsersTable.username, teamRoleId: teamUsersTable.teamRoleId, @@ -94,6 +95,7 @@ export async function selectAssistantUsersById( personalEmail: usersTable.personalEmail, bankAccountNumber: usersTable.bankAccountNumber, profilePictureUrl: usersTable.profilePictureUrl, + companyEmail: usersTable.companyEmail, }) .from(assistantUsersTable) .where(inArray(assistantUsersTable.id, userIds)) @@ -137,6 +139,7 @@ export async function selectTeamUsers( phoneNumber: usersTable.phoneNumber, personalEmail: usersTable.personalEmail, profilePictureUrl: usersTable.profilePictureUrl, + companyEmail: usersTable.companyEmail, teamId: teamUsersTable.teamId, username: teamUsersTable.username, teamRoleId: teamUsersTable.teamRoleId, @@ -173,6 +176,7 @@ export async function selectTeamUsersByTeamid( phoneNumber: usersTable.phoneNumber, personalEmail: usersTable.personalEmail, profilePictureUrl: usersTable.profilePictureUrl, + companyEmail: usersTable.companyEmail, teamId: teamUsersTable.teamId, username: teamUsersTable.username, teamRoleId: teamUsersTable.teamRoleId, @@ -209,6 +213,7 @@ export async function selectAssistantUsers( phoneNumber: usersTable.phoneNumber, personalEmail: usersTable.personalEmail, profilePictureUrl: usersTable.profilePictureUrl, + companyEmail: usersTable.companyEmail, }) .from(assistantUsersTable) .innerJoin(usersTable, eq(assistantUsersTable.id, usersTable.id)) From 7ecdc3a5d1e50bf2ad596f6f6e3c45630bfda066 Mon Sep 17 00:00:00 2001 From: Kristoffer Fredrik Dahle Melen Date: Tue, 20 Oct 2026 11:37:49 +0200 Subject: [PATCH 5/6] Renamed teamRole to teamUserRole and moved teamRoleTable to its own file. --- db/tables/team-roles.ts | 7 +++++++ db/tables/users.ts | 15 ++++++--------- src/db-access/users.ts | 26 +++++++++++++------------- src/request-handling/users.ts | 2 +- src/response-handling/users.ts | 2 +- 5 files changed, 28 insertions(+), 24 deletions(-) create mode 100644 db/tables/team-roles.ts diff --git a/db/tables/team-roles.ts b/db/tables/team-roles.ts new file mode 100644 index 0000000..5201b1d --- /dev/null +++ b/db/tables/team-roles.ts @@ -0,0 +1,7 @@ +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(), +}); \ No newline at end of file diff --git a/db/tables/users.ts b/db/tables/users.ts index 3cd3fe0..5a3db14 100644 --- a/db/tables/users.ts +++ b/db/tables/users.ts @@ -7,6 +7,7 @@ import { fieldsOfStudyTable } from "@/db/tables/fields-of-study"; import { teamsTable } from "@/db/tables/teams"; import { schoolAssignmentsTable } from "./school-assignments"; import { teamSemesterUsersTable } from "./team-semester-user"; +import { teamUserRolesTable } from "./team-roles"; export const usersTable = mainSchema.table("users", { id: serial("id").primaryKey(), @@ -31,10 +32,6 @@ 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") @@ -44,9 +41,9 @@ export const teamUsersTable = mainSchema.table("teamUsers", { .notNull() .references(() => teamsTable.id), username: text("username").notNull().unique(), - teamRoleId: integer("teamRoleId") + teamUserRoleId: integer("teamUserRoleId") .notNull() - .references(() => teamRoleTable.id), + .references(() => teamUserRolesTable.id), isTeamLeader: boolean("isTeamLeader").notNull().default(false), }); export const teamUsersRelations = relations( @@ -61,9 +58,9 @@ export const teamUsersRelations = relations( references: [teamsTable.id], }), teamSemesters: many(teamSemesterUsersTable), - teamRole: one(teamRoleTable, { - fields: [teamUsersTable.teamRoleId], - references: [teamRoleTable.id], + teamUserRole: one(teamUserRolesTable, { + fields: [teamUsersTable.teamUserRoleId], + references: [teamUserRolesTable.id], }), }), ); diff --git a/src/db-access/users.ts b/src/db-access/users.ts index fb0fd9b..858bf0e 100644 --- a/src/db-access/users.ts +++ b/src/db-access/users.ts @@ -1,10 +1,10 @@ import { database } from "@/db/setup/query-postgres"; import { assistantUsersTable, - teamRoleTable, teamUsersTable, usersTable, } from "@/db/tables/users"; +import { teamUserRolesTable } from "@/db/tables/team-roles"; import { type OrmResult, handleDatabaseFullfillment, @@ -61,15 +61,15 @@ export async function selectTeamUsersById( companyEmail: usersTable.companyEmail, teamId: teamUsersTable.teamId, username: teamUsersTable.username, - teamRoleId: teamUsersTable.teamRoleId, - teamRoleName: teamRoleTable.name, + teamUserRoleId: teamUsersTable.teamUserRoleId, + teamUserRoleName: teamUserRolesTable.name, isTeamLeader: teamUsersTable.isTeamLeader, }) .from(teamUsersTable) .innerJoin(usersTable, eq(teamUsersTable.id, usersTable.id)) .innerJoin( - teamRoleTable, - eq(teamUsersTable.teamRoleId, teamRoleTable.id), + teamUserRolesTable, + eq(teamUsersTable.teamUserRoleId, teamUserRolesTable.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, - teamRoleId: teamUsersTable.teamRoleId, - teamRoleName: teamRoleTable.name, + teamUserRoleId: teamUsersTable.teamUserRoleId, + teamUserRoleName: teamUserRolesTable.name, isTeamLeader: teamUsersTable.isTeamLeader, }) .from(teamUsersTable) .innerJoin(usersTable, eq(teamUsersTable.id, usersTable.id)) .innerJoin( - teamRoleTable, - eq(teamUsersTable.teamRoleId, teamRoleTable.id), + teamUserRolesTable, + eq(teamUsersTable.teamUserRoleId, teamUserRolesTable.id), ) .limit(queryParameters.limit) .offset(queryParameters.offset); @@ -179,15 +179,15 @@ export async function selectTeamUsersByTeamid( companyEmail: usersTable.companyEmail, teamId: teamUsersTable.teamId, username: teamUsersTable.username, - teamRoleId: teamUsersTable.teamRoleId, - teamRoleName: teamRoleTable.name, + teamUserRoleId: teamUsersTable.teamUserRoleId, + teamUserRoleName: teamUserRolesTable.name, isTeamLeader: teamUsersTable.isTeamLeader, }) .from(teamUsersTable) .innerJoin(usersTable, eq(teamUsersTable.id, usersTable.id)) .innerJoin( - teamRoleTable, - eq(teamUsersTable.teamRoleId, teamRoleTable.id), + teamUserRolesTable, + eq(teamUsersTable.teamUserRoleId, teamUserRolesTable.id), ) .limit(queryParameters.limit) .offset(queryParameters.offset) diff --git a/src/request-handling/users.ts b/src/request-handling/users.ts index ae41884..4284a91 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, - teamRoleId: serialIdParser, + teamUserRoleId: serialIdParser, isTeamLeader: z.boolean().optional(), username: z.string().nonempty(), }) diff --git a/src/response-handling/users.ts b/src/response-handling/users.ts index 1727ffd..61525b4 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({ teamRoleName: z.string() }) + .extend({ teamUserRoleName: z.string() }) .strict() .readonly(); export type TeamUser = z.infer; From 52d0ed660f08f932e215f358d18b010ee50f0b4c Mon Sep 17 00:00:00 2001 From: Kristoffer Fredrik Dahle Melen Date: Tue, 20 Oct 2026 11:43:51 +0200 Subject: [PATCH 6/6] Fixed biome lint issues. --- db/tables/team-roles.ts | 6 +++--- db/tables/users.ts | 3 +-- src/db-access/users.ts | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/db/tables/team-roles.ts b/db/tables/team-roles.ts index 5201b1d..9f80c02 100644 --- a/db/tables/team-roles.ts +++ b/db/tables/team-roles.ts @@ -2,6 +2,6 @@ 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(), -}); \ No newline at end of file + id: serial("id").primaryKey(), + name: text("name").notNull().unique(), +}); diff --git a/db/tables/users.ts b/db/tables/users.ts index 5a3db14..cf1583d 100644 --- a/db/tables/users.ts +++ b/db/tables/users.ts @@ -6,8 +6,8 @@ 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 { teamSemesterUsersTable } from "./team-semester-user"; import { teamUserRolesTable } from "./team-roles"; +import { teamSemesterUsersTable } from "./team-semester-user"; export const usersTable = mainSchema.table("users", { id: serial("id").primaryKey(), @@ -32,7 +32,6 @@ export const usersRelations = relations(usersTable, ({ one, many }) => ({ assistantUser: one(assistantUsersTable), })); - export const teamUsersTable = mainSchema.table("teamUsers", { id: integer("id") .primaryKey() diff --git a/src/db-access/users.ts b/src/db-access/users.ts index 858bf0e..ba4f686 100644 --- a/src/db-access/users.ts +++ b/src/db-access/users.ts @@ -1,10 +1,10 @@ import { database } from "@/db/setup/query-postgres"; +import { teamUserRolesTable } from "@/db/tables/team-roles"; import { assistantUsersTable, teamUsersTable, usersTable, } from "@/db/tables/users"; -import { teamUserRolesTable } from "@/db/tables/team-roles"; import { type OrmResult, handleDatabaseFullfillment,