Files
speckle-server/packages/server/modules/workspaces/domain/logic.ts
T
Chuck Driesler ac6dd70d27 feat(workspaces): default workspace project role (#3013)
* feat(workspaces): enable default project role in workspace

* fix(workspaces): not satisfying

* chore(workspaces): phrasing

* fix(workspaces): use new field in role mapping

* chore(workspaces): use roles

* fix(workspaces): update tests

* fix(workspaces): more parallel role update errors

* chore(workspaces): like this now

* chore(workspaces): revert changes to deps

* fix(workspaces): assert domain type conversion at gql layer

* fix(workspaces): repair tests

* fix(workspaces): fix more tests
2024-09-17 22:17:10 +02:00

62 lines
1.7 KiB
TypeScript

import { UserEmail } from '@/modules/core/domain/userEmails/types'
import {
WorkspaceDomainsInvalidState,
WorkspaceInvalidUpdateError
} from '@/modules/workspaces/errors/workspace'
import {
WorkspaceDefaultProjectRole,
WorkspaceDomain
} from '@/modules/workspacesCore/domain/types'
import { Roles } from '@speckle/shared'
export const userEmailsCompliantWithWorkspaceDomains = ({
userEmails,
workspaceDomains
}: {
userEmails: UserEmail[]
workspaceDomains: WorkspaceDomain[]
}): boolean =>
anyEmailCompliantWithWorkspaceDomains({
emails: userEmails.filter((e) => e.verified).map((e) => e.email),
workspaceDomains
})
export const anyEmailCompliantWithWorkspaceDomains = ({
emails,
workspaceDomains
}: {
emails: string[]
workspaceDomains: WorkspaceDomain[]
}): boolean => {
const validWorkspaceDomains = workspaceDomains.filter((domain) => domain.verified)
// we must have min 1 domain to validate compliance
if (!validWorkspaceDomains.length) throw new WorkspaceDomainsInvalidState()
for (const email of emails) {
if (validWorkspaceDomains.some((domain) => email.endsWith(domain.domain)))
return true
}
return false
}
/**
* Given an optional string value, assert it is a valid default project role and return it.
*/
export const parseDefaultProjectRole = (
role?: string | null
): WorkspaceDefaultProjectRole | null => {
if (!role) return null
const isValidRole = (role: string): role is WorkspaceDefaultProjectRole => {
const validRoles: string[] = [Roles.Stream.Reviewer, Roles.Stream.Contributor]
return validRoles.includes(role)
}
if (!isValidRole(role)) {
throw new WorkspaceInvalidUpdateError('Provided default project role is invalid')
}
return role
}