( userId: string, scope: WorkspaceScope = 'active' )
| 82 | * derived from organization owner/admin role. Deduped with explicit rows first. |
| 83 | */ |
| 84 | export async function listAccessibleWorkspaceRowsForUser( |
| 85 | userId: string, |
| 86 | scope: WorkspaceScope = 'active' |
| 87 | ): Promise< |
| 88 | Array<{ workspace: typeof workspaceTable.$inferSelect; permissionType: PermissionType }> |
| 89 | > { |
| 90 | const explicit = await db |
| 91 | .select({ workspace: workspaceTable, permissionType: permissions.permissionType }) |
| 92 | .from(permissions) |
| 93 | .innerJoin(workspaceTable, eq(permissions.entityId, workspaceTable.id)) |
| 94 | .where( |
| 95 | scope === 'all' |
| 96 | ? and(eq(permissions.userId, userId), eq(permissions.entityType, 'workspace')) |
| 97 | : scope === 'archived' |
| 98 | ? and( |
| 99 | eq(permissions.userId, userId), |
| 100 | eq(permissions.entityType, 'workspace'), |
| 101 | sql`${workspaceTable.archivedAt} IS NOT NULL` |
| 102 | ) |
| 103 | : and( |
| 104 | eq(permissions.userId, userId), |
| 105 | eq(permissions.entityType, 'workspace'), |
| 106 | isNull(workspaceTable.archivedAt) |
| 107 | ) |
| 108 | ) |
| 109 | .orderBy(desc(workspaceTable.createdAt)) |
| 110 | |
| 111 | const orgRows = await getOrgAdminWorkspaceRows(userId, scope) |
| 112 | if (orgRows.length === 0) { |
| 113 | return explicit |
| 114 | } |
| 115 | |
| 116 | const orgWorkspaceIds = new Set(orgRows.map((ws) => ws.id)) |
| 117 | const seen = new Set(explicit.map((row) => row.workspace.id)) |
| 118 | |
| 119 | const elevatedExplicit = explicit.map((row) => |
| 120 | orgWorkspaceIds.has(row.workspace.id) ? { ...row, permissionType: 'admin' as const } : row |
| 121 | ) |
| 122 | const derived = orgRows |
| 123 | .filter((ws) => !seen.has(ws.id)) |
| 124 | .map((ws) => ({ workspace: ws, permissionType: 'admin' as const })) |
| 125 | |
| 126 | return [...elevatedExplicit, ...derived] |
| 127 | } |
| 128 | |
| 129 | export async function listUserWorkspaces(userId: string, scope: WorkspaceScope = 'active') { |
| 130 | const rows = await listAccessibleWorkspaceRowsForUser(userId, scope) |
no test coverage detected