diff --git a/lib/permissions/thread-permissions.js b/lib/permissions/thread-permissions.js --- a/lib/permissions/thread-permissions.js +++ b/lib/permissions/thread-permissions.js @@ -405,6 +405,47 @@ return getRolePermissionBlobsForCommunity(threadType); } +function getUniversalCommunityRootPermissionsBlob( + threadType: ThreadType, +): ThreadRolePermissionsBlob { + const openDescendantKnowOf = DESCENDANT + OPEN + threadPermissions.KNOW_OF; + const openDescendantVoiced = DESCENDANT + OPEN + threadPermissions.VOICED; + const openDescendantVisible = DESCENDANT + OPEN + threadPermissions.VISIBLE; + const openChildJoinThread = CHILD + OPEN + threadPermissions.JOIN_THREAD; + const openTopLevelDescendantJoinThread = + DESCENDANT + OPEN_TOP_LEVEL + threadPermissions.JOIN_THREAD; + + const genesisUniversalCommunityPermissions = { + [threadPermissions.KNOW_OF]: true, + [threadPermissions.VISIBLE]: true, + [openDescendantKnowOf]: true, + [openDescendantVisible]: true, + [openTopLevelDescendantJoinThread]: true, + }; + + const baseUniversalCommunityPermissions = { + ...genesisUniversalCommunityPermissions, + [threadPermissions.JOIN_THREAD]: true, + [threadPermissions.CREATE_SIDEBARS]: true, + [threadPermissions.LEAVE_THREAD]: true, + [openDescendantVoiced]: true, + [openChildJoinThread]: true, + }; + + if (threadType === threadTypes.GENESIS) { + return genesisUniversalCommunityPermissions; + } else if (threadType === threadTypes.COMMUNITY_ANNOUNCEMENT_ROOT) { + return baseUniversalCommunityPermissions; + } else if (threadType === threadTypes.COMMUNITY_ROOT) { + return { + ...baseUniversalCommunityPermissions, + [threadPermissions.VOICED]: true, + }; + } else { + return {}; + } +} + export { permissionLookup, getAllThreadPermissions, @@ -412,4 +453,5 @@ makePermissionsForChildrenBlob, getRoleForPermissions, getRolePermissionBlobs, + getUniversalCommunityRootPermissionsBlob, };