diff --git a/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h b/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h --- a/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h +++ b/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h @@ -168,6 +168,8 @@ virtual std::vector getAllInboundP2PMessage() const = 0; virtual void removeInboundP2PMessages(const std::vector &ids) const = 0; + virtual std::vector + getRelatedMessages(const std::string &messageID) const = 0; #ifdef EMSCRIPTEN virtual std::vector getAllThreadsWeb() const = 0; @@ -175,6 +177,8 @@ virtual std::vector getAllMessagesWeb() const = 0; virtual void replaceMessageWeb(const WebMessage &message) const = 0; virtual NullableString getOlmPersistAccountDataWeb(int accountID) const = 0; + virtual std::vector + getRelatedMessagesWeb(const std::string &messageID) const = 0; #else virtual void createMainCompaction(std::string backupID) const = 0; virtual void captureBackupLogs() const = 0; diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h --- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h +++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h @@ -181,6 +181,8 @@ std::vector getAllInboundP2PMessage() const override; void removeInboundP2PMessages(const std::vector &ids) const override; + std::vector + getRelatedMessages(const std::string &messageID) const override; #ifdef EMSCRIPTEN std::vector getAllThreadsWeb() const override; @@ -188,6 +190,8 @@ std::vector getAllMessagesWeb() const override; void replaceMessageWeb(const WebMessage &message) const override; NullableString getOlmPersistAccountDataWeb(int accountID) const override; + std::vector + getRelatedMessagesWeb(const std::string &messageID) const override; #else static void clearSensitiveData(); static void initialize(std::string &databasePath); diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp --- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp +++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp @@ -2418,6 +2418,24 @@ SQLiteQueryExecutor::getConnection(), removeMessagesSQLStream.str(), ids); } +std::vector +SQLiteQueryExecutor::getRelatedMessages(const std::string &messageID) const { + static std::string getMessageSQL = + "SELECT * " + "FROM messages " + "LEFT JOIN media " + " ON messages.id = media.container " + "WHERE messages.id = ? OR messages.target_message = ? " + "ORDER BY messages.time DESC"; + comm::SQLiteStatementWrapper preparedSQL( + SQLiteQueryExecutor::getConnection(), + getMessageSQL, + "Failed to get latest message edit"); + bindStringToSQL(messageID.c_str(), preparedSQL, 1); + bindStringToSQL(messageID.c_str(), preparedSQL, 2); + return this->processMessagesResults(preparedSQL); +} + #ifdef EMSCRIPTEN std::vector SQLiteQueryExecutor::getAllThreadsWeb() const { auto threads = this->getAllThreads(); @@ -2437,9 +2455,9 @@ auto allMessages = this->getAllMessages(); std::vector allMessageWithMedias; - for (auto &messageWitMedia : allMessages) { + for (auto &messageWithMedia : allMessages) { allMessageWithMedias.push_back( - {std::move(messageWitMedia.first), messageWitMedia.second}); + {std::move(messageWithMedia.first), messageWithMedia.second}); } return allMessageWithMedias; @@ -2458,6 +2476,19 @@ } return std::make_unique(accountData.value()); } + +std::vector +SQLiteQueryExecutor::getRelatedMessagesWeb(const std::string &messageID) const { + auto relatedMessages = this->getRelatedMessages(messageID); + + std::vector relatedMessagesWithMedias; + for (auto &messageWithMedia : relatedMessages) { + relatedMessagesWithMedias.push_back( + {std::move(messageWithMedia.first), messageWithMedia.second}); + } + + return relatedMessagesWithMedias; +} #else void SQLiteQueryExecutor::clearSensitiveData() { SQLiteQueryExecutor::closeConnection(); diff --git a/web/cpp/SQLiteQueryExecutorBindings.cpp b/web/cpp/SQLiteQueryExecutorBindings.cpp --- a/web/cpp/SQLiteQueryExecutorBindings.cpp +++ b/web/cpp/SQLiteQueryExecutorBindings.cpp @@ -310,7 +310,10 @@ &SQLiteQueryExecutor::getAllInboundP2PMessage) .function( "removeInboundP2PMessages", - &SQLiteQueryExecutor::removeInboundP2PMessages); + &SQLiteQueryExecutor::removeInboundP2PMessages) + .function( + "getRelatedMessagesWeb", + &SQLiteQueryExecutor::getRelatedMessagesWeb); } } // namespace comm diff --git a/web/shared-worker/_generated/comm_query_executor.wasm b/web/shared-worker/_generated/comm_query_executor.wasm index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@, +}; + declare export class SQLiteQueryExecutor { constructor(sqliteFilePath: string): void; @@ -57,10 +62,7 @@ removeAllDrafts(): void; removeDrafts(ids: $ReadOnlyArray): void; - getAllMessagesWeb(): $ReadOnlyArray<{ - +message: WebMessage, - +medias: $ReadOnlyArray, - }>; + getAllMessagesWeb(): $ReadOnlyArray; removeAllMessages(): void; removeMessages(ids: $ReadOnlyArray): void; removeMessagesForThreads(threadIDs: $ReadOnlyArray): void; @@ -190,6 +192,8 @@ getAllInboundP2PMessage(): $ReadOnlyArray; removeInboundP2PMessages(ids: $ReadOnlyArray): void; + getRelatedMessagesWeb(id: string): $ReadOnlyArray; + // method is provided to manually signal that a C++ object // is no longer needed and can be deleted delete(): void;