@speckle/shared
Version:
Shared code between various Speckle JS packages
48 lines • 1.88 kB
JavaScript
import { err, ok } from 'true-myth/result';
import { WorkspacePlanNoFeatureAccessError } from '../../domain/authErrors.js';
import { ensureImplicitProjectMemberWithWriteAccessFragment, ensureMinimumProjectRoleFragment } from '../../fragments/projects.js';
import { Roles } from '../../../core/constants.js';
export const canUpdateEmbedTokensPolicy = (loaders) => async ({ userId, projectId }) => {
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=canUpdateEmbedTokens.js.map