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