@speckle/shared
Version:
Shared code between various Speckle JS packages
51 lines • 2.47 kB
JavaScript
;
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