From 4290f96fac1e61f7a016260f080898971c05974b Mon Sep 17 00:00:00 2001
From: Armin Felder <armin.felder@osalliance.com>
Date: Mon, 12 Nov 2018 15:13:34 +0100
Subject: [PATCH] preserve chat partner id in persistance

---
 CustomModels/usermodel.cpp            |  2 +-
 CustomModels/usermodel.h              |  2 +-
 config.h                              |  2 +-
 engine.pro                            |  3 +-
 persistancelayer.cpp                  | 20 +++++++---
 persistancelayer.h                    |  4 +-
 rocketchatserver.cpp                  | 10 ++---
 services/rocketchatchannelservice.cpp | 56 ++++++++++++++++++++-------
 sql.qrc                               |  1 +
 sql/migrations/5.sql                  |  2 +
 10 files changed, 71 insertions(+), 31 deletions(-)
 create mode 100644 sql/migrations/5.sql

diff --git a/CustomModels/usermodel.cpp b/CustomModels/usermodel.cpp
index 198c1de..1092392 100644
--- a/CustomModels/usermodel.cpp
+++ b/CustomModels/usermodel.cpp
@@ -54,7 +54,7 @@ QVariant UserModel::data( const QModelIndex &index, int role ) const
     }
 
     if ( role == UserRoles::status ) {
-        int status = 0;
+        int status = 2;
 
         switch ( user->getStatus() ) {
             case RocketChatUser::status::ONLINE :
diff --git a/CustomModels/usermodel.h b/CustomModels/usermodel.h
index 233bed6..79f489f 100644
--- a/CustomModels/usermodel.h
+++ b/CustomModels/usermodel.h
@@ -47,6 +47,7 @@ class UserModel: public QAbstractListModel
     public slots:
         bool insertUser( const QString &, const QSharedPointer<RocketChatUser> & );
         void refreshUserList();
+        void addUser( QSharedPointer<RocketChatUser> pUser );
 
     public:
         UserModel( QObject *parent = nullptr );
@@ -58,7 +59,6 @@ class UserModel: public QAbstractListModel
 
         QSharedPointer<RocketChatUser> getUserById( const QString &pId );
 
-        void addUser( QSharedPointer<RocketChatUser> pUser );
 
     protected:
         QHash<int, QByteArray> roleNames() const;
diff --git a/config.h b/config.h
index 849783d..d29a64c 100755
--- a/config.h
+++ b/config.h
@@ -1,7 +1,7 @@
 #ifndef CONFIG_H
 #define CONFIG_H
 
-#define DBVERSION 4
+#define DBVERSION 5
 
 
 #endif // CONFIG_H
diff --git a/engine.pro b/engine.pro
index 6341f97..064de0f 100644
--- a/engine.pro
+++ b/engine.pro
@@ -283,6 +283,7 @@ RESOURCES += \
 
 DISTFILES += \
     sql/migrations/3.sql \
-    sql/migrations/4.sql
+    sql/migrations/4.sql \
+    sql/migrations/5.sql
 
 
diff --git a/persistancelayer.cpp b/persistancelayer.cpp
index bec51d3..c110672 100755
--- a/persistancelayer.cpp
+++ b/persistancelayer.cpp
@@ -98,7 +98,8 @@ void PersistanceLayer::initShema()
                                    "archived bool,"
                                    "joined bool, "
                                    "blocked bool DEFAULT 0, "
-                                   "username varchar(100) DEFAULT \"\")" ) );
+                                   "username varchar(100) DEFAULT \"\", "
+                                   "chat_partner_id varchar(100) DEFAULT \"\")" ) );
 
     if ( !query.exec() ) {
         qWarning() << query.lastError();
@@ -302,6 +303,9 @@ void PersistanceLayer::upgradeSchema()
             } else if ( dbVersion < 4 ) {
                 currentTarget = 4;
                 sqlFile.setFileName( QStringLiteral( ":/sql/migrations/4.sql" ) );
+            } else if ( dbVersion < 5 ) {
+                currentTarget = 5;
+                sqlFile.setFileName( QStringLiteral( ":/sql/migrations/5.sql" ) );
             }
 
             if ( !sqlFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) {
@@ -762,12 +766,12 @@ void PersistanceLayer::setSetting( const QString &pProperty, const QString &pVal
 
 }
 
-void PersistanceLayer::addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, bool pReadOnly, const QString &pMuted, bool pArchived, bool pBlocked, const QString &pUsername )
+void PersistanceLayer::addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, bool pReadOnly, const QString &pMuted, bool pArchived, bool pBlocked, const QString &pUsername, const QString &pMchatPartnerId )
 {
     transaction();
     QSqlQuery setChannel;
     setChannel.prepare( QStringLiteral( "REPLACE INTO rooms "
-                                        "(id,name,type,joined,read_only,muted,archived,blocked,username) VALUES(:id,:name,:type,:joined,:read_only,:muted,:archived,:blocked,:username)" ) );
+                                        "(id,name,type,joined,read_only,muted,archived,blocked,username) VALUES(:id,:name,:type,:joined,:read_only,:muted,:archived,:blocked,:username,:chat_partner_id)" ) );
     setChannel.bindValue( QStringLiteral( ":id" ), pId );
     setChannel.bindValue( QStringLiteral( ":name" ), pName );
     setChannel.bindValue( QStringLiteral( ":joined" ), pJoined );
