diff --git a/lib/permissions/minimally-encoded-thread-permissions-test-data.js b/lib/permissions/minimally-encoded-thread-permissions-test-data.js --- a/lib/permissions/minimally-encoded-thread-permissions-test-data.js +++ b/lib/permissions/minimally-encoded-thread-permissions-test-data.js @@ -1,5 +1,6 @@ // @flow +import { specialRoles } from './special-roles.js'; import type { RawThreadInfo } from '../types/minimally-encoded-thread-permissions-types.js'; import { threadTypes } from '../types/thread-types-enum.js'; import type { LegacyRawThreadInfo } from '../types/thread-types.js'; @@ -352,6 +353,7 @@ '0a9', ], isDefault: true, + specialRole: specialRoles.DEFAULT_ROLE, }, }, currentUser: { diff --git a/lib/permissions/special-roles.js b/lib/permissions/special-roles.js --- a/lib/permissions/special-roles.js +++ b/lib/permissions/special-roles.js @@ -38,8 +38,12 @@ ...role, specialRole: specialRoles.ADMIN_ROLE, }; + } else { + return { + ...role, + specialRole: null, + }; } - return role; } function patchRawThreadInfoWithSpecialRole( diff --git a/lib/permissions/special-roles.test.js b/lib/permissions/special-roles.test.js --- a/lib/permissions/special-roles.test.js +++ b/lib/permissions/special-roles.test.js @@ -17,6 +17,7 @@ name: 'roleName', permissions: ['abc', 'def'], isDefault: true, + specialRole: specialRoles.DEFAULT_ROLE, }; const patchedRole = patchRoleInfoWithSpecialRole(role); expect(patchedRole.specialRole).toBe(specialRoles.DEFAULT_ROLE); @@ -29,21 +30,23 @@ name: 'Admins', permissions: ['abc', 'def'], isDefault: false, + specialRole: specialRoles.ADMIN_ROLE, }; const patchedRole = patchRoleInfoWithSpecialRole(role); expect(patchedRole.specialRole).toBe(specialRoles.ADMIN_ROLE); }); - it('should correctly set undefined', () => { + it('should correctly set null', () => { const role: RoleInfo = { minimallyEncoded: true, id: 'roleID', name: 'BLAH', permissions: ['abc', 'def'], isDefault: false, + specialRole: null, }; const patchedRole = patchRoleInfoWithSpecialRole(role); - expect(patchedRole.specialRole).toBe(undefined); + expect(patchedRole.specialRole).toBe(null); }); }); @@ -82,6 +85,7 @@ name: 'Members', permissions: ['000', '010', '005', '015', '0a7'], isDefault: true, + specialRole: specialRoles.DEFAULT_ROLE, minimallyEncoded: true, }, '256|83796': { @@ -128,6 +132,7 @@ '156', ], isDefault: false, + specialRole: specialRoles.ADMIN_ROLE, minimallyEncoded: true, }, }, @@ -193,6 +198,7 @@ '0a9', ], isDefault: false, + specialRole: null, minimallyEncoded: true, }, }, @@ -222,6 +228,6 @@ ); expect( patchedRawThreadInfos['256|83814'].roles['256|83815'].specialRole, - ).toBe(undefined); + ).toBe(null); }); }); diff --git a/lib/reducers/calendar-filters-reducer.test.js b/lib/reducers/calendar-filters-reducer.test.js --- a/lib/reducers/calendar-filters-reducer.test.js +++ b/lib/reducers/calendar-filters-reducer.test.js @@ -5,6 +5,7 @@ removeKeyserverThreadIDsFromFilterList, } from './calendar-filters-reducer.js'; import { keyserverAuthActionTypes } from '../actions/user-actions.js'; +import { specialRoles } from '../permissions/special-roles.js'; import type { RawMessageInfo } from '../types/message-types.js'; import type { ThreadStore } from '../types/thread-types'; @@ -49,6 +50,7 @@ name: 'Members', permissions: ['000', '010', '005', '015', '0a7'], isDefault: true, + specialRole: specialRoles.DEFAULT_ROLE, minimallyEncoded: true, }, '256|83796': { @@ -56,6 +58,7 @@ name: 'Admins', permissions: ['000', '010', '005', '015', '0a7'], isDefault: false, + specialRole: specialRoles.ADMIN_ROLE, minimallyEncoded: true, }, }, @@ -106,6 +109,7 @@ name: 'Members', permissions: ['000', '010', '005', '015', '0a7'], isDefault: true, + specialRole: specialRoles.DEFAULT_ROLE, minimallyEncoded: true, }, }, diff --git a/lib/shared/thread-utils.test.js b/lib/shared/thread-utils.test.js --- a/lib/shared/thread-utils.test.js +++ b/lib/shared/thread-utils.test.js @@ -5,6 +5,7 @@ threadInfoFromRawThreadInfo, } from './thread-utils.js'; import { threadInfoValidator } from '../permissions/minimally-encoded-thread-permissions-validators.js'; +import { specialRoles } from '../permissions/special-roles.js'; import type { RawThreadInfo } from '../types/minimally-encoded-thread-permissions-types.js'; import { threadTypes } from '../types/thread-types-enum.js'; import type { UserInfos } from '../types/user-types.js'; @@ -108,6 +109,7 @@ name: 'Members', permissions: ['000', '010', '005', '015', '0a7'], isDefault: true, + specialRole: specialRoles.DEFAULT_ROLE, minimallyEncoded: true, }, '83796': { @@ -154,6 +156,7 @@ '156', ], isDefault: false, + specialRole: specialRoles.ADMIN_ROLE, minimallyEncoded: true, }, }, 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 @@ -18,13 +18,15 @@ threadRolePermissionsBlobToBitmaskArray, } from '../permissions/minimally-encoded-thread-permissions.js'; import type { SpecialRole } from '../permissions/special-roles.js'; +import { specialRoles } from '../permissions/special-roles.js'; +import { roleIsAdminRole, roleIsDefaultRole } from '../shared/thread-utils.js'; import type { ThreadEntity } from '../utils/entity-text.js'; export type RoleInfo = $ReadOnly<{ ...ClientLegacyRoleInfo, +minimallyEncoded: true, +permissions: $ReadOnlyArray, - +specialRole?: ?SpecialRole, + +specialRole: ?SpecialRole, }>; const minimallyEncodeRoleInfo = (roleInfo: ClientLegacyRoleInfo): RoleInfo => { @@ -32,10 +34,17 @@ !('minimallyEncoded' in roleInfo), 'roleInfo is already minimally encoded.', ); + let specialRole: ?SpecialRole; + if (roleIsDefaultRole(roleInfo)) { + specialRole = specialRoles.DEFAULT_ROLE; + } else if (roleIsAdminRole(roleInfo)) { + specialRole = specialRoles.ADMIN_ROLE; + } return { ...roleInfo, minimallyEncoded: true, permissions: threadRolePermissionsBlobToBitmaskArray(roleInfo.permissions), + specialRole, }; };