diff --git a/src/db-access/users.ts b/src/db-access/users.ts index 8493bf4..8c60c73 100644 --- a/src/db-access/users.ts +++ b/src/db-access/users.ts @@ -23,6 +23,7 @@ import type { UserKey, } from "@/src/response-handling/users"; import { eq, inArray } from "drizzle-orm"; +import type { TeamKey } from "../response-handling/teams"; export async function selectUsersById( userIds: UserKey[], @@ -138,6 +139,35 @@ export async function selectTeamUsers( .then(handleDatabaseFullfillment, handleDatabaseRejection); } +export async function selectTeamUsersByTeamid( + queryParameters: QueryParameters, + teamIds: TeamKey[], +): Promise> { + return await database + .transaction(async (tx) => { + const selectResult = await tx + .select({ + id: usersTable.id, + firstName: usersTable.firstName, + lastName: usersTable.lastName, + fieldOfStudyId: usersTable.fieldOfStudyId, + bankAccountNumber: usersTable.bankAccountNumber, + phoneNumber: usersTable.phoneNumber, + personalEmail: usersTable.personalEmail, + teamId: teamUsersTable.teamId, + username: teamUsersTable.username, + }) + .from(teamUsersTable) + .innerJoin(usersTable, eq(teamUsersTable.id, usersTable.id)) + .limit(queryParameters.limit) + .offset(queryParameters.offset) + .where(inArray(teamUsersTable.teamId, teamIds)); + + return selectResult; + }) + .then(handleDatabaseFullfillment, handleDatabaseRejection); +} + export async function selectAssistantUsers( queryParameters: QueryParameters, ): Promise> { diff --git a/src/routers/users.ts b/src/routers/users.ts index 747d15b..5567cd8 100644 --- a/src/routers/users.ts +++ b/src/routers/users.ts @@ -6,6 +6,7 @@ import { selectAssistantUsersById, selectTeamUsers, selectTeamUsersById, + selectTeamUsersByTeamid, selectUsers, selectUsersById, } from "@/src/db-access/users"; @@ -213,6 +214,54 @@ teamUsersRouter.get("", async (req, res, next) => { res.json(databaseResult.data); }); +/** + * @openapi + * /users/team-members: + * get: + * tags: [users] + * summary: Get team member users for spesific team + * description: Get team member users for spesific team + * parameters: + * - $ref: "#/components/parameters/limit" + * - $ref: "#/components/parameters/offset" + * - $ref: "#/components/parameters/sort" + * responses: + * 200: + * description: Successfull response + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/teamUser/{teamId}" + */ +teamUsersRouter.get("/teamId/:teamId", async (req, res, next) => { + const queryParameterResult = toListQueryParser.safeParse(req.query); + const teamIdRequest = toSerialIdParser.safeParse(req.params.teamId); + if (!queryParameterResult.success) { + return next( + clientError(400, "Invalid request format", queryParameterResult.error), + ); + } + if (!teamIdRequest.success) { + return next( + clientError(400, "Invalid request format", teamIdRequest.error), + ); + } + const databaseResult = await selectTeamUsersByTeamid( + queryParameterResult.data, + [teamIdRequest.data], + ); + if (!databaseResult.success) { + return next( + clientError( + 400, + "Failed to retrieve data from the database", + databaseResult.error, + ), + ); + } + res.json(databaseResult.data); +}); + /** * @openapi * /users/assistants: