UNPKG

@speckle/shared

Version:

Shared code between various Speckle JS packages

74 lines (69 loc) 2.53 kB
import { err, ok } from 'true-myth/result' import { MaybeUserContext, ProjectContext } from '../../../domain/context.js' import { AuthPolicy } from '../../../domain/policies.js' import { ensureMinimumServerRoleFragment } from '../../../fragments/server.js' import { Loaders } from '../../../domain/loaders.js' import { ProjectNoAccessError, ProjectNotEnoughPermissionsError, ProjectNotFoundError, ServerNoAccessError, ServerNoSessionError, ServerNotEnoughPermissionsError, WorkspaceNoAccessError, WorkspaceNotEnoughPermissionsError, WorkspaceSsoSessionNoAccessError } from '../../../domain/authErrors.js' import { ensureImplicitProjectMemberWithWriteAccessFragment } from '../../../fragments/projects.js' import { Roles } from '../../../../core/constants.js' import { ProjectVisibility } from '../../../domain/projects/types.js' export const canCreateProjectCommentPolicy: AuthPolicy< | typeof Loaders.getProject | typeof Loaders.getServerRole | typeof Loaders.getEnv | typeof Loaders.getWorkspaceRole | typeof Loaders.getWorkspace | typeof Loaders.getWorkspaceSsoProvider | typeof Loaders.getWorkspaceSsoSession | typeof Loaders.getProjectRole, MaybeUserContext & ProjectContext, InstanceType< | typeof ProjectNoAccessError | typeof ProjectNotFoundError | typeof WorkspaceNoAccessError | typeof ServerNoAccessError | typeof ServerNoSessionError | typeof WorkspaceSsoSessionNoAccessError | typeof WorkspaceNotEnoughPermissionsError | typeof ProjectNotEnoughPermissionsError | typeof ServerNotEnoughPermissionsError > > = (loaders) => async ({ userId, projectId }) => { // Ensure server access const ensuredServerRole = await ensureMinimumServerRoleFragment(loaders)({ userId }) if (ensuredServerRole.isErr) { return err(ensuredServerRole.error) } // Check if public commenting enabled const project = await loaders.getProject({ projectId }) if (!project) return err(new ProjectNotFoundError()) const allowPublicCommenting = project.visibility === ProjectVisibility.Public && project.allowPublicComments if (allowPublicCommenting) return ok() // Not public, ensure proper project write access const ensuredWriteAccess = await ensureImplicitProjectMemberWithWriteAccessFragment( loaders )({ userId, projectId, role: Roles.Stream.Reviewer }) if (ensuredWriteAccess.isErr) { return err(ensuredWriteAccess.error) } return ok() }