diff --git a/lib/permissions/prefixes.js b/lib/permissions/prefixes.js --- a/lib/permissions/prefixes.js +++ b/lib/permissions/prefixes.js @@ -1,14 +1,14 @@ // @flow -import type { - ThreadPermission, - ThreadPermissionFilterPrefix, - ThreadPermissionPropagationPrefix, -} from '../types/thread-permission-types.js'; import { + type ThreadPermission, + type ThreadPermissionFilterPrefix, + type ThreadPermissionPropagationPrefix, + type ThreadPermissionMembershipPrefix, assertThreadPermissions, threadPermissionFilterPrefixes, threadPermissionPropagationPrefixes, + threadPermissionMembershipPrefixes, } from '../types/thread-permission-types.js'; import { threadTypes, @@ -20,6 +20,7 @@ +permission: ThreadPermission, +propagationPrefix: ?ThreadPermissionPropagationPrefix, +filterPrefix: ?ThreadPermissionFilterPrefix, + +membershipPrefix: ?ThreadPermissionMembershipPrefix, }; function parseThreadPermissionString( threadPermissionString: string, @@ -48,9 +49,20 @@ break; } + let membershipPrefix; + for (const key in threadPermissionMembershipPrefixes) { + const prefix = threadPermissionMembershipPrefixes[key]; + if (!remainingString.startsWith(prefix)) { + continue; + } + membershipPrefix = prefix; + remainingString = remainingString.substr(prefix.length); + break; + } + const permission = assertThreadPermissions(remainingString); - return { permission, propagationPrefix, filterPrefix }; + return { permission, propagationPrefix, filterPrefix, membershipPrefix }; } function includeThreadPermissionForThreadType( diff --git a/lib/types/thread-permission-types.js b/lib/types/thread-permission-types.js --- a/lib/types/thread-permission-types.js +++ b/lib/types/thread-permission-types.js @@ -82,6 +82,7 @@ } const threadPermissionValidator = t.enums.of(values(threadPermissions)); + export const threadPermissionPropagationPrefixes = Object.freeze({ DESCENDANT: 'descendant_', CHILD: 'child_', @@ -89,6 +90,7 @@ export type ThreadPermissionPropagationPrefix = $Values< typeof threadPermissionPropagationPrefixes, >; + export const threadPermissionFilterPrefixes = Object.freeze({ // includes only SIDEBAR, COMMUNITY_OPEN_SUBTHREAD, // COMMUNITY_OPEN_ANNOUNCEMENT_SUBTHREAD @@ -103,6 +105,13 @@ typeof threadPermissionFilterPrefixes, >; +export const threadPermissionMembershipPrefixes = Object.freeze({ + MEMBER: 'member_', +}); +export type ThreadPermissionMembershipPrefix = $Values< + typeof threadPermissionMembershipPrefixes, +>; + // These are the set of user-facing permissions that we display as configurable // to the user when they are creating a custom role for their given community. // They are per-community rather than per-thread, so when configured they are