diff --git a/lib/permissions/minimally-encoded-raw-thread-info-validators.js b/lib/permissions/minimally-encoded-raw-thread-info-validators.js --- a/lib/permissions/minimally-encoded-raw-thread-info-validators.js +++ b/lib/permissions/minimally-encoded-raw-thread-info-validators.js @@ -8,7 +8,7 @@ } from './minimally-encoded-thread-permissions.js'; import { specialRoleValidator } from './special-roles.js'; import type { - MemberInfo, + MemberInfoWithPermissions, ThreadCurrentUserInfo, RawThreadInfo, RoleInfo, @@ -62,11 +62,12 @@ isDefault: t.maybe(t.Boolean), }); -const memberInfoValidator: TInterface = tShape({ - ...legacyMemberInfoValidator.meta.props, - minimallyEncoded: tBool(true), - permissions: tHexEncodedPermissionsBitmask, -}); +const memberInfoValidator: TInterface = + tShape({ + ...legacyMemberInfoValidator.meta.props, + minimallyEncoded: tBool(true), + permissions: tHexEncodedPermissionsBitmask, + }); const rawThreadInfoValidator: TInterface = tShape( { diff --git a/lib/shared/thread-utils.js b/lib/shared/thread-utils.js --- a/lib/shared/thread-utils.js +++ b/lib/shared/thread-utils.js @@ -42,7 +42,7 @@ import type { RelativeMemberInfo, RawThreadInfo, - MemberInfo, + MemberInfoWithPermissions, RoleInfo, ThreadInfo, } from '../types/minimally-encoded-thread-permissions-types.js'; @@ -135,7 +135,7 @@ return _mapValues((threadInfo: ThreadInfo) => { const keyedMembers = _keyBy('id')(threadInfo.members); const keyedMembersToRole = _mapValues( - (member: MemberInfo | RelativeMemberInfo) => { + (member: MemberInfoWithPermissions | RelativeMemberInfo) => { return member.role ? threadInfo.roles[member.role] : null; }, )(keyedMembers); @@ -300,7 +300,7 @@ } function threadActualMembers( - memberInfos: $ReadOnlyArray, + memberInfos: $ReadOnlyArray, ): $ReadOnlyArray { return memberInfos .filter(memberInfo => memberInfo.role) @@ -308,7 +308,7 @@ } function threadOtherMembers< - T: LegacyMemberInfo | MemberInfo | RelativeMemberInfo, + T: LegacyMemberInfo | MemberInfoWithPermissions | RelativeMemberInfo, >(memberInfos: $ReadOnlyArray, viewerID: ?string): $ReadOnlyArray { return memberInfos.filter( memberInfo => memberInfo.role && memberInfo.id !== viewerID, @@ -966,7 +966,7 @@ // Since we don't have access to all of the ancestor ThreadInfos, we approximate // "parent admin" as anybody with CHANGE_ROLE permissions. function memberHasAdminPowers( - memberInfo: LegacyMemberInfo | MemberInfo | ServerMemberInfo, + memberInfo: LegacyMemberInfo | MemberInfoWithPermissions | ServerMemberInfo, ): boolean { if (memberInfo.minimallyEncoded) { return hasPermission(memberInfo.permissions, threadPermissions.CHANGE_ROLE); diff --git a/lib/types/minimally-encoded-thread-permissions-types.js b/lib/types/minimally-encoded-thread-permissions-types.js --- a/lib/types/minimally-encoded-thread-permissions-types.js +++ b/lib/types/minimally-encoded-thread-permissions-types.js @@ -99,7 +99,7 @@ }; }; -export type MemberInfo = $ReadOnly<{ +export type MemberInfoWithPermissions = $ReadOnly<{ ...LegacyMemberInfo, +minimallyEncoded: true, +permissions: string, @@ -107,7 +107,7 @@ const minimallyEncodeMemberInfo = ( memberInfo: LegacyMemberInfo, -): MemberInfo => { +): MemberInfoWithPermissions => { invariant( !('minimallyEncoded' in memberInfo), 'memberInfo is already minimally encoded.', @@ -120,7 +120,7 @@ }; const decodeMinimallyEncodedMemberInfo = ( - minimallyEncodedMemberInfo: MemberInfo, + minimallyEncodedMemberInfo: MemberInfoWithPermissions, ): LegacyMemberInfo => { const { minimallyEncoded, ...rest } = minimallyEncodedMemberInfo; return { @@ -143,7 +143,7 @@ export type RawThreadInfo = $ReadOnly<{ ...LegacyRawThreadInfo, +minimallyEncoded: true, - +members: $ReadOnlyArray, + +members: $ReadOnlyArray, +roles: { +[id: string]: RoleInfo }, +currentUser: ThreadCurrentUserInfo, }>; diff --git a/lib/utils/thread-ops-utils.js b/lib/utils/thread-ops-utils.js --- a/lib/utils/thread-ops-utils.js +++ b/lib/utils/thread-ops-utils.js @@ -8,7 +8,7 @@ threadCurrentUserInfoValidator, } from '../permissions/minimally-encoded-raw-thread-info-validators.js'; import type { - MemberInfo, + MemberInfoWithPermissions, RawThreadInfo, RoleInfo, } from '../types/minimally-encoded-thread-permissions-types.js'; @@ -46,8 +46,8 @@ ): RawThreadInfo { // 1. Validate and potentially minimally encode `rawMembers`. const rawMembers = JSON.parse(clientDBThreadInfo.members); - const minimallyEncodedMembers: $ReadOnlyArray = rawMembers.map( - rawMember => { + const minimallyEncodedMembers: $ReadOnlyArray = + rawMembers.map(rawMember => { invariant( memberInfoValidator.is(rawMember) || legacyMemberInfoValidator.is(rawMember), @@ -56,8 +56,7 @@ return rawMember.minimallyEncoded ? rawMember : minimallyEncodeMemberInfo(rawMember); - }, - ); + }); // 2. Validate and potentially minimally encode `rawRoles`. const rawRoles = JSON.parse(clientDBThreadInfo.roles);