File indexing completed on 2024-05-12 16:25:42

0001 /*
0002    SPDX-FileCopyrightText: 2023-2024 Laurent Montel <montel.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "localdatabasemanager.h"
0008 #include "localaccountdatabase.h"
0009 #include "localmessagedatabase.h"
0010 #include "localmessagelogger.h"
0011 #include "localroomsdatabase.h"
0012 #include "room.h"
0013 #include "ruqolaglobalconfig.h"
0014 
0015 LocalDatabaseManager::LocalDatabaseManager()
0016     : mMessageLogger(std::make_unique<LocalMessageLogger>())
0017     , mMessagesDatabase(std::make_unique<LocalMessageDatabase>())
0018     , mRoomsDatabase(std::make_unique<LocalRoomsDatabase>())
0019     , mAccountDatabase(std::make_unique<LocalAccountDatabase>())
0020     , mGlobalDatabase(std::make_unique<GlobalDatabase>())
0021 {
0022 }
0023 
0024 LocalDatabaseManager::~LocalDatabaseManager() = default;
0025 
0026 void LocalDatabaseManager::addMessage(const QString &accountName, const QString &roomName, const Message &m)
0027 {
0028     mMessageLogger->addMessage(accountName, roomName, m);
0029     if (RuqolaGlobalConfig::self()->storeMessageInDataBase()) {
0030         mMessagesDatabase->addMessage(accountName, roomName, m);
0031         // Update timestamp.
0032         mGlobalDatabase->insertOrReplaceTimeStamp(accountName, roomName, m.timeStamp(), GlobalDatabase::TimeStampType::MessageTimeStamp);
0033     }
0034 }
0035 
0036 void LocalDatabaseManager::deleteMessage(const QString &accountName, const QString &roomName, const QString &messageId)
0037 {
0038     mMessageLogger->deleteMessage(accountName, roomName, messageId);
0039     if (RuqolaGlobalConfig::self()->storeMessageInDataBase()) {
0040         mMessagesDatabase->deleteMessage(accountName, roomName, messageId);
0041         // TODO update timestamp ?
0042     }
0043 }
0044 
0045 QVector<Message> LocalDatabaseManager::loadMessages(const QString &accountName,
0046                                                     const QString &roomName,
0047                                                     qint64 startId,
0048                                                     qint64 endId,
0049                                                     qint64 numberElements,
0050                                                     EmojiManager *emojiManager) const
0051 {
0052     if (RuqolaGlobalConfig::self()->storeMessageInDataBase()) {
0053         return mMessagesDatabase->loadMessages(accountName, roomName, startId, endId, numberElements, emojiManager);
0054     }
0055     return {};
0056 }
0057 
0058 void LocalDatabaseManager::updateAccount(const QString &accountName, const QByteArray &ba, qint64 timeStamp)
0059 {
0060     if (RuqolaGlobalConfig::self()->storeMessageInDataBase()) {
0061         mAccountDatabase->updateAccount(accountName, ba);
0062         if (timeStamp > -1) {
0063             mGlobalDatabase->insertOrReplaceTimeStamp(accountName, QString(), timeStamp, GlobalDatabase::TimeStampType::AccountTimeStamp);
0064         }
0065     }
0066 }
0067 
0068 void LocalDatabaseManager::deleteAccount(const QString &accountName)
0069 {
0070     if (RuqolaGlobalConfig::self()->storeMessageInDataBase()) {
0071         mAccountDatabase->deleteAccount(accountName);
0072         mGlobalDatabase->removeTimeStamp(accountName, QString(), GlobalDatabase::TimeStampType::AccountTimeStamp);
0073     }
0074 }
0075 
0076 QByteArray LocalDatabaseManager::jsonAccount(const QString &accountName)
0077 {
0078     if (RuqolaGlobalConfig::self()->storeMessageInDataBase()) {
0079         return mAccountDatabase->jsonAccount(accountName);
0080     }
0081     return {};
0082 }
0083 
0084 void LocalDatabaseManager::addRoom(const QString &accountName, Room *room)
0085 {
0086     if (RuqolaGlobalConfig::self()->storeMessageInDataBase()) {
0087         mRoomsDatabase->addRoom(accountName, room);
0088         // TODO verify it.
0089         mGlobalDatabase->insertOrReplaceTimeStamp(accountName, room->roomId(), room->lastMessageAt(), GlobalDatabase::TimeStampType::RoomTimeStamp);
0090     }
0091 }
0092 
0093 void LocalDatabaseManager::deleteRoom(const QString &accountName, const QString &roomId)
0094 {
0095     if (RuqolaGlobalConfig::self()->storeMessageInDataBase()) {
0096         mRoomsDatabase->deleteRoom(accountName, roomId);
0097         // Remove timestamp.
0098         mGlobalDatabase->removeTimeStamp(accountName, roomId, GlobalDatabase::TimeStampType::RoomTimeStamp);
0099     }
0100 }
0101 
0102 void LocalDatabaseManager::updateTimeStamp(const QString &accountName, const QString &roomName, qint64 timestamp, GlobalDatabase::TimeStampType type)
0103 {
0104     if (RuqolaGlobalConfig::self()->storeMessageInDataBase()) {
0105         mGlobalDatabase->insertOrReplaceTimeStamp(accountName, roomName, timestamp, type);
0106     }
0107 }
0108 
0109 void LocalDatabaseManager::removeTimeStamp(const QString &accountName, const QString &roomName, GlobalDatabase::TimeStampType type)
0110 {
0111     if (RuqolaGlobalConfig::self()->storeMessageInDataBase()) {
0112         mGlobalDatabase->removeTimeStamp(accountName, roomName, type);
0113     }
0114 }
0115 
0116 qint64 LocalDatabaseManager::timeStamp(const QString &accountName, const QString &roomName, GlobalDatabase::TimeStampType type)
0117 {
0118     if (RuqolaGlobalConfig::self()->storeMessageInDataBase()) {
0119         return mGlobalDatabase->timeStamp(accountName, roomName, type);
0120     }
0121     return -1;
0122 }