From 13a873196e6bad6250a75af8292da9ddea9fef59 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 1 Dec 2017 10:55:35 +0100 Subject: [PATCH] feat(MainDb): add get unread chat messages impl --- src/chat/chat-room/chat-room.cpp | 10 ++----- src/db/main-db.cpp | 47 ++++++++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index 090fd3811..c70159a27 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -443,15 +443,9 @@ void ChatRoom::markAsRead () { if (getUnreadChatMessagesCount() == 0) return; - shared_ptr core = getCore(); - if (!core) - return; - - CorePrivate *dCore = core->getPrivate(); + CorePrivate *dCore = getCore()->getPrivate(); const string peerAddress = getPeerAddress().asString(); - list> chatMessages = dCore->mainDb->getUnreadChatMessages(d->chatRoomId); - - for (auto &chatMessage : chatMessages) + for (auto &chatMessage : dCore->mainDb->getUnreadChatMessages(d->chatRoomId)) chatMessage->sendDisplayNotification(); dCore->mainDb->markChatMessagesAsRead(d->chatRoomId); diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 6b391029c..376a41663 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1548,13 +1548,56 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), } list> MainDb::getUnreadChatMessages (const ChatRoomId &chatRoomId) const { + L_D(); + + list> chatMessages; + + string query = "SELECT event_id, creation_time FROM conference_chat_message_event WHERE"; + if (chatRoomId.isValid()) + query += " event_id IN (" + " SELECT event_id FROM conference_event WHERE chat_room_id = :chatRoomId" + ") AND"; + + query += " direction = " + Utils::toString(static_cast(ChatMessage::Direction::Incoming)) + + + " AND state <> " + Utils::toString(static_cast(ChatMessage::State::Displayed)); + DurationLogger durationLogger( "Get unread chat messages: (peer=" + chatRoomId.getPeerAddress().asString() + ", local=" + chatRoomId.getLocalAddress().asString() + ")." ); - // TODO. - return list>(); + L_BEGIN_LOG_EXCEPTION + + soci::session *session = d->dbSession.getBackendSession(); + soci::transaction tr(*session); + + long long dbChatRoomId; + if (chatRoomId.isValid()) + dbChatRoomId = d->selectChatRoomId(chatRoomId); + + soci::rowset rows = chatRoomId.isValid() + ? (session->prepare << query, soci::use(dbChatRoomId)) + : (session->prepare << query); + + for (const auto &row : rows) { + long long eventId = d->resolveId(row, 0); + shared_ptr event = d->getEventFromCache(eventId); + + if (!event) + event = d->selectGenericConferenceEvent( + eventId, + EventLog::Type::ConferenceChatMessage, + Utils::getTmAsTimeT(row.get(1)), + chatRoomId + ); + + if (event) + chatMessages.push_back(static_pointer_cast(event)->getChatMessage()); + } + + L_END_LOG_EXCEPTION + + return chatMessages; } shared_ptr MainDb::getLastChatMessage (const ChatRoomId &chatRoomId) const {