@@ -777,6 +781,8 @@ void PersistanceLayer::addChannel( const QString &pId, const QString &pName, con
     setChannel.bindValue( QStringLiteral( ":archived" ), pArchived );
     setChannel.bindValue( QStringLiteral( ":blocked" ), pBlocked );
     setChannel.bindValue( QStringLiteral( ":username" ), pUsername );
+    setChannel.bindValue( QStringLiteral( ":chat_partner_id" ), pUsername );
+
 
     if ( !setChannel.exec() ) {
         qWarning() << setChannel.lastError();
@@ -785,13 +791,13 @@ void PersistanceLayer::addChannel( const QString &pId, const QString &pName, con
     commit();
 }
 
-void PersistanceLayer::addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, const QString &pUsername )
+void PersistanceLayer::addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, const QString &pUsername, const QString &pMchatPartnerId )
 {
     bool readOnly = false;
     QString muted = "";
     bool archived = false;
     bool blocked = false;
-    addChannel( pId, pName, pType, pJoined, readOnly, muted, archived, blocked, pUsername );
+    addChannel( pId, pName, pType, pJoined, readOnly, muted, archived, blocked, pUsername, pMchatPartnerId );
 }
 
 void PersistanceLayer::deleteChannel( const QString &pId )
@@ -1210,6 +1216,8 @@ QList<QVariantHash> PersistanceLayer::getChannels( void )
         int archivedCol = rec.indexOf( QStringLiteral( "archived" ) );
         int blocked = rec.indexOf( QStringLiteral( "blocked" ) );
         int usernameCol = rec.indexOf( QStringLiteral( "username" ) );
+        int chatPartnerIdCol = rec.indexOf( QStringLiteral( "chat_partner_id" ) );
+
 
         while ( rooms.next() ) {
             QVariantHash roomsHash;
@@ -1224,6 +1232,8 @@ QList<QVariantHash> PersistanceLayer::getChannels( void )
             roomsHash[QStringLiteral( "archived" )] = rooms.value( archivedCol ).toBool();
             roomsHash[QStringLiteral( "blocked" )] = rooms.value( blocked ).toBool();
             roomsHash[QStringLiteral( "username" )] = rooms.value( usernameCol ).toString();
+            roomsHash[QStringLiteral( "chatPartnerId" )] = rooms.value( chatPartnerIdCol ).toString();
+
             roomsList.append( roomsHash );
         }
     }
