( workspaceId: string )
| 261 | } |
| 262 | |
| 263 | export async function getUsersWithPermissions( |
| 264 | workspaceId: string |
| 265 | ): Promise<WorkspaceMemberWithRole[]> { |
| 266 | const ws = await getWorkspaceWithOwner(workspaceId) |
| 267 | if (!ws) return [] |
| 268 | |
| 269 | const explicitRows = await db |
| 270 | .select({ |
| 271 | userId: user.id, |
| 272 | email: user.email, |
| 273 | name: user.name, |
| 274 | image: user.image, |
| 275 | permissionType: permissions.permissionType, |
| 276 | joinedAt: permissions.createdAt, |
| 277 | userOrganizationId: member.organizationId, |
| 278 | }) |
| 279 | .from(permissions) |
| 280 | .innerJoin(user, eq(permissions.userId, user.id)) |
| 281 | .leftJoin(member, eq(member.userId, user.id)) |
| 282 | .where(and(eq(permissions.entityType, 'workspace'), eq(permissions.entityId, workspaceId))) |
| 283 | |
| 284 | const byUser = new Map<string, WorkspaceMemberWithRole>() |
| 285 | |
| 286 | for (const row of explicitRows) { |
| 287 | const isOwner = row.userId === ws.ownerId |
| 288 | byUser.set(row.userId, { |
| 289 | userId: row.userId, |
| 290 | email: row.email, |
| 291 | name: row.name, |
| 292 | image: row.image ?? null, |
| 293 | permissionType: row.permissionType, |
| 294 | isExternal: !isOwner && row.userOrganizationId !== ws.organizationId, |
| 295 | joinedAt: row.joinedAt.toISOString(), |
| 296 | roleSource: isOwner ? 'owner' : 'explicit', |
| 297 | }) |
| 298 | } |
| 299 | |
| 300 | if (ws.organizationId) { |
| 301 | const orgAdmins = await db |
| 302 | .select({ |
| 303 | userId: user.id, |
| 304 | email: user.email, |
| 305 | name: user.name, |
| 306 | image: user.image, |
| 307 | joinedAt: member.createdAt, |
| 308 | }) |
| 309 | .from(member) |
| 310 | .innerJoin(user, eq(member.userId, user.id)) |
| 311 | .where( |
| 312 | and( |
| 313 | eq(member.organizationId, ws.organizationId), |
| 314 | inArray(member.role, [...ORG_ADMIN_ROLES]) |
| 315 | ) |
| 316 | ) |
| 317 | |
| 318 | for (const row of orgAdmins) { |
| 319 | const isOwner = row.userId === ws.ownerId |
| 320 | const existing = byUser.get(row.userId) |
no test coverage detected