Files
speckle-server/packages/server/modules/workspaces/helpers/roles.ts
T
Chuck Driesler 8a9659f223 feat(workspaces): workspace member role resolvers (#2540)
* feat(workspaces): update/delete workspace role resolvers

* chore(workspaces): gql tests for role changes

* fix(workspaces): test syntax oops

* fix(workspaces): got it twisted

* fix(workspaces): simplify api surface, better return types

* fix(workspaces): correct role type usage, improve tests

* fix(workspaces): authorize in resolver

* fix(workspaces): correct usage of authorizeResolver
2024-08-01 09:36:52 +01:00

61 lines
1.7 KiB
TypeScript

import { Roles, StreamRoles, WorkspaceRoles } from '@speckle/shared'
import { WorkspaceAcl } from '@/modules/workspacesCore/domain/types'
import { WorkspaceRole } from '@/modules/core/graph/generated/graphql'
export const isUserLastWorkspaceAdmin = (
workspaceRoles: WorkspaceAcl[],
userId: string
): boolean => {
const workspaceAdmins = workspaceRoles.filter(
({ role }) => role === Roles.Workspace.Admin
)
const isUserAdmin = workspaceAdmins.some((role) => role.userId === userId)
return isUserAdmin && workspaceAdmins.length === 1
}
/**
* Given a user's workspace role, return the role they should have for workspace projects.
*/
export const mapWorkspaceRoleToProjectRole = (
workspaceRole: WorkspaceRoles
): StreamRoles => {
switch (workspaceRole) {
case Roles.Workspace.Guest:
case Roles.Workspace.Member:
return Roles.Stream.Reviewer
case Roles.Workspace.Admin:
return Roles.Stream.Owner
}
}
export const mapProjectRoleToWorkspaceRole = (
projectRole: StreamRoles
): WorkspaceRoles => {
switch (projectRole) {
case Roles.Stream.Contributor:
return Roles.Workspace.Member
case Roles.Stream.Reviewer:
return Roles.Workspace.Guest
case Roles.Stream.Owner:
return Roles.Workspace.Admin
}
}
export const mapGqlWorkspaceRoleToMainRole = (
gqlRole: WorkspaceRole
): WorkspaceRoles => {
switch (gqlRole) {
case WorkspaceRole.Admin:
return Roles.Workspace.Admin
case WorkspaceRole.Member:
return Roles.Workspace.Member
case WorkspaceRole.Guest:
return Roles.Workspace.Guest
}
}
export const isWorkspaceRole = (role: string): role is WorkspaceRoles => {
return (Object.values(Roles.Workspace) as string[]).includes(role)
}