diff --git a/keyserver/src/creators/role-creator.js b/keyserver/src/creators/role-creator.js --- a/keyserver/src/creators/role-creator.js +++ b/keyserver/src/creators/role-creator.js @@ -1,14 +1,7 @@ // @flow -import { - type RoleInfo, - threadPermissions, - threadPermissionPropagationPrefixes, - threadPermissionFilterPrefixes, - type ThreadRolePermissionsBlob, - type ThreadType, - threadTypes, -} from 'lib/types/thread-types.js'; +import { getRolePermissionBlobs } from 'lib/permissions/thread-permissions.js'; +import type { RoleInfo, ThreadType } from 'lib/types/thread-types.js'; import createIDs from './id-creator.js'; import { dbQuery, SQL } from '../database/database.js'; @@ -65,255 +58,4 @@ }; } -type RolePermissionBlobs = { - +Members: ThreadRolePermissionsBlob, - +Admins?: ThreadRolePermissionsBlob, -}; - -const { CHILD, DESCENDANT } = threadPermissionPropagationPrefixes; -const { OPEN, TOP_LEVEL, OPEN_TOP_LEVEL } = threadPermissionFilterPrefixes; -const OPEN_CHILD = CHILD + OPEN; -const OPEN_DESCENDANT = DESCENDANT + OPEN; -const TOP_LEVEL_DESCENDANT = DESCENDANT + TOP_LEVEL; -const OPEN_TOP_LEVEL_DESCENDANT = DESCENDANT + OPEN_TOP_LEVEL; - -const voicedPermissions = { - [threadPermissions.VOICED]: true, - [threadPermissions.EDIT_ENTRIES]: true, - [threadPermissions.EDIT_THREAD_NAME]: true, - [threadPermissions.EDIT_THREAD_COLOR]: true, - [threadPermissions.EDIT_THREAD_DESCRIPTION]: true, - [threadPermissions.EDIT_THREAD_AVATAR]: true, - [threadPermissions.CREATE_SUBCHANNELS]: true, - [threadPermissions.ADD_MEMBERS]: true, -}; - -function getRolePermissionBlobsForCommunity( - threadType: ThreadType, -): RolePermissionBlobs { - const openDescendantKnowOf = OPEN_DESCENDANT + threadPermissions.KNOW_OF; - const openDescendantVisible = OPEN_DESCENDANT + threadPermissions.VISIBLE; - const openTopLevelDescendantJoinThread = - OPEN_TOP_LEVEL_DESCENDANT + threadPermissions.JOIN_THREAD; - const openChildJoinThread = OPEN_CHILD + threadPermissions.JOIN_THREAD; - const openChildAddMembers = OPEN_CHILD + threadPermissions.ADD_MEMBERS; - - const genesisMemberPermissions = { - [threadPermissions.KNOW_OF]: true, - [threadPermissions.VISIBLE]: true, - [openDescendantKnowOf]: true, - [openDescendantVisible]: true, - [openTopLevelDescendantJoinThread]: true, - }; - const baseMemberPermissions = { - ...genesisMemberPermissions, - [threadPermissions.REACT_TO_MESSAGE]: true, - [threadPermissions.EDIT_MESSAGE]: true, - [threadPermissions.LEAVE_THREAD]: true, - [threadPermissions.CREATE_SIDEBARS]: true, - [threadPermissions.ADD_MEMBERS]: true, - [openChildJoinThread]: true, - [openChildAddMembers]: true, - }; - - let memberPermissions; - if (threadType === threadTypes.COMMUNITY_ANNOUNCEMENT_ROOT) { - memberPermissions = baseMemberPermissions; - } else if (threadType === threadTypes.GENESIS) { - memberPermissions = genesisMemberPermissions; - } else { - memberPermissions = { - ...baseMemberPermissions, - ...voicedPermissions, - }; - } - - const descendantKnowOf = DESCENDANT + threadPermissions.KNOW_OF; - const descendantVisible = DESCENDANT + threadPermissions.VISIBLE; - const topLevelDescendantJoinThread = - TOP_LEVEL_DESCENDANT + threadPermissions.JOIN_THREAD; - const childJoinThread = CHILD + threadPermissions.JOIN_THREAD; - const descendantVoiced = DESCENDANT + threadPermissions.VOICED; - const descendantEditEntries = DESCENDANT + threadPermissions.EDIT_ENTRIES; - const descendantEditThreadName = - DESCENDANT + threadPermissions.EDIT_THREAD_NAME; - const descendantEditThreadColor = - DESCENDANT + threadPermissions.EDIT_THREAD_COLOR; - const descendantEditThreadDescription = - DESCENDANT + threadPermissions.EDIT_THREAD_DESCRIPTION; - const descendantEditThreadAvatar = - DESCENDANT + threadPermissions.EDIT_THREAD_AVATAR; - const topLevelDescendantCreateSubchannels = - TOP_LEVEL_DESCENDANT + threadPermissions.CREATE_SUBCHANNELS; - const topLevelDescendantCreateSidebars = - TOP_LEVEL_DESCENDANT + threadPermissions.CREATE_SIDEBARS; - const descendantAddMembers = DESCENDANT + threadPermissions.ADD_MEMBERS; - const descendantDeleteThread = DESCENDANT + threadPermissions.DELETE_THREAD; - const descendantEditPermissions = - DESCENDANT + threadPermissions.EDIT_PERMISSIONS; - const descendantRemoveMembers = DESCENDANT + threadPermissions.REMOVE_MEMBERS; - const descendantChangeRole = DESCENDANT + threadPermissions.CHANGE_ROLE; - const descendantManagePins = DESCENDANT + threadPermissions.MANAGE_PINS; - - const baseAdminPermissions = { - [threadPermissions.KNOW_OF]: true, - [threadPermissions.VISIBLE]: true, - [threadPermissions.VOICED]: true, - [threadPermissions.REACT_TO_MESSAGE]: true, - [threadPermissions.EDIT_MESSAGE]: true, - [threadPermissions.EDIT_ENTRIES]: true, - [threadPermissions.EDIT_THREAD_NAME]: true, - [threadPermissions.EDIT_THREAD_COLOR]: true, - [threadPermissions.EDIT_THREAD_DESCRIPTION]: true, - [threadPermissions.EDIT_THREAD_AVATAR]: true, - [threadPermissions.CREATE_SUBCHANNELS]: true, - [threadPermissions.CREATE_SIDEBARS]: true, - [threadPermissions.ADD_MEMBERS]: true, - [threadPermissions.DELETE_THREAD]: true, - [threadPermissions.REMOVE_MEMBERS]: true, - [threadPermissions.CHANGE_ROLE]: true, - [threadPermissions.MANAGE_PINS]: true, - [descendantKnowOf]: true, - [descendantVisible]: true, - [topLevelDescendantJoinThread]: true, - [childJoinThread]: true, - [descendantVoiced]: true, - [descendantEditEntries]: true, - [descendantEditThreadName]: true, - [descendantEditThreadColor]: true, - [descendantEditThreadDescription]: true, - [descendantEditThreadAvatar]: true, - [topLevelDescendantCreateSubchannels]: true, - [topLevelDescendantCreateSidebars]: true, - [descendantAddMembers]: true, - [descendantDeleteThread]: true, - [descendantEditPermissions]: true, - [descendantRemoveMembers]: true, - [descendantChangeRole]: true, - [descendantManagePins]: true, - }; - - let adminPermissions; - if (threadType === threadTypes.GENESIS) { - adminPermissions = baseAdminPermissions; - } else { - adminPermissions = { - ...baseAdminPermissions, - [threadPermissions.LEAVE_THREAD]: true, - }; - } - - return { - Members: memberPermissions, - Admins: adminPermissions, - }; -} - -function getRolePermissionBlobs(threadType: ThreadType): RolePermissionBlobs { - if (threadType === threadTypes.SIDEBAR) { - const memberPermissions = { - [threadPermissions.VOICED]: true, - [threadPermissions.REACT_TO_MESSAGE]: true, - [threadPermissions.EDIT_MESSAGE]: true, - [threadPermissions.EDIT_THREAD_NAME]: true, - [threadPermissions.EDIT_THREAD_COLOR]: true, - [threadPermissions.EDIT_THREAD_DESCRIPTION]: true, - [threadPermissions.EDIT_THREAD_AVATAR]: true, - [threadPermissions.ADD_MEMBERS]: true, - [threadPermissions.EDIT_PERMISSIONS]: true, - [threadPermissions.REMOVE_MEMBERS]: true, - [threadPermissions.LEAVE_THREAD]: true, - }; - return { - Members: memberPermissions, - }; - } - - const openDescendantKnowOf = OPEN_DESCENDANT + threadPermissions.KNOW_OF; - const openDescendantVisible = OPEN_DESCENDANT + threadPermissions.VISIBLE; - const openChildJoinThread = OPEN_CHILD + threadPermissions.JOIN_THREAD; - - if (threadType === threadTypes.PRIVATE) { - const memberPermissions = { - [threadPermissions.KNOW_OF]: true, - [threadPermissions.VISIBLE]: true, - [threadPermissions.VOICED]: true, - [threadPermissions.REACT_TO_MESSAGE]: true, - [threadPermissions.EDIT_MESSAGE]: true, - [threadPermissions.EDIT_THREAD_COLOR]: true, - [threadPermissions.EDIT_THREAD_DESCRIPTION]: true, - [threadPermissions.CREATE_SIDEBARS]: true, - [threadPermissions.EDIT_ENTRIES]: true, - [openDescendantKnowOf]: true, - [openDescendantVisible]: true, - [openChildJoinThread]: true, - }; - return { - Members: memberPermissions, - }; - } - - if (threadType === threadTypes.PERSONAL) { - return { - Members: { - [threadPermissions.KNOW_OF]: true, - [threadPermissions.VISIBLE]: true, - [threadPermissions.VOICED]: true, - [threadPermissions.REACT_TO_MESSAGE]: true, - [threadPermissions.EDIT_MESSAGE]: true, - [threadPermissions.EDIT_ENTRIES]: true, - [threadPermissions.EDIT_THREAD_NAME]: true, - [threadPermissions.EDIT_THREAD_COLOR]: true, - [threadPermissions.EDIT_THREAD_DESCRIPTION]: true, - [threadPermissions.CREATE_SIDEBARS]: true, - [openDescendantKnowOf]: true, - [openDescendantVisible]: true, - [openChildJoinThread]: true, - }, - }; - } - - const openTopLevelDescendantJoinThread = - OPEN_TOP_LEVEL_DESCENDANT + threadPermissions.JOIN_THREAD; - - const subthreadBasePermissions = { - [threadPermissions.KNOW_OF]: true, - [threadPermissions.VISIBLE]: true, - [threadPermissions.REACT_TO_MESSAGE]: true, - [threadPermissions.EDIT_MESSAGE]: true, - [threadPermissions.CREATE_SIDEBARS]: true, - [threadPermissions.LEAVE_THREAD]: true, - [openDescendantKnowOf]: true, - [openDescendantVisible]: true, - [openTopLevelDescendantJoinThread]: true, - [openChildJoinThread]: true, - }; - - if ( - threadType === threadTypes.COMMUNITY_OPEN_SUBTHREAD || - threadType === threadTypes.COMMUNITY_SECRET_SUBTHREAD - ) { - const memberPermissions = { - [threadPermissions.REMOVE_MEMBERS]: true, - [threadPermissions.EDIT_PERMISSIONS]: true, - ...subthreadBasePermissions, - ...voicedPermissions, - }; - return { - Members: memberPermissions, - }; - } - - if ( - threadType === threadTypes.COMMUNITY_OPEN_ANNOUNCEMENT_SUBTHREAD || - threadType === threadTypes.COMMUNITY_SECRET_ANNOUNCEMENT_SUBTHREAD - ) { - return { - Members: subthreadBasePermissions, - }; - } - - return getRolePermissionBlobsForCommunity(threadType); -} - -export { createInitialRolesForNewThread, getRolePermissionBlobs }; +export { createInitialRolesForNewThread }; diff --git a/keyserver/src/creators/thread-creator.js b/keyserver/src/creators/thread-creator.js --- a/keyserver/src/creators/thread-creator.js +++ b/keyserver/src/creators/thread-creator.js @@ -4,6 +4,7 @@ import bots from 'lib/facts/bots.js'; import genesis from 'lib/facts/genesis.js'; +import { getRolePermissionBlobs } from 'lib/permissions/thread-permissions.js'; import { generatePendingThreadColor, generateRandomColor, @@ -27,10 +28,7 @@ import createIDs from './id-creator.js'; import createMessages from './message-creator.js'; -import { - createInitialRolesForNewThread, - getRolePermissionBlobs, -} from './role-creator.js'; +import { createInitialRolesForNewThread } from './role-creator.js'; import type { UpdatesForCurrentSession } from './update-creator.js'; import { dbQuery, SQL } from '../database/database.js'; import { diff --git a/keyserver/src/updaters/role-updaters.js b/keyserver/src/updaters/role-updaters.js --- a/keyserver/src/updaters/role-updaters.js +++ b/keyserver/src/updaters/role-updaters.js @@ -3,10 +3,10 @@ import invariant from 'invariant'; import _isEqual from 'lodash/fp/isEqual.js'; +import { getRolePermissionBlobs } from 'lib/permissions/thread-permissions.js'; import type { ThreadType } from 'lib/types/thread-types.js'; import createIDs from '../creators/id-creator.js'; -import { getRolePermissionBlobs } from '../creators/role-creator.js'; import { dbQuery, SQL } from '../database/database.js'; import { fetchRoles } from '../fetchers/role-fetchers.js'; import type { Viewer } from '../session/viewer.js'; @@ -49,7 +49,9 @@ const setAdminQuery = SQL` UPDATE memberships SET role = ${id} - WHERE thread = ${threadID} AND user = ${viewer.userID} AND role > 0 + WHERE thread = ${threadID} + AND user = ${viewer.userID} + AND role > 0 `; promises.push(dbQuery(setAdminQuery)); } else if (!rolePermissions.Admins && currentRolePermissions.Admins) { @@ -59,13 +61,17 @@ ); const id = currentRoleIDs.Admins; const deleteQuery = SQL` - DELETE r, i FROM roles r LEFT JOIN ids i ON i.id = r.id WHERE r.id = ${id} + DELETE r, i + FROM roles r + LEFT JOIN ids i ON i.id = r.id + WHERE r.id = ${id} `; promises.push(dbQuery(deleteQuery)); const updateMembershipsQuery = SQL` UPDATE memberships SET role = ${currentRoleIDs.Members} - WHERE thread = ${threadID} AND role > 0 + WHERE thread = ${threadID} + AND role > 0 `; promises.push(dbQuery(updateMembershipsQuery)); } diff --git a/keyserver/src/updaters/thread-updaters.js b/keyserver/src/updaters/thread-updaters.js --- a/keyserver/src/updaters/thread-updaters.js +++ b/keyserver/src/updaters/thread-updaters.js @@ -1,5 +1,6 @@ // @flow +import { getRolePermissionBlobs } from 'lib/permissions/thread-permissions.js'; import { filteredThreadIDs } from 'lib/selectors/calendar-filter-selectors.js'; import { getPinnedContentFromMessage } from 'lib/shared/message-utils.js'; import { @@ -41,7 +42,6 @@ commitMembershipChangeset, } from './thread-permission-updaters.js'; import createMessages from '../creators/message-creator.js'; -import { getRolePermissionBlobs } from '../creators/role-creator.js'; import { createUpdates } from '../creators/update-creator.js'; import { dbQuery, SQL } from '../database/database.js'; import { fetchEntryInfos } from '../fetchers/entry-fetchers.js'; @@ -93,7 +93,8 @@ const query = SQL` SELECT user, role FROM memberships - WHERE user IN (${memberIDs}) AND thread = ${request.threadID} + WHERE user IN (${memberIDs}) + AND thread = ${request.threadID} `; const [result] = await dbQuery(query); @@ -168,7 +169,8 @@ SELECT m.user, m.role, t.default_role FROM memberships m LEFT JOIN threads t ON t.id = m.thread - WHERE m.user IN (${memberIDs}) AND m.thread = ${request.threadID} + WHERE m.user IN (${memberIDs}) + AND m.thread = ${request.threadID} `; const [result] = await dbQuery(query); @@ -951,8 +953,10 @@ const togglePinQuery = SQL` UPDATE messages - SET pinned = ${pinnedValue}, pin_time = ${pinTimeValue} - WHERE id = ${messageID} AND thread = ${threadID} + SET pinned = ${pinnedValue}, + pin_time = ${pinTimeValue} + WHERE id = ${messageID} + AND thread = ${threadID} `; const messageData = { 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 @@ -13,6 +13,8 @@ type ThreadPermissionsInfo, threadPermissions, threadPermissionPropagationPrefixes, + threadPermissionFilterPrefixes, + threadTypes, } from '../types/thread-types.js'; function permissionLookup( @@ -150,10 +152,262 @@ } } +type RolePermissionBlobs = { + +Members: ThreadRolePermissionsBlob, + +Admins?: ThreadRolePermissionsBlob, +}; + +const { CHILD, DESCENDANT } = threadPermissionPropagationPrefixes; +const { OPEN, TOP_LEVEL, OPEN_TOP_LEVEL } = threadPermissionFilterPrefixes; +const OPEN_CHILD = CHILD + OPEN; +const OPEN_DESCENDANT = DESCENDANT + OPEN; +const TOP_LEVEL_DESCENDANT = DESCENDANT + TOP_LEVEL; +const OPEN_TOP_LEVEL_DESCENDANT = DESCENDANT + OPEN_TOP_LEVEL; + +const voicedPermissions = { + [threadPermissions.VOICED]: true, + [threadPermissions.EDIT_ENTRIES]: true, + [threadPermissions.EDIT_THREAD_NAME]: true, + [threadPermissions.EDIT_THREAD_COLOR]: true, + [threadPermissions.EDIT_THREAD_DESCRIPTION]: true, + [threadPermissions.EDIT_THREAD_AVATAR]: true, + [threadPermissions.CREATE_SUBCHANNELS]: true, + [threadPermissions.ADD_MEMBERS]: true, +}; + +function getRolePermissionBlobsForCommunity( + threadType: ThreadType, +): RolePermissionBlobs { + const openDescendantKnowOf = OPEN_DESCENDANT + threadPermissions.KNOW_OF; + const openDescendantVisible = OPEN_DESCENDANT + threadPermissions.VISIBLE; + const openTopLevelDescendantJoinThread = + OPEN_TOP_LEVEL_DESCENDANT + threadPermissions.JOIN_THREAD; + const openChildJoinThread = OPEN_CHILD + threadPermissions.JOIN_THREAD; + const openChildAddMembers = OPEN_CHILD + threadPermissions.ADD_MEMBERS; + + const genesisMemberPermissions = { + [threadPermissions.KNOW_OF]: true, + [threadPermissions.VISIBLE]: true, + [openDescendantKnowOf]: true, + [openDescendantVisible]: true, + [openTopLevelDescendantJoinThread]: true, + }; + const baseMemberPermissions = { + ...genesisMemberPermissions, + [threadPermissions.REACT_TO_MESSAGE]: true, + [threadPermissions.EDIT_MESSAGE]: true, + [threadPermissions.LEAVE_THREAD]: true, + [threadPermissions.CREATE_SIDEBARS]: true, + [threadPermissions.ADD_MEMBERS]: true, + [openChildJoinThread]: true, + [openChildAddMembers]: true, + }; + + let memberPermissions; + if (threadType === threadTypes.COMMUNITY_ANNOUNCEMENT_ROOT) { + memberPermissions = baseMemberPermissions; + } else if (threadType === threadTypes.GENESIS) { + memberPermissions = genesisMemberPermissions; + } else { + memberPermissions = { + ...baseMemberPermissions, + ...voicedPermissions, + }; + } + + const descendantKnowOf = DESCENDANT + threadPermissions.KNOW_OF; + const descendantVisible = DESCENDANT + threadPermissions.VISIBLE; + const topLevelDescendantJoinThread = + TOP_LEVEL_DESCENDANT + threadPermissions.JOIN_THREAD; + const childJoinThread = CHILD + threadPermissions.JOIN_THREAD; + const descendantVoiced = DESCENDANT + threadPermissions.VOICED; + const descendantEditEntries = DESCENDANT + threadPermissions.EDIT_ENTRIES; + const descendantEditThreadName = + DESCENDANT + threadPermissions.EDIT_THREAD_NAME; + const descendantEditThreadColor = + DESCENDANT + threadPermissions.EDIT_THREAD_COLOR; + const descendantEditThreadDescription = + DESCENDANT + threadPermissions.EDIT_THREAD_DESCRIPTION; + const descendantEditThreadAvatar = + DESCENDANT + threadPermissions.EDIT_THREAD_AVATAR; + const topLevelDescendantCreateSubchannels = + TOP_LEVEL_DESCENDANT + threadPermissions.CREATE_SUBCHANNELS; + const topLevelDescendantCreateSidebars = + TOP_LEVEL_DESCENDANT + threadPermissions.CREATE_SIDEBARS; + const descendantAddMembers = DESCENDANT + threadPermissions.ADD_MEMBERS; + const descendantDeleteThread = DESCENDANT + threadPermissions.DELETE_THREAD; + const descendantEditPermissions = + DESCENDANT + threadPermissions.EDIT_PERMISSIONS; + const descendantRemoveMembers = DESCENDANT + threadPermissions.REMOVE_MEMBERS; + const descendantChangeRole = DESCENDANT + threadPermissions.CHANGE_ROLE; + const descendantManagePins = DESCENDANT + threadPermissions.MANAGE_PINS; + + const baseAdminPermissions = { + [threadPermissions.KNOW_OF]: true, + [threadPermissions.VISIBLE]: true, + [threadPermissions.VOICED]: true, + [threadPermissions.REACT_TO_MESSAGE]: true, + [threadPermissions.EDIT_MESSAGE]: true, + [threadPermissions.EDIT_ENTRIES]: true, + [threadPermissions.EDIT_THREAD_NAME]: true, + [threadPermissions.EDIT_THREAD_COLOR]: true, + [threadPermissions.EDIT_THREAD_DESCRIPTION]: true, + [threadPermissions.EDIT_THREAD_AVATAR]: true, + [threadPermissions.CREATE_SUBCHANNELS]: true, + [threadPermissions.CREATE_SIDEBARS]: true, + [threadPermissions.ADD_MEMBERS]: true, + [threadPermissions.DELETE_THREAD]: true, + [threadPermissions.REMOVE_MEMBERS]: true, + [threadPermissions.CHANGE_ROLE]: true, + [threadPermissions.MANAGE_PINS]: true, + [descendantKnowOf]: true, + [descendantVisible]: true, + [topLevelDescendantJoinThread]: true, + [childJoinThread]: true, + [descendantVoiced]: true, + [descendantEditEntries]: true, + [descendantEditThreadName]: true, + [descendantEditThreadColor]: true, + [descendantEditThreadDescription]: true, + [descendantEditThreadAvatar]: true, + [topLevelDescendantCreateSubchannels]: true, + [topLevelDescendantCreateSidebars]: true, + [descendantAddMembers]: true, + [descendantDeleteThread]: true, + [descendantEditPermissions]: true, + [descendantRemoveMembers]: true, + [descendantChangeRole]: true, + [descendantManagePins]: true, + }; + + let adminPermissions; + if (threadType === threadTypes.GENESIS) { + adminPermissions = baseAdminPermissions; + } else { + adminPermissions = { + ...baseAdminPermissions, + [threadPermissions.LEAVE_THREAD]: true, + }; + } + + return { + Members: memberPermissions, + Admins: adminPermissions, + }; +} + +function getRolePermissionBlobs(threadType: ThreadType): RolePermissionBlobs { + if (threadType === threadTypes.SIDEBAR) { + const memberPermissions = { + [threadPermissions.VOICED]: true, + [threadPermissions.REACT_TO_MESSAGE]: true, + [threadPermissions.EDIT_MESSAGE]: true, + [threadPermissions.EDIT_THREAD_NAME]: true, + [threadPermissions.EDIT_THREAD_COLOR]: true, + [threadPermissions.EDIT_THREAD_DESCRIPTION]: true, + [threadPermissions.EDIT_THREAD_AVATAR]: true, + [threadPermissions.ADD_MEMBERS]: true, + [threadPermissions.EDIT_PERMISSIONS]: true, + [threadPermissions.REMOVE_MEMBERS]: true, + [threadPermissions.LEAVE_THREAD]: true, + }; + return { + Members: memberPermissions, + }; + } + + const openDescendantKnowOf = OPEN_DESCENDANT + threadPermissions.KNOW_OF; + const openDescendantVisible = OPEN_DESCENDANT + threadPermissions.VISIBLE; + const openChildJoinThread = OPEN_CHILD + threadPermissions.JOIN_THREAD; + + if (threadType === threadTypes.PRIVATE) { + const memberPermissions = { + [threadPermissions.KNOW_OF]: true, + [threadPermissions.VISIBLE]: true, + [threadPermissions.VOICED]: true, + [threadPermissions.REACT_TO_MESSAGE]: true, + [threadPermissions.EDIT_MESSAGE]: true, + [threadPermissions.EDIT_THREAD_COLOR]: true, + [threadPermissions.EDIT_THREAD_DESCRIPTION]: true, + [threadPermissions.CREATE_SIDEBARS]: true, + [threadPermissions.EDIT_ENTRIES]: true, + [openDescendantKnowOf]: true, + [openDescendantVisible]: true, + [openChildJoinThread]: true, + }; + return { + Members: memberPermissions, + }; + } + + if (threadType === threadTypes.PERSONAL) { + return { + Members: { + [threadPermissions.KNOW_OF]: true, + [threadPermissions.VISIBLE]: true, + [threadPermissions.VOICED]: true, + [threadPermissions.REACT_TO_MESSAGE]: true, + [threadPermissions.EDIT_MESSAGE]: true, + [threadPermissions.EDIT_ENTRIES]: true, + [threadPermissions.EDIT_THREAD_NAME]: true, + [threadPermissions.EDIT_THREAD_COLOR]: true, + [threadPermissions.EDIT_THREAD_DESCRIPTION]: true, + [threadPermissions.CREATE_SIDEBARS]: true, + [openDescendantKnowOf]: true, + [openDescendantVisible]: true, + [openChildJoinThread]: true, + }, + }; + } + + const openTopLevelDescendantJoinThread = + OPEN_TOP_LEVEL_DESCENDANT + threadPermissions.JOIN_THREAD; + + const subthreadBasePermissions = { + [threadPermissions.KNOW_OF]: true, + [threadPermissions.VISIBLE]: true, + [threadPermissions.REACT_TO_MESSAGE]: true, + [threadPermissions.EDIT_MESSAGE]: true, + [threadPermissions.CREATE_SIDEBARS]: true, + [threadPermissions.LEAVE_THREAD]: true, + [openDescendantKnowOf]: true, + [openDescendantVisible]: true, + [openTopLevelDescendantJoinThread]: true, + [openChildJoinThread]: true, + }; + + if ( + threadType === threadTypes.COMMUNITY_OPEN_SUBTHREAD || + threadType === threadTypes.COMMUNITY_SECRET_SUBTHREAD + ) { + const memberPermissions = { + [threadPermissions.REMOVE_MEMBERS]: true, + [threadPermissions.EDIT_PERMISSIONS]: true, + ...subthreadBasePermissions, + ...voicedPermissions, + }; + return { + Members: memberPermissions, + }; + } + + if ( + threadType === threadTypes.COMMUNITY_OPEN_ANNOUNCEMENT_SUBTHREAD || + threadType === threadTypes.COMMUNITY_SECRET_ANNOUNCEMENT_SUBTHREAD + ) { + return { + Members: subthreadBasePermissions, + }; + } + + return getRolePermissionBlobsForCommunity(threadType); +} + export { permissionLookup, getAllThreadPermissions, makePermissionsBlob, makePermissionsForChildrenBlob, getRoleForPermissions, + getRolePermissionBlobs, };