diff --git a/lib/utils/conversion-utils.js b/lib/utils/conversion-utils.js --- a/lib/utils/conversion-utils.js +++ b/lib/utils/conversion-utils.js @@ -5,7 +5,7 @@ import type { TInterface, TType } from 'tcomb'; import { convertIDToNewSchema } from './migration-utils.js'; -import { assertWithValidator, tID } from './validation-utils.js'; +import { assertWithValidator, tID, tUserID } from './validation-utils.js'; import { getPendingThreadID, parsePendingThreadID, @@ -57,6 +57,21 @@ return convertObject(outputValidator, data, [tID], conversionFunction); } +function extractUserIDsFromPayload( + outputValidator: TType, + data: T, +): $ReadOnlyArray { + const result = new Set(); + const conversionFunction = (id: string) => { + result.add(id); + return id; + }; + + convertObject(outputValidator, data, [tUserID], conversionFunction); + + return [...result]; +} + function convertObject( validator: TType, input: I, @@ -141,5 +156,6 @@ export { convertClientIDsToServerIDs, convertServerIDsToClientIDs, + extractUserIDsFromPayload, convertObject, }; diff --git a/lib/utils/conversion-utils.test.js b/lib/utils/conversion-utils.test.js --- a/lib/utils/conversion-utils.test.js +++ b/lib/utils/conversion-utils.test.js @@ -4,10 +4,12 @@ import t from 'tcomb'; import { + extractUserIDsFromPayload, convertServerIDsToClientIDs, convertClientIDsToServerIDs, } from './conversion-utils.js'; import { tShape, tID, idSchemaRegex } from './validation-utils.js'; +import { fetchMessageInfosResponseValidator } from '../types/validators/message-validators.js'; type ComplexType = { +ids: { +[string]: $ReadOnlyArray } }; @@ -84,3 +86,36 @@ ).toStrictEqual(serverData); }); }); + +describe('extractUserIDsFromPayload', () => { + it('should extract all user ids from payload', () => { + const payload = { + rawMessageInfos: [ + { + type: 0, + threadID: '1000', + creatorID: '0', + time: 0, + text: 'test', + id: '2000', + }, + { + type: 0, + threadID: '1000', + creatorID: '1', + time: 0, + text: 'test', + id: '2001', + }, + ], + truncationStatuses: {}, + userInfos: { + ['100']: { id: '100', username: 'test1' }, + ['200']: { id: '200', username: 'test2' }, + }, + }; + expect( + extractUserIDsFromPayload(fetchMessageInfosResponseValidator, payload), + ).toEqual(['0', '1', '100', '200']); + }); +});