Skip to content

Commit 673ae39

Browse files
fix(workspaces): keep platform admin in org context when org lacks team plan
1 parent 0501fb8 commit 673ae39

2 files changed

Lines changed: 53 additions & 0 deletions

File tree

apps/sim/lib/workspaces/policy.test.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,46 @@ describe('getWorkspaceCreationPolicy', () => {
232232
expect(mockGetHighestPrioritySubscription).not.toHaveBeenCalled()
233233
})
234234

235+
it('keeps platform admins in org context when the org lacks a team plan', async () => {
236+
mockGetUserOrganization.mockResolvedValueOnce({
237+
organizationId: 'org-1',
238+
role: 'admin',
239+
memberId: 'member-1',
240+
})
241+
mockGetOrganizationSubscription.mockResolvedValueOnce(null)
242+
mockDbResults.value = [[{ role: 'admin' }], [{ userId: 'owner-1' }]]
243+
244+
const result = await getWorkspaceCreationPolicy({
245+
userId: 'admin-user',
246+
activeOrganizationId: 'org-1',
247+
})
248+
249+
expect(result.canCreate).toBe(true)
250+
expect(result.workspaceMode).toBe(WORKSPACE_MODE.ORGANIZATION)
251+
expect(result.organizationId).toBe('org-1')
252+
expect(result.billedAccountUserId).toBe('owner-1')
253+
expect(mockGetHighestPrioritySubscription).not.toHaveBeenCalled()
254+
})
255+
256+
it('blocks platform admins who are only org members from creating org workspaces', async () => {
257+
mockGetUserOrganization.mockResolvedValueOnce({
258+
organizationId: 'org-1',
259+
role: 'member',
260+
memberId: 'member-1',
261+
})
262+
mockGetOrganizationSubscription.mockResolvedValueOnce(null)
263+
mockDbResults.value = [[{ role: 'admin' }], [{ value: 0 }]]
264+
265+
const result = await getWorkspaceCreationPolicy({
266+
userId: 'admin-user',
267+
activeOrganizationId: 'org-1',
268+
})
269+
270+
expect(result.canCreate).toBe(true)
271+
expect(result.workspaceMode).toBe(WORKSPACE_MODE.PERSONAL)
272+
expect(result.organizationId).toBeNull()
273+
})
274+
235275
it('still enforces plan limits for non-admin users', async () => {
236276
mockDbResults.value = [[{ role: 'user' }], [{ value: 1 }]]
237277

apps/sim/lib/workspaces/policy.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,19 @@ export async function getWorkspaceCreationPolicy({
277277
}
278278

279279
if (await isPlatformAdmin(userId)) {
280+
if (organizationId && orgRole && ['owner', 'admin'].includes(orgRole)) {
281+
return {
282+
canCreate: true,
283+
workspaceMode: WORKSPACE_MODE.ORGANIZATION,
284+
organizationId,
285+
billedAccountUserId: await requireOrganizationOwnerId(organizationId),
286+
maxWorkspaces: null,
287+
currentWorkspaceCount: 0,
288+
reason: null,
289+
status: 200,
290+
}
291+
}
292+
280293
return {
281294
canCreate: true,
282295
workspaceMode: WORKSPACE_MODE.PERSONAL,

0 commit comments

Comments
 (0)