From c39ab15694a680440ec1d4ac04883414a154217a Mon Sep 17 00:00:00 2001 From: Kevin Puig <119972216+k-puig@users.noreply.github.com> Date: Sat, 27 Sep 2025 12:26:24 -0400 Subject: [PATCH] Add role type ; include admins in instance user list --- concord-server/schema.prisma | 9 +++-- concord-server/src/routes/userRoutes.ts | 8 +++- concord-server/src/services/userService.ts | 43 +++++++++++++++++++++- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/concord-server/schema.prisma b/concord-server/schema.prisma index 9c2688f..fc43e65 100644 --- a/concord-server/schema.prisma +++ b/concord-server/schema.prisma @@ -31,10 +31,11 @@ model User { } model Role { - User User @relation(fields: [userId], references: [id]) - userId String - Instance Instance @relation(fields: [instanceId], references: [id]) - instanceId String + User User @relation(fields: [userId], references: [id]) + userId String + Instance Instance @relation(fields: [instanceId], references: [id]) + instanceId String + type String @@unique([userId, instanceId]) } diff --git a/concord-server/src/routes/userRoutes.ts b/concord-server/src/routes/userRoutes.ts index c7a46fa..ec25a10 100644 --- a/concord-server/src/routes/userRoutes.ts +++ b/concord-server/src/routes/userRoutes.ts @@ -12,8 +12,12 @@ actions.get("user/:id", async (c) => { } }); -actions.get("instance/:id/users", async (c) => { - const instanceId = c.req.param("id"); +actions.get("user", async (c) => { + const instanceId = c.req.query("instance_id"); + if (!instanceId) { + return c.json({ error: "No instance id provided" }, 400); + } + const userData = await fetchAllUsers(instanceId); if (userData) { return c.json(userData); diff --git a/concord-server/src/services/userService.ts b/concord-server/src/services/userService.ts index 82722b2..d9d7434 100644 --- a/concord-server/src/services/userService.ts +++ b/concord-server/src/services/userService.ts @@ -114,6 +114,47 @@ export async function getAllUsersFrom(instanceId: string): Promise< throw new Error("could not get all users in instance"); } + const admins = await prisma.user.findMany({ + where: { + admin: true + } + }); + if (!admins) { + throw new Error("could not get all admins"); + } + const adminData = await Promise.all( + admins.map(async (u) => { + const adminRoles = await prisma.role.findMany({ + where: { + userId: u.id, + }, + }); + + if (!adminRoles) { + throw new Error("could not get admin roles for admin " + u.id); + } + + return { + id: u.id, + userName: u.username, + nickName: u.nickname, + bio: u.bio, + picture: u.picture, + banner: u.banner, + admin: u.admin, + status: ( + ["online", "offline", "dnd", "idle", "invis"] as const + ).includes(u.status as any) + ? (u.status as "online" | "offline" | "dnd" | "idle" | "invis") + : "offline", + role: adminRoles.map(r => ({ + userId: r.userId, + instanceId: r.instanceId, + })), + } + }) + ) + const userData = await Promise.all( users.map(async (u) => { const userRoles = await prisma.role.findMany({ @@ -143,7 +184,7 @@ export async function getAllUsersFrom(instanceId: string): Promise< }), ); - return userData; + return userData.concat(adminData); } catch (err) { console.log(err); return null;