diff --git a/keyserver/src/creators/message-creator.js b/keyserver/src/creators/message-creator.js --- a/keyserver/src/creators/message-creator.js +++ b/keyserver/src/creators/message-creator.js @@ -32,6 +32,7 @@ appendSQLArray, mergeOrConditions, } from '../database/database.js'; +import { processMessagesForSearch } from '../database/search-utils.js'; import { fetchMessageInfoForLocalID, fetchMessageInfoByID, @@ -288,6 +289,7 @@ // (1) Sending push notifs // (2) Setting threads to unread and generating corresponding UpdateInfos // (3) Publishing to Redis so that active sockets pass on new messages +// (4) Processing messages for search async function postMessageSend( viewer: Viewer, threadsToMessageIndices: Map, @@ -296,6 +298,8 @@ messageDatas: MessageData[], updatesForCurrentSession: UpdatesForCurrentSession, ) { + processMessagesForSearch(messageInfos); + let joinIndex = 0; let subthreadSelects = ''; const subthreadJoins = []; diff --git a/keyserver/src/database/search-utils.js b/keyserver/src/database/search-utils.js new file mode 100644 --- /dev/null +++ b/keyserver/src/database/search-utils.js @@ -0,0 +1,48 @@ +// @flow + +import natural from 'natural'; + +import type { RawMessageInfo } from 'lib/types/message-types'; +import { messageTypes } from 'lib/types/message-types.js'; + +import { dbQuery, SQL } from '../database/database.js'; + +async function processMessagesForSearch( + messages: $ReadOnlyArray, +): Promise { + const processedMessages = []; + + for (const msg of messages) { + if ( + msg.type !== messageTypes.TEXT && + msg.type !== messageTypes.EDIT_MESSAGE + ) { + continue; + } + + const processed_msg = natural.PorterStemmer.tokenizeAndStem( + msg.text, + false, + ).join(' '); + + if (msg.type === messageTypes.TEXT) { + processedMessages.push([msg.id, msg.id, processed_msg]); + } else { + processedMessages.push([msg.targetMessageID, msg.id, processed_msg]); + } + } + + if (processedMessages.length === 0) { + return; + } + + await dbQuery(SQL` + INSERT INTO search (original_message_id, message_id, processed_content) + VALUES ${processedMessages} + ON DUPLICATE KEY UPDATE + message_id = VALUE(message_id), + processed_content = VALUE(processed_content); + `); +} + +export { processMessagesForSearch };