diff --git a/src/colnod/colnodapi.cpp b/src/colnod/colnodapi.cpp index 504bb14..7584be2 100644 --- a/src/colnod/colnodapi.cpp +++ b/src/colnod/colnodapi.cpp @@ -117,6 +117,34 @@ void ColnodAPI::syncDataToColnod() void ColnodAPI::syncChangedDataToColnod() { // TODO + dataMan->loadTokensToAdd(); + dataMan->loadTokensToDelete(); + processDataToColnod(); + dataMan->clear(); + +} + +void ColnodAPI::processDataToColnod() +{ + QList* tokensToDelete = dataMan->getTokensToDelete(); + if ((*tokensToDelete)[0] != "empty") + { + Response* resp0 = reqMan->deleteTokens(dataMan->getTokensToDelete()); + connect(resp0, &Response::ready, [=](){ + areProcessDataReady(); + resp0->deleteLater(); + }); + } + QList>* tokens = dataMan->getTokens(); + if ((*tokens)[0]->getName() != "empty") + { + Response* resp1 = reqMan->setTokens(dataMan->getTokens()); + connect(resp1, &Response::ready, [=](){ + areProcessDataReady(); + resp1->deleteLater(); + }); + } + connect(this, &ColnodAPI::dataLoaded, this, &ColnodAPI::syncChangedDataFromColnod); } void ColnodAPI::prepareDatabase() @@ -138,4 +166,10 @@ void ColnodAPI::areChangedDataReady() } - +void ColnodAPI::areProcessDataReady() +{ + if (dataMan->haveProcessData()) + { + emit dataLoaded(); + } +} diff --git a/src/colnod/colnodapi.h b/src/colnod/colnodapi.h index dd5e3e0..31bbb2f 100644 --- a/src/colnod/colnodapi.h +++ b/src/colnod/colnodapi.h @@ -19,17 +19,22 @@ public: void syncDataToColnod(); - void downloadChangedDataFromColnod(); + void syncChangedDataFromColnod(); void syncChangedDataToColnod(); + void prepareDatabase(); +public slots: + void downloadChangedDataFromColnod(); + + signals: void dataDownloaded(); - void partReady(); + void dataLoaded(); private slots: @@ -41,6 +46,8 @@ private: void syncDeletedDataFromColnod(); void areDataReady(); void areChangedDataReady(); + void areProcessDataReady(); + void processDataToColnod(); diff --git a/src/colnod/databasemanager.cpp b/src/colnod/databasemanager.cpp index 9886500..f45ca8a 100644 --- a/src/colnod/databasemanager.cpp +++ b/src/colnod/databasemanager.cpp @@ -73,7 +73,7 @@ void DatabaseManager::saveSubjectAttribute(Subject *subject, QString table) auto attributes = subject->getAtr(); for (auto attribute : attributes){ QString id = subject->idToStringWithoutBraces() + " " + attribute.first; - //if (checkIfExists(id, table)) + if (checkIfExists(id, table)) { query.prepare(QString("UPDATE %1 SET id = :id, attribute_key = :key, attribute_value = :value, subject_id = :subject_id) " "WHERE id = :id").arg(table)); @@ -83,7 +83,7 @@ void DatabaseManager::saveSubjectAttribute(Subject *subject, QString table) query.bindValue(":subject_id", subject->idToStringWithoutBraces()); query.exec(); } - /* else + else { query.prepare(QString("INSERT INTO %1 (id, attribute_key, attribute_value, subject_id)" "VALUES (:id, :key, :value, :subject_id)").arg(table)); @@ -92,7 +92,7 @@ void DatabaseManager::saveSubjectAttribute(Subject *subject, QString table) query.bindValue(":value", attribute.second); query.bindValue(":subject_id", subject->idToStringWithoutBraces()); query.exec(); - }*/ + } } } @@ -166,7 +166,7 @@ void DatabaseManager::createTables() uint64_t DatabaseManager::getLastUpdate() { - query.exec("SELECT EXTRACT(EPOCH FROM (SELECT MIN(last_sync) FROM changes))*1000"); + query.exec("SELECT EXTRACT(EPOCH FROM (SELECT MIN(last_sync) FROM changes))*1000"); //MAX for using, MIN for testing query.next(); return query.value(0).toULongLong(); } @@ -186,3 +186,27 @@ void DatabaseManager::updateLastSync() query.bindValue(":time", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz")); query.exec(); } + + +QSqlQuery* DatabaseManager::getTokensToAdd() +{ + QSqlQuery* qry = new QSqlQuery; + qry->exec("SELECT name, token_data FROM changes WHERE status = 'toBeAdd'"); + return qry; +} + +QSqlQuery* DatabaseManager::getTokensToDelete() +{ + QSqlQuery* qry = new QSqlQuery; + qry->exec("SELECT id FROM changes WHERE status = 'toBeDeleted'"); + return qry; +} + +QUuid DatabaseManager::getId(QString name) +{ + query.prepare("SELECT id FROM colnod_subject WHERE name = :name"); + query.bindValue(":name", name); + query.exec(); + query.next(); + return query.value(0).toUuid(); +} diff --git a/src/colnod/databasemanager.h b/src/colnod/databasemanager.h index 8eb3306..0425ae5 100644 --- a/src/colnod/databasemanager.h +++ b/src/colnod/databasemanager.h @@ -36,6 +36,11 @@ public: uint64_t getLastUpdate(); void updateLastSync(); + QSqlQuery* getTokensToAdd(); + QSqlQuery* getTokensToDelete(); + + QUuid getId(QString name); + private: bool checkIfExists(QString id, QString table); diff --git a/src/colnod/datamanager.cpp b/src/colnod/datamanager.cpp index 8ad85dc..f4d195d 100644 --- a/src/colnod/datamanager.cpp +++ b/src/colnod/datamanager.cpp @@ -166,6 +166,13 @@ bool DataManager::haveChangedData() return false; } +bool DataManager::haveProcessData() +{ + if ( !tokens.isEmpty() && !tokensToDelete.isEmpty()) + return true; + return false; +} + uint64_t DataManager::getLastUpdate() { return db->getLastUpdate(); @@ -190,4 +197,29 @@ void DataManager::updateLastSync() db->updateLastSync(); } +void DataManager::loadTokensToAdd() +{ + QSqlQuery* query = db->getTokensToAdd(); + while (query->next()) + { + Token* token = new Token(query->value(0).toString(), query->value(1).toString()); + token->setSubjectId(db->getId(token->getName())); + tokens.append(token); + } + if (tokens.isEmpty()) + tokens.append(new Token("empty")); +} + +void DataManager::loadTokensToDelete() +{ + QSqlQuery* query = db->getTokensToDelete(); + while (query->next()) + { + tokensToDelete.append(query->value(0).toString()); + } + if (tokensToDelete.isEmpty()) + tokensToDelete.append("empty"); +} + + diff --git a/src/colnod/datamanager.h b/src/colnod/datamanager.h index c68a128..1f51db0 100644 --- a/src/colnod/datamanager.h +++ b/src/colnod/datamanager.h @@ -32,10 +32,18 @@ public: bool haveData(); bool haveChangedData(); + bool haveProcessData(); void emptyDatabase(); void clear(); + void loadTokensToAdd(); + void loadTokensToDelete(); + + QList>* getTokens() {return &tokens;} + QList* getTokensToDelete() {return &tokensToDelete;} + + private: DatabaseManager *db = nullptr; QList> subjects; diff --git a/src/colnod/requestmanager.cpp b/src/colnod/requestmanager.cpp index 658b59b..3847358 100644 --- a/src/colnod/requestmanager.cpp +++ b/src/colnod/requestmanager.cpp @@ -157,11 +157,11 @@ QByteArray RequestManager::makeTimeStampJson(uint64_t time) return doc.toJson(); } -QByteArray RequestManager::makeTokensJson(QList> tokens) +QByteArray RequestManager::makeTokensJson(QList>* tokens) { QJsonObject items; QJsonArray jsonTokens; - for (auto token : tokens) + for (auto token : *tokens) { QJsonObject jsonToken; jsonToken.insert("id",token->idToStringWithoutBraces()); @@ -186,10 +186,10 @@ QByteArray RequestManager::makeTokensJson(QList> tokens) return doc.toJson(); } -QByteArray RequestManager::makeIdsJson(QList ids) +QByteArray RequestManager::makeIdsJson(QList* ids) { QJsonArray jsonIds; - for (auto id : ids) + for (auto id : *ids) { jsonIds.push_back(id); } @@ -265,12 +265,12 @@ Response* RequestManager::getAccessGroupMembershipDeleted(uint64_t time) return postRequestReturnLogic("/AccessManager/getAccessGroupMembershipDeleted", makeTimeStampJson(time)); } -Response* RequestManager::setTokens(QList> tokens) +Response* RequestManager::setTokens(QList>* tokens) { return postRequestReturnLogic("/TokenManager/setTokens", makeTokensJson(tokens)); } -Response* RequestManager::deleteTokens(QList ids) +Response* RequestManager::deleteTokens(QList* ids) { return postRequestReturnLogic("/TokenManager/deleteTokens", makeIdsJson(ids)); } diff --git a/src/colnod/requestmanager.h b/src/colnod/requestmanager.h index 028ec98..b784535 100644 --- a/src/colnod/requestmanager.h +++ b/src/colnod/requestmanager.h @@ -49,8 +49,8 @@ public: Response* getAccessGroupMembershipUpdated(uint64_t time); Response* getAccessGroupMembershipDeleted(uint64_t time); - Response* setTokens(QList> tokens); - Response* deleteTokens(QList ids); + Response* setTokens(QList>* tokens); + Response* deleteTokens(QList* ids); Response* login(); //I want it private, but unittest??? @@ -65,8 +65,8 @@ private: QString getLoginHeader(QString username, QString hash); QByteArray makeTimeStampJson(uint64_t time); - QByteArray makeTokensJson(QList> tokens); - QByteArray makeIdsJson(QList ids); + QByteArray makeTokensJson(QList>* tokens); + QByteArray makeIdsJson(QList* ids); Response* getLoginResponse(); private slots: diff --git a/src/colnod/token.cpp b/src/colnod/token.cpp index 008b0ee..941f1fc 100644 --- a/src/colnod/token.cpp +++ b/src/colnod/token.cpp @@ -2,6 +2,25 @@ #include +Token::Token(QString namee, QString tokenData, QString decription) +{ + this->name = namee; + this->tokenData = tokenData; + this->description = decription; + this->id = QUuid::createUuid(); + this->tokenType = "Token"; + this->tokenBits = 32; + this->timeToLive = 255; + this->authErrors = 255; + this->flags = {"Enabled", "NoValidity"}; + +} + +Token::Token(QString namee) +{ + this->name = namee; +} + void Token::fromJSON(const QJsonObject &json) { Entity::fromJSON(json); diff --git a/src/colnod/token.h b/src/colnod/token.h index 37a39a0..1ffc80f 100644 --- a/src/colnod/token.h +++ b/src/colnod/token.h @@ -10,6 +10,9 @@ class Token : public Entity { public: // using Entity::Entity; + Token() = default; + Token(QString name, QString tokenData, QString decription = "mobile"); + Token(QString name); const QString &getTokenType() const; void setTokenType(const QString &tokenType); int getTokenBits() const; diff --git a/test/unitTests/UnitTest.cpp b/test/unitTests/UnitTest.cpp index 6da6094..af27504 100644 --- a/test/unitTests/UnitTest.cpp +++ b/test/unitTests/UnitTest.cpp @@ -222,7 +222,7 @@ void UnitTest::setTokens() } RequestManager* testAccess = new RequestManager(); QSignalSpy spy(testAccess, SIGNAL(responseReady())); - Response* response = testAccess->setTokens(tokens); + Response* response = testAccess->setTokens(&tokens); QCOMPARE(spy.count(), 0); spy.wait(15000); QVERIFY(spy.isValid()); @@ -238,7 +238,7 @@ void UnitTest::deleteTokens() QList ids; ids.append("582c982d-6fd7-4856-8548-7ce542791c7a"); ids.append("3ff23b41-3da3-4b33-82ce-d8e2d8c9a546"); - Response* response = testAccess->deleteTokens(ids); + Response* response = testAccess->deleteTokens(&ids); QCOMPARE(spy.count(), 0); spy.wait(15000); QVERIFY(spy.isValid()); diff --git a/test/unitTests/complextest.cpp b/test/unitTests/complextest.cpp index 0d80db9..7fc87e7 100644 --- a/test/unitTests/complextest.cpp +++ b/test/unitTests/complextest.cpp @@ -12,7 +12,7 @@ void ComplexTest::cleanupTestCase() { QList ids; ids.append("582c982d-6fd7-4856-8548-7ce542791c7a"); - Response* deleteTokensResp = reqMan->deleteTokens(ids); + Response* deleteTokensResp = reqMan->deleteTokens(&ids); QSignalSpy deleteTokensRespSpy(deleteTokensResp, &Response::ready); QCOMPARE(deleteTokensRespSpy.count(), 0); deleteTokensRespSpy.wait(10000); @@ -45,7 +45,7 @@ void ComplexTest::complexTest() // ADD_TOKENS_CHECK_BEGIN QList> tokens; tokens.append(getTestToken()); - Response* setTokensResp = reqMan->setTokens(tokens); + Response* setTokensResp = reqMan->setTokens(&tokens); QSignalSpy setTokensRespSpy(setTokensResp, &Response::ready); QCOMPARE(setTokensRespSpy.count(), 0); setTokensRespSpy.wait(10000); @@ -69,7 +69,7 @@ void ComplexTest::complexTest() // DELETE_TOKENS_CHECK_BEGIN QList ids; ids.append("582c982d-6fd7-4856-8548-7ce542791c7a"); - Response* deleteTokensResp = reqMan->deleteTokens(ids); + Response* deleteTokensResp = reqMan->deleteTokens(&ids); QSignalSpy deleteTokensRespSpy(deleteTokensResp, &Response::ready); QCOMPARE(deleteTokensRespSpy.count(), 0); deleteTokensRespSpy.wait(10000); @@ -116,7 +116,7 @@ void ComplexTest::syncLastUpdated() QSignalSpy spy(api, &ColnodAPI::dataDownloaded); spy.wait(10000); api->syncChangedDataFromColnod(); - //api->syncUpdatedDataToColnod(); + // api->syncChangedDataToColnod(); }