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, @@ -182,6 +183,8 @@ `; const messageInsertPromise = dbQuery(messageInsertQuery); + const processMessages = processMessagesForSearch(returnMessageInfos); + const postMessageSendPromise = postMessageSend( viewer, threadsToMessageIndices, @@ -201,6 +204,7 @@ await Promise.all([ messageInsertPromise, updateRepliesCount(threadsToMessageIndices, newMessageDatas), + processMessages, viewer.isScriptViewer ? postMessageSendPromise : undefined, ]); 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 };