Files
speckle-server/packages/server/modules/workspaces/services/retrieval.ts
T
Gergő Jedlicska 4a2d85d68c feat(server): web 3485 prevent accounts from creating new workspaces (#4913)
* feat(shared): rename user workspaces loader

* feat(gatekeeper): intoduce the enterprise plan

* chore(server): remove more "magic strings"

* refactor(shared): extract user is workspace admin to an auth fragment

* feat(shared): add can createWorkspacePolicy

* feat(workspaces): WIP block workspace creation

* feat(server): add can create workspace checks

* feat(workspaces): enforce canCreateWorkspace policy on the workspace
creation mutation

* feat(shared): allow workspace admins and guests to create workspaces
even if they are part of an exclusive workspace

* test(shared): use test fake properly

* fix(server): eligble workspace typing fixes

* test(shared): fix more workspace fakes

* fix(workspacesCore): add missing loader

* fix(shared): use proper exhaustive switch cases, they stop bugs from
happening

* feat(shared): introduce workspacePlanHasAccessToFeature function with tests

* chore(workspaces): fix more PR comments

* fix(workspaces): naming

* fix(workspaces): some more
2025-06-18 08:58:26 +01:00

88 lines
2.5 KiB
TypeScript

import { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import { UserEmail } from '@/modules/core/domain/userEmails/types'
import {
GetUserDiscoverableWorkspaces,
GetUsersCurrentAndEligibleToBecomeAMemberWorkspaces,
GetWorkspaceRolesForUser,
GetWorkspaces
} from '@/modules/workspaces/domain/operations'
import { LimitedWorkspace, Workspace } from '@/modules/workspacesCore/domain/types'
type GetDiscoverableWorkspaceForUserArgs = {
userId: string
}
const getUserVerifiedDomains = (userEmails: UserEmail[]): string[] =>
userEmails.filter((email) => email.verified).map((email) => email.email.split('@')[1])
export const getDiscoverableWorkspacesForUserFactory =
({
findEmailsByUserId,
getDiscoverableWorkspaces
}: {
findEmailsByUserId: FindEmailsByUserId
getDiscoverableWorkspaces: GetUserDiscoverableWorkspaces
}) =>
async ({
userId
}: GetDiscoverableWorkspaceForUserArgs): Promise<LimitedWorkspace[]> => {
const userEmails = await findEmailsByUserId({ userId })
const userVerifiedDomains = getUserVerifiedDomains(userEmails)
const workspaces = await getDiscoverableWorkspaces({
domains: userVerifiedDomains,
userId
})
return workspaces
}
export const getUsersCurrentAndEligibleToBecomeAMemberWorkspaces =
({
findEmailsByUserId,
getUserEligibleWorkspaces
}: {
findEmailsByUserId: FindEmailsByUserId
getUserEligibleWorkspaces: GetUsersCurrentAndEligibleToBecomeAMemberWorkspaces
}) =>
async ({
userId
}: GetDiscoverableWorkspaceForUserArgs): Promise<LimitedWorkspace[]> => {
const userEmails = await findEmailsByUserId({ userId })
const userVerifiedDomains = getUserVerifiedDomains(userEmails)
const workspaces = await getUserEligibleWorkspaces({
domains: userVerifiedDomains,
userId
})
return workspaces
}
type GetWorkspacesForUserArgs = {
userId: string
completed?: boolean
search?: string
}
export const getWorkspacesForUserFactory =
({
getWorkspaces,
getWorkspaceRolesForUser
}: {
getWorkspaces: GetWorkspaces
getWorkspaceRolesForUser: GetWorkspaceRolesForUser
}) =>
async ({
userId,
completed,
search
}: GetWorkspacesForUserArgs): Promise<Workspace[]> => {
const workspaceRoles = await getWorkspaceRolesForUser({ userId })
const workspaceIds = workspaceRoles.map((workspace) => {
return workspace.workspaceId
})
const workspaces = await getWorkspaces({ workspaceIds, completed, search })
return workspaces
}