UNPKG

@speckle/shared

Version:

Shared code between various Speckle JS packages

57 lines 2.27 kB
import { Roles } from '../../../../core/constants.js'; import { WorkspacePlanNoFeatureAccessError } from '../../../domain/authErrors.js'; import { ensureImplicitProjectMemberWithWriteAccessFragment, ensureMinimumProjectRoleFragment } from '../../../fragments/projects.js'; import { ensureCanAccessSavedViewGroupFragment } from '../../../fragments/savedViews.js'; import { err, ok } from 'true-myth/result'; export const canCreateSavedViewGroupTokenPolicy = (loaders) => async ({ userId, projectId, savedViewGroupId }) => { const canUseSavedViews = await ensureCanAccessSavedViewGroupFragment(loaders)({ userId, projectId, savedViewGroupId, access: 'write' }); if (canUseSavedViews.isErr) return err(canUseSavedViews.error); const env = await loaders.getEnv(); const project = await loaders.getProject({ projectId }); if (!!project?.workspaceId && env.FF_WORKSPACES_MODULE_ENABLED) { // Ensure owner-level access and valid plan const ensuredProjectRole = await ensureImplicitProjectMemberWithWriteAccessFragment(loaders)({ userId, projectId, role: Roles.Stream.Owner }); if (ensuredProjectRole.isErr) { return err(ensuredProjectRole.error); } const plan = await loaders.getWorkspacePlan({ workspaceId: project.workspaceId }); switch (plan?.name) { case 'academia': case 'enterprise': case 'pro': case 'proUnlimited': case 'proUnlimitedInvoiced': case 'team': case 'teamUnlimited': case 'teamUnlimitedInvoiced': case 'unlimited': return ok(); case 'free': default: return err(new WorkspacePlanNoFeatureAccessError()); } } else { // Ensure project owner const isProjectOwner = await ensureMinimumProjectRoleFragment(loaders)({ userId: userId, projectId, role: Roles.Stream.Owner }); if (isProjectOwner.isErr) { return err(isProjectOwner.error); } return ok(); } }; //# sourceMappingURL=canCreateSavedViewGroupToken.js.map