diff --git a/lib/ops/message-store-ops.js b/lib/ops/message-store-ops.js --- a/lib/ops/message-store-ops.js +++ b/lib/ops/message-store-ops.js @@ -1,6 +1,7 @@ // @flow import { type BaseStoreOpsHandlers } from './base-ops.js'; +import { threadSpecs } from '../shared/threads/thread-specs.js'; import type { ClientDBMessageInfo, ClientDBThreadMessageInfo, @@ -10,6 +11,7 @@ LocalMessageInfo, ClientDBLocalMessageInfo, } from '../types/message-types.js'; +import { type MixedRawThreadInfos } from '../types/thread-types.js'; import { translateClientDBMessageInfoToRawMessageInfo, translateRawMessageInfoToClientDBMessageInfo, @@ -29,7 +31,7 @@ export type ReplaceMessageOperation = { +type: 'replace', - +payload: { +id: string, +messageInfo: RawMessageInfo }, + +payload: { +id: string, +messageInfo: RawMessageInfo, +isBackedUp: boolean }, }; export type RekeyMessageOperation = { @@ -112,7 +114,7 @@ | RemoveMessageStoreLocalMessageInfosOperation | RemoveMessageStoreAllLocalMessageInfosOperation; -export const messageStoreOpsHandlers: BaseStoreOpsHandlers< +const messageStoreOpsHandlers: BaseStoreOpsHandlers< MessageStore, MessageStoreOperation, ClientDBMessageStoreOperation, @@ -246,3 +248,27 @@ ); }, }; + +function createReplaceMessageOperation( + id: string, + messageInfo: RawMessageInfo, + threadInfos: MixedRawThreadInfos, +): ReplaceMessageOperation { + const threadInfo = threadInfos[messageInfo.threadID]; + if (!threadInfo) { + return { + type: 'replace', + payload: { id, messageInfo, isBackedUp: true }, + }; + } + return { + type: 'replace', + payload: { + id, + messageInfo, + isBackedUp: threadSpecs[threadInfo.type].protocol.dataIsBackedUp, + }, + }; +} + +export { messageStoreOpsHandlers, createReplaceMessageOperation }; diff --git a/lib/reducers/message-reducer.js b/lib/reducers/message-reducer.js --- a/lib/reducers/message-reducer.js +++ b/lib/reducers/message-reducer.js @@ -61,8 +61,8 @@ import { messageStoreOpsHandlers, type MessageStoreOperation, - type ReplaceMessageOperation, type ReplaceMessageStoreLocalMessageInfoOperation, + createReplaceMessageOperation, } from '../ops/message-store-ops.js'; import { pendingToRealizedThreadIDsSelector } from '../selectors/thread-selectors.js'; import { @@ -174,11 +174,12 @@ const orderedMessageInfos = sortMessageInfoList(unshimmed); const messages = _keyBy(messageID)(orderedMessageInfos); - const messageStoreReplaceOperations = orderedMessageInfos.map( - messageInfo => ({ - type: 'replace', - payload: { id: messageID(messageInfo), messageInfo }, - }), + const messageStoreReplaceOperations = orderedMessageInfos.map(messageInfo => + createReplaceMessageOperation( + messageID(messageInfo), + messageInfo, + threadInfos, + ), ); const threadsToMessageIDs = @@ -260,11 +261,11 @@ continue; } - const updateMsgOperation: ReplaceMessageOperation = { - type: 'replace', - payload: { id: storeMessageID, messageInfo: messages[storeMessageID] }, - }; - + const updateMsgOperation = createReplaceMessageOperation( + storeMessageID, + messages[storeMessageID], + threadInfos, + ); messageStoreOperations.push(updateMsgOperation); } @@ -603,10 +604,9 @@ const newMessages = _keyBy(messageID)(orderedNewMessageInfos); for (const id in newMessages) { - newMessageOps.push({ - type: 'replace', - payload: { id, messageInfo: newMessages[id] }, - }); + newMessageOps.push( + createReplaceMessageOperation(id, newMessages[id], threadInfos), + ); } if (localIDsToServerIDs.size > 0) { @@ -1119,10 +1119,7 @@ } const messageStoreOperations: MessageStoreOperation[] = [ - { - type: 'replace', - payload: { id: localID, messageInfo: payload }, - }, + createReplaceMessageOperation(localID, payload, newThreadInfos), ]; let updatedThreads; @@ -1304,10 +1301,13 @@ time: payload.time, }; newMessages[payload.serverID] = newMessage; - messageStoreOperations.push({ - type: 'replace', - payload: { id: payload.serverID, messageInfo: newMessage }, - }); + messageStoreOperations.push( + createReplaceMessageOperation( + payload.serverID, + newMessage, + newThreadInfos, + ), + ); const threadID = payload.threadID; const newMessageIDs = _flow( _uniq, @@ -1642,13 +1642,7 @@ ); const messageStoreOperations = [ - { - type: 'replace', - payload: { - id, - messageInfo: updatedMessage, - }, - }, + createReplaceMessageOperation(id, updatedMessage, newThreadInfos), ]; const processedMessageStore = processMessageStoreOperations( @@ -1685,10 +1679,7 @@ }; const messageStoreOperations = [ - { - type: 'replace', - payload: { id: localID, messageInfo }, - }, + createReplaceMessageOperation(localID, messageInfo, newThreadInfos), { type: 'replace_threads', payload: { diff --git a/native/redux/unshim-utils.js b/native/redux/unshim-utils.js --- a/native/redux/unshim-utils.js +++ b/native/redux/unshim-utils.js @@ -1,9 +1,11 @@ // @flow import { + createReplaceMessageOperation, type MessageStoreOperation, messageStoreOpsHandlers, } from 'lib/ops/message-store-ops.js'; +import { threadStoreOpsHandlers } from 'lib/ops/thread-store-ops.js'; import { messageID } from 'lib/shared/id-utils.js'; import { unshimFunc } from 'lib/shared/unshim-utils.js'; import { type MessageType } from 'lib/types/message-types-enum.js'; @@ -24,10 +26,14 @@ unshimTypes: $ReadOnlyArray, handleMigrationFailure?: AppState => AppState, ): MigrationResult { - // 1. Get messages from SQLite `messages` table. + // 1. Get threads and messages from SQLite `threads` and `messages` tables. + const clientDBThreadInfos = commCoreModule.getAllThreadsSync(); const clientDBMessageInfos = commCoreModule.getInitialMessagesSync(); - // 2. Translate `ClientDBMessageInfo`s to `RawMessageInfo`s. + // 2. Translate `ClientDBThreadInfo`s to `RawThreadInfo`s and + // `ClientDBMessageInfo`s to `RawMessageInfo`s. + const rawThreadInfos = + threadStoreOpsHandlers.translateClientDBData(clientDBThreadInfos); const rawMessageInfos = clientDBMessageInfos.map( translateClientDBMessageInfoToRawMessageInfo, ); @@ -43,10 +49,13 @@ { type: 'remove_all', }, - ...unshimmedRawMessageInfos.map((message: RawMessageInfo) => ({ - type: 'replace', - payload: { id: messageID(message), messageInfo: message }, - })), + ...unshimmedRawMessageInfos.map((message: RawMessageInfo) => + createReplaceMessageOperation( + messageID(message), + message, + rawThreadInfos, + ), + ), ]; // 5. Try processing `ClientDBMessageStoreOperation`s and log out if diff --git a/web/redux/initial-state-gate.js b/web/redux/initial-state-gate.js --- a/web/redux/initial-state-gate.js +++ b/web/redux/initial-state-gate.js @@ -182,7 +182,10 @@ messageStoreOperations = [ ...entries(messages).map(([id, messageInfo]) => ({ type: 'replace', - payload: { id, messageInfo }, + // This code is responsible for migrating keyserver messages to + // SQLite, which means this data shouldn't be included in the + // backup because it is owned by keyserver. + payload: { id, messageInfo, isBackedUp: false }, })), { type: 'replace_threads', diff --git a/web/redux/unshim-utils.js b/web/redux/unshim-utils.js --- a/web/redux/unshim-utils.js +++ b/web/redux/unshim-utils.js @@ -1,16 +1,19 @@ // @flow import { + createReplaceMessageOperation, type MessageStoreOperation, messageStoreOpsHandlers, } from 'lib/ops/message-store-ops.js'; import { messageID } from 'lib/shared/id-utils.js'; import { unshimFunc } from 'lib/shared/unshim-utils.js'; +import { databaseIdentifier } from 'lib/types/database-identifier-types.js'; import { type MessageType } from 'lib/types/message-types-enum.js'; import type { RawMessageInfo, ClientDBMessageInfo, } from 'lib/types/message-types.js'; +import { getConfig } from 'lib/utils/config.js'; import { translateClientDBMessageInfoToRawMessageInfo } from 'lib/utils/message-ops-utils.js'; import type { MigrationResult } from 'lib/utils/migration-utils.js'; @@ -39,12 +42,11 @@ } // 2. Get existing `stores` from SQLite. - const stores = await sharedWorker.schedule({ - type: workerRequestMessageTypes.GET_CLIENT_STORE, - }); + const clientStore = await getConfig().sqliteAPI.getClientDBStore( + databaseIdentifier.MAIN, + ); - const messages: ?$ReadOnlyArray = - stores?.store?.messages; + const messages: ?$ReadOnlyArray = clientStore?.messages; if (messages === null || messages === undefined || messages.length === 0) { return { @@ -69,10 +71,13 @@ { type: 'remove_all', }, - ...unshimmedRawMessageInfos.map((message: RawMessageInfo) => ({ - type: 'replace', - payload: { id: messageID(message), messageInfo: message }, - })), + ...unshimmedRawMessageInfos.map((message: RawMessageInfo) => + createReplaceMessageOperation( + messageID(message), + message, + clientStore?.threadStore?.threadInfos ?? {}, + ), + ), ]; // 6. Process the constructed `messageStoreOperations`.