UNPKG

@speckle/shared

Version:

Shared code between various Speckle JS packages

51 lines 2.47 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.canCreateWorkspacePolicy = void 0; const result_1 = require("true-myth/result"); const authErrors_js_1 = require("../../domain/authErrors.js"); const workspaces_js_1 = require("../../fragments/workspaces.js"); const server_js_1 = require("../../fragments/server.js"); const constants_js_1 = require("../../../core/constants.js"); const index_js_1 = require("../../../core/index.js"); const canCreateWorkspacePolicy = (loaders) => async ({ userId }) => { const ensuredWorkspacesEnabled = await (0, workspaces_js_1.ensureWorkspacesEnabledFragment)(loaders)({}); if (ensuredWorkspacesEnabled.isErr) return (0, result_1.err)(ensuredWorkspacesEnabled.error); const ensuredServerRole = await (0, server_js_1.ensureMinimumServerRoleFragment)(loaders)({ userId, role: constants_js_1.Roles.Server.User }); if (ensuredServerRole.isErr) return (0, result_1.err)(ensuredServerRole.error); // userId is not null here, ensured by the serverRoleFragment const workspaces = await loaders.getUsersCurrentAndEligibleToBecomeAMemberWorkspaces({ userId: userId }); const isUserEligibleForExclusiveWorkspaces = workspaces.some((w) => { if (w.isExclusive) { // if the user has no role in the workspace, means they are eligible // to join it via an invite or discovery if (!w.role) return true; // for exclusive workspaces, if the user has a role, some of them are not affected by this policy // ie.: Workspace admins of exclusive workspaces should be able to create new ones // also guests should not be bound by this rule switch (w.role) { case constants_js_1.Roles.Workspace.Admin: case constants_js_1.Roles.Workspace.Guest: return false; case constants_js_1.Roles.Workspace.Member: return true; default: (0, index_js_1.throwUncoveredError)(w.role); } } return false; }); if (isUserEligibleForExclusiveWorkspaces) { return (0, result_1.err)(new authErrors_js_1.EligibleForExclusiveWorkspaceError()); } return (0, result_1.ok)(); }; exports.canCreateWorkspacePolicy = canCreateWorkspacePolicy; //# sourceMappingURL=canCreateWorkspace.js.map