diff --git a/persistancelayer.h b/persistancelayer.h
index c9dc4df..ce4a8c5 100755
--- a/persistancelayer.h
+++ b/persistancelayer.h
@@ -39,8 +39,8 @@ class PersistanceLayer : public QObject
         void setUserName( const QString & );
         void setPassword( const QString & );
         void setToken( const QString &, uint );
-        void addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, bool pReadOnly, const QString &pMuted, bool pArchived, bool pBlocked, const QString &pUsername );
-        void addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, const QString &pUsername );
+        void addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, bool pReadOnly, const QString &pMuted, bool pArchived, bool pBlocked, const QString &pUsername, const QString &pMchatPartnerId );
+        void addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, const QString &pUsername, const QString &pMchatPartnerId );
         void deleteChannel( const QString &pId );
         void addMessage( const QString &pId, const QString &pRid, const QString &pAuthor, qint64 pTs, const QString &pJson, const QString &pUserId );
         void addFileCacheEntry( const QString &pUrl, const QString &pPath );
diff --git a/rocketchatserver.cpp b/rocketchatserver.cpp
index bcf16bd..cab9219 100755
--- a/rocketchatserver.cpp
+++ b/rocketchatserver.cpp
@@ -1714,11 +1714,11 @@ void RocketChatServerData::getCustomEmojis()
         QSharedPointer<RocketChatNotifyNoticesRequest> notifyNoticeSubSubscription( new RocketChatNotifyNoticesRequest( this->mUserId ) );
         QSharedPointer<RocketChatSubScriptionChangedRequest> noitfySubscriptionsSubscription( new RocketChatSubScriptionChangedRequest( this->mUserId ) );
         QSharedPointer<RocketChatSubscribeActiveUsers> activeUsersSubscription( new RocketChatSubscribeActiveUsers() );
-        sendDdprequest( notifySubSubscription );
-        sendDdprequest( notifyNoticeSubSubscription );
-        sendDdprequest( noitfySubscriptionsSubscription );
-        sendDdprequest( activeUsersSubscription );
-        sendDdprequest( notifyRoomsChanged );
+        sendDdprequest( notifySubSubscription, true );
+        sendDdprequest( notifyNoticeSubSubscription, true );
+        sendDdprequest( noitfySubscriptionsSubscription, true );
+        sendDdprequest( activeUsersSubscription, true );
+        sendDdprequest( notifyRoomsChanged, true );
 
         onLoggedIn();
         sendUnsentMessages();
diff --git a/services/rocketchatchannelservice.cpp b/services/rocketchatchannelservice.cpp
index 1258f8f..59824c1 100755
--- a/services/rocketchatchannelservice.cpp
+++ b/services/rocketchatchannelservice.cpp
@@ -260,6 +260,8 @@ void RocketChatChannelService::loadJoinedChannelsFromDb()
     if ( Q_LIKELY( !roomsList.isEmpty() ) ) {
         QVector<QSharedPointer<RocketChatChannel>> channels;
 
+        auto users = Models::getUsersModel();
+
         for ( const auto &roomHash : roomsList ) {
             QSharedPointer<RocketChatChannel> channelPointer =  createChannelObject( roomHash["id"].toString(), roomHash["name"].toString(), roomHash["type"].toString(), roomHash["username"].toString() );
 
@@ -268,6 +270,18 @@ void RocketChatChannelService::loadJoinedChannelsFromDb()
                 channelPointer->setArchived( roomHash["archived"].toBool() );
                 channelPointer->setReadOnly( roomHash["readOnly"].toBool() );
                 channelPointer->setJoined( roomHash["joined"].toBool() );
+                channelPointer->setChatPartnerId( roomHash["chatPartnerId"].toString() );
+
+                if ( channelPointer->getType() == "d" ) {
+                    auto user = users->getUserById( channelPointer->getChatPartnerId() );
+
+                    if ( !user.isNull() ) {
+                        channelPointer->setChatPartner( user );
+                    } else {
+                        auto newUser = QSharedPointer<RocketChatUser>( new RocketChatUser( channelPointer->getChatPartnerId() ) );
+                        channelPointer->setChatPartner( newUser );
+                    }
+                }
 
                 if ( roomHash.contains( "blocked" ) ) {
                     channelPointer->setBlocked( roomHash["blocked"].toBool() );
@@ -283,16 +297,17 @@ void RocketChatChannelService::loadJoinedChannelsFromDb()
 
 void RocketChatChannelService::persistChannel( QSharedPointer<RocketChatChannel> pChannel )
 {
-    QString id = pChannel->getRoomId();
-    QString name  = pChannel->getName();
-    QString type = pChannel->getType();
-    QString muted = pChannel->getMuted().join( "," );
-    QString username = pChannel->getUsername();
-    bool joined = pChannel->getJoined();
-    bool archived = pChannel->getArchived();
-    bool readonly = pChannel->getReadOnly();
-    bool blocked = pChannel->getBlocked();
-    mStorage->addChannel( id, name, type, joined, readonly, muted, archived, blocked, username );
+    auto id = pChannel->getRoomId();
+    auto name  = pChannel->getName();
+    auto type = pChannel->getType();
+    auto muted = pChannel->getMuted().join( "," );
+    auto username = pChannel->getUsername();
+    auto joined = pChannel->getJoined();
+    auto archived = pChannel->getArchived();
+    auto readonly = pChannel->getReadOnly();
+    auto blocked = pChannel->getBlocked();
+    auto chatPartnerId = pChannel->getChatPartnerId();
+    mStorage->addChannel( id, name, type, joined, readonly, muted, archived, blocked, username, chatPartnerId );
 }
 /**
  * Fills the channel with users, which are loaded from the server
@@ -321,21 +336,32 @@ void RocketChatChannelService::loadUsersOfChannel( QSharedPointer<RocketChatChan
                     for ( const auto current : records ) {
                         if ( current.type() == QJsonValue::Object ) {
                             QJsonObject userObject = current.toObject();
-                            QString username = userObject["username"].toString();
-                            QString userId = userObject["id"].toString();
+                            QString username;
+                            QString userId;
                             QString status;
+                            QString name;
+
+                            if ( userObject.contains( "id" ) ) {
+                                userId = userObject["id"].toString();
+                            } else if ( userObject.contains( "_id" ) ) {
+                                userId = userObject["_id"].toString();
+                            }
+
+                            if ( userObject.contains( "username" ) ) {
+                                username = userObject["username"].toString();
+                            }
 
                             if ( userObject.contains( "status" ) ) {
                                 status = userObject["status"].toString();
                             }
 
-                            if ( userId.isEmpty() && userObject.contains( "_id" ) ) {
-                                userId = userObject["_id"].toString();
+                            if ( userObject.contains( "name" ) ) {
+                                name = userObject["name"].toString();
                             }
 
                             QSharedPointer<RocketChatUser> user;
 
-                            QString name = userObject["name"].toString();
+
                             auto oldUser = userModel->getUserById( userId );
 
                             if ( !oldUser.isNull() ) {
diff --git a/sql.qrc b/sql.qrc
index 2efe50d..704a7f2 100644
--- a/sql.qrc
+++ b/sql.qrc
@@ -5,5 +5,6 @@
         <file>sql/migrations/2.sql</file>
         <file>sql/migrations/3.sql</file>
         <file>sql/migrations/4.sql</file>
+        <file>sql/migrations/5.sql</file>
     </qresource>
 </RCC>
diff --git a/sql/migrations/5.sql b/sql/migrations/5.sql
new file mode 100644
index 0000000..87b997d
--- /dev/null
+++ b/sql/migrations/5.sql
@@ -0,0 +1,2 @@
+ALTER TABLE rooms ADD chat_partner_id varchar(100) DEFAULT "";
+REPLACE INTO app_info (db_ver) VALUES(5);
-- 
GitLab