diff --git a/src/colnod/colnodapi.cpp b/src/colnod/colnodapi.cpp index 77d3ebc..31b9ce2 100644 --- a/src/colnod/colnodapi.cpp +++ b/src/colnod/colnodapi.cpp @@ -20,22 +20,27 @@ ColnodAPI::ColnodAPI(serversdk::RequestManager* reqMan, const bool &dryMode, QSt * @return signal with nullptr when something went wrong * @return signal with data when valid data returned */ -void ColnodAPI::downloadData(const qint64 &time) +bool ColnodAPI::downloadData(const qint64 &time) { // Have to get Login auto login = requestLogin(); + Q_ASSERT(login); + if (login->networkReply() == nullptr) { + qCCritical(colnod) << "Not possible to create login request"; + return false; + } connect(login.get(), &serversdk::Request::finished, this, [=](){ // Get login token if (login->status() != 200) { emit downloadDataFinished(nullptr); - return; + return false; } AuthToken token; if (checkResponse(login->responseData())) { qCWarning(colnod) << "empty response data when logging in"; emit downloadDataFinished(nullptr); - return; + return false; } token.fromJson(login->responseData()); @@ -43,59 +48,65 @@ void ColnodAPI::downloadData(const qint64 &time) if (authToken.isEmpty()) { qCCritical(colnod) << "Token uuid is empty"; emit downloadDataFinished(nullptr); - return; + return false; } auto data = std::make_shared(); - - auto errorHandler = [=](const std::shared_ptr& request){ - if (!checkRequest(request)) { - qWarning(colnod) << "ERROR during calling" << request->url() << ", request unsuccessful"; - mValid = false; - emit downloadDataFinished(nullptr); - } - else if (!checkResponse(request->responseData())) { - qWarning(colnod) << "Data from" << request->url() << "are invalid"; - mValid = false; - emit downloadDataFinished(nullptr); - } - }; - - - // if I have all data emit downloadDataFinished - connect(this, &ColnodAPI::partOfDataReady, this, &ColnodAPI::areDataReady); - Timestamp timestamp; timestamp.setTimestamp(time); + auto checkData = [=]() { + int dataCount = data->incrementCounter(); + if ( dataCount > 5) { + qCCritical(colnod) << "check data cannnot be higher then 4"; + } + Q_ASSERT(dataCount < 5); + if (dataCount == 4) { + qInfo(colnod) << tab << "- src col:" << tab << "tokens [" << data->updatedTokens.size() << ":" << data->deletedTokens.size() << + "] subjects [" << data->updatedSubjects.size() << ":" << data->deletedSubjects.size() << "] [ added/updated : deleted ]"; + emit downloadDataFinished(data); + } + }; + auto tokensRequest = getTokensUpdated(timestamp); - connect(tokensRequest.get(), &serversdk::Request::finished, errorHandler); connect(tokensRequest.get(), &serversdk::Request::finished, [=](){ - saveUpdatedTokens(data, tokensRequest->responseData()); - emit partOfDataReady(data); + if (!saveUpdatedTokens(data, tokensRequest->responseData())) { + emit downloadDataFinished(nullptr); + return; + } + checkData(); }); auto deletedTokensRequest = getTokensDeleted(timestamp); - connect(deletedTokensRequest.get(), &serversdk::Request::finished, errorHandler); connect(deletedTokensRequest.get(), &serversdk::Request::finished, [=](){ - saveDeletedTokens(data, deletedTokensRequest->responseData()); - emit partOfDataReady(data); + if (!saveDeletedTokens(data, deletedTokensRequest->responseData())) { + emit downloadDataFinished(nullptr); + return; + } + checkData(); }); auto subjectsRequest = getSubjectsUpdated(timestamp); - connect(subjectsRequest.get(), &serversdk::Request::finished, errorHandler); connect(subjectsRequest.get(), &serversdk::Request::finished, [=](){ - saveUpdatedSubjects(data, subjectsRequest->responseData()); - emit partOfDataReady(data); + if (!saveUpdatedSubjects(data, subjectsRequest->responseData())) { + emit downloadDataFinished(nullptr); + return; + } + checkData(); }); auto deletedSubjectsRequest = getSubjectsDeleted(timestamp); - connect(deletedSubjectsRequest.get(), &serversdk::Request::finished, errorHandler); connect(deletedSubjectsRequest.get(), &serversdk::Request::finished, [=](){ - saveDeletedSubjects(data, deletedSubjectsRequest->responseData()); - emit partOfDataReady(data); + if (!saveDeletedSubjects(data, deletedSubjectsRequest->responseData())) { + emit downloadDataFinished(nullptr); + return; + } + checkData(); }); + return true; + }); + return true; } void ColnodAPI::processData(const std::shared_ptr &data) @@ -106,7 +117,7 @@ void ColnodAPI::processData(const std::shared_ptr &data) // } // NEW - qInfo(colnod) << "- push colnod: tokens [" << data->updatedTokens.size() << ":" << data->deletedTokens.size() << + qInfo(colnod) << tab << "- push col:" << tab << "tokens [" << data->updatedTokens.size() << ":" << data->deletedTokens.size() << "] [ added/updated : deleted ]"; // OLD @@ -297,32 +308,42 @@ void ColnodAPI::isDataProcessFinished(bool success) } } -void ColnodAPI::saveUpdatedTokens(const std::shared_ptr& data, const QByteArray &responseData) +bool ColnodAPI::saveUpdatedTokens(const std::shared_ptr& data, const QByteArray &responseData) { - data->loadTokensFromJson(responseData); + Q_ASSERT(data); + return data->loadTokensFromJson(responseData); } -void ColnodAPI::saveDeletedTokens(const std::shared_ptr& data, const QByteArray &responseData) +bool ColnodAPI::saveDeletedTokens(const std::shared_ptr& data, const QByteArray &responseData) { + Q_ASSERT(data); + if (responseData.isEmpty()) + return false; QJsonDocument doc = QJsonDocument::fromJson(responseData); QJsonArray items = doc.object()["items"].toArray(); for (QJsonValueRef item : items) { data->deletedTokens.append(item.toString()); } + return true; } -void ColnodAPI::saveUpdatedSubjects(const std::shared_ptr& data, const QByteArray &responseData) +bool ColnodAPI::saveUpdatedSubjects(const std::shared_ptr& data, const QByteArray &responseData) { - data->loadSubjectsFormJson(responseData); + Q_ASSERT(data); + return data->loadSubjectsFormJson(responseData); } -void ColnodAPI::saveDeletedSubjects(const std::shared_ptr& data, const QByteArray &responseData) +bool ColnodAPI::saveDeletedSubjects(const std::shared_ptr& data, const QByteArray &responseData) { + Q_ASSERT(data); + if (responseData.isEmpty()) + return false; QJsonDocument doc = QJsonDocument::fromJson(responseData); QJsonArray items = doc.object()["items"].toArray(); for (QJsonValueRef item : items) { data->deletedSubjects.append(item.toString()); } + return true; } bool ColnodAPI::checkResponse(const QByteArray &responseData) diff --git a/src/colnod/colnodapi.h b/src/colnod/colnodapi.h index e983460..dd46a6e 100644 --- a/src/colnod/colnodapi.h +++ b/src/colnod/colnodapi.h @@ -43,7 +43,7 @@ public: ColnodAPI() = default; ColnodAPI(serversdk::RequestManager* reqManconst, const bool &dryMode = false, QString userName = "spaceti", QString password = "spaceti1"); - void downloadData(const qint64 &time); + bool downloadData(const qint64 &time); void processData(const std::shared_ptr &data); std::shared_ptr requestLogin(); @@ -69,10 +69,10 @@ private: Q_SLOT void isDataProcessFinished(bool success); private: - void saveUpdatedTokens(const std::shared_ptr& data, const QByteArray &responseData); - void saveUpdatedSubjects(const std::shared_ptr& data, const QByteArray &responseData); - void saveDeletedTokens(const std::shared_ptr& data, const QByteArray &responseData); - void saveDeletedSubjects(const std::shared_ptr& data, const QByteArray &responseData); + bool saveUpdatedTokens(const std::shared_ptr& data, const QByteArray &responseData); + bool saveUpdatedSubjects(const std::shared_ptr& data, const QByteArray &responseData); + bool saveDeletedTokens(const std::shared_ptr& data, const QByteArray &responseData); + bool saveDeletedSubjects(const std::shared_ptr& data, const QByteArray &responseData); bool checkResponse(const QByteArray &responseData); diff --git a/src/colnod/data.cpp b/src/colnod/data.cpp index 990a5ab..2917618 100644 --- a/src/colnod/data.cpp +++ b/src/colnod/data.cpp @@ -9,8 +9,11 @@ void Data::clear() deletedSubjects.clear(); } -void Data::loadTokensFromJson(const QByteArray &data) +bool Data::loadTokensFromJson(const QByteArray &data) { + if (data.isEmpty()) + return false; + auto doc = QJsonDocument::fromJson(data); auto items = doc.object()["items"].toArray(); for (auto item : items) { @@ -19,10 +22,14 @@ void Data::loadTokensFromJson(const QByteArray &data) token->fromJson(doc.toJson()); updatedTokens.insert(token->id(), token); } + return true; } -void Data::loadSubjectsFormJson(const QByteArray &data) +bool Data::loadSubjectsFormJson(const QByteArray &data) { + if (data.isEmpty()) + return false; + auto doc = QJsonDocument::fromJson(data); auto items = doc.object()["items"].toArray(); for (auto item : items) { @@ -31,4 +38,10 @@ void Data::loadSubjectsFormJson(const QByteArray &data) subject->fromJson(doc.toJson()); updatedSubjects.insert(subject->id(), subject); } + return true; +} + +int Data::incrementCounter() +{ + return ++counter; } diff --git a/src/colnod/data.h b/src/colnod/data.h index 5ab4d8f..e2dbc91 100644 --- a/src/colnod/data.h +++ b/src/colnod/data.h @@ -30,13 +30,19 @@ public: void clear(); - void loadTokensFromJson(const QByteArray &data); - void loadSubjectsFormJson(const QByteArray &data); + bool loadTokensFromJson(const QByteArray &data); + bool loadSubjectsFormJson(const QByteArray &data); QHash> updatedTokens; QList deletedTokens; QHash> updatedSubjects; QList deletedSubjects; + + int incrementCounter(); + + +private: + int counter = 0; }; struct PreparedData @@ -51,4 +57,5 @@ public: // TODO: make unique_ptr ( neeed because of ColnodAPI ) std::shared_ptr databaseData; std::shared_ptr colnodData; + }; diff --git a/src/colnod/databaseapi.cpp b/src/colnod/databaseapi.cpp index a5ffb0d..c2ca125 100644 --- a/src/colnod/databaseapi.cpp +++ b/src/colnod/databaseapi.cpp @@ -72,7 +72,7 @@ bool DatabaseAPI::processData(const std::shared_ptr &data) // } // NEW - qInfo(database) << "- push db: tokens [" << data->updatedTokens.size() << ":" << data->deletedTokens.size() << + qInfo(database) << tab << "- push db:" << tab << "tokens [" << data->updatedTokens.size() << ":" << data->deletedTokens.size() << "] subjects [" << data->updatedSubjects.size() << ":" << data->deletedSubjects.size() << "] [ added/updated : deleted ]"; // OLD @@ -99,7 +99,7 @@ std::shared_ptr DatabaseAPI::composeData(const QSqlQuery &updatedQuery, QS } // NEW - qInfo(database) << "- src db: tokens [" << data->updatedTokens.size() << ":" << data->deletedTokens.size() << + qInfo(database) << tab << "- src db:" << tab << "tokens [" << data->updatedTokens.size() << ":" << data->deletedTokens.size() << "] [ added/updated : deleted ]"; // OLD diff --git a/src/colnod/syncmanager.cpp b/src/colnod/syncmanager.cpp index 3baaf08..997793f 100644 --- a/src/colnod/syncmanager.cpp +++ b/src/colnod/syncmanager.cpp @@ -44,7 +44,7 @@ bool SyncManager::startSynchronization() } // NEW - qInfo(syncmanager) << "- begin sync ( previous sync" << mlastSync.toDateString() << ")"; + qInfo(syncmanager) << tab << "- begin sync ( previous sync" << mlastSync.toDateString() << ")"; // OLD // qInfo(syncmanager) << equals; @@ -135,6 +135,7 @@ bool SyncManager::startSynchronization() } else { database->setLastSync(syncBegin); + qInfo(syncmanager) << "Success"; // qInfo(syncmanager).noquote() << "Update last synchronization time to time of this sync (" // << QDateTime::fromMSecsSinceEpoch(syncBegin).toString("yyyy-MM-dd hh:mm:ss.zzz") // << ")"; @@ -212,7 +213,7 @@ std::unique_ptr SyncManager::prepareDataNew(const std::shared_ptr< preparedColnodData->deletedSubjects = colnodData->deletedSubjects; // NEW - qInfo(syncmanager) << "- prep colnod: tokens [" << preparedColnodData->updatedTokens.size() << ":" << preparedColnodData->deletedTokens.size() << + qInfo(syncmanager) << tab << "- prep col:" << tab << "tokens [" << preparedColnodData->updatedTokens.size() << ":" << preparedColnodData->deletedTokens.size() << "] subjects [" << preparedColnodData->updatedSubjects.size() << ":" << preparedColnodData->deletedSubjects.size() << "] [ added/updated : deleted ]"; // OLD @@ -249,7 +250,7 @@ std::unique_ptr SyncManager::prepareDataNew(const std::shared_ptr< // NEW - qInfo(syncmanager) << "- prep db: tokens [" << preparedDatabaseData->updatedTokens.size() << ":" << preparedDatabaseData->deletedTokens.size() << + qInfo(syncmanager) << tab << "- prep db:" << tab << "tokens [" << preparedDatabaseData->updatedTokens.size() << ":" << preparedDatabaseData->deletedTokens.size() << "] [ added/updated : deleted ]"; // OLD diff --git a/test/auto/colnod/tst_colnodapi.cpp b/test/auto/colnod/tst_colnodapi.cpp index 9ad3914..902e06f 100644 --- a/test/auto/colnod/tst_colnodapi.cpp +++ b/test/auto/colnod/tst_colnodapi.cpp @@ -20,7 +20,6 @@ public: private slots: void login(); - void getTokens(); void download_data_test(); void download_data_test_now(); void download_data_fail_test(); @@ -41,21 +40,6 @@ void ColnodTest::login() QVERIFY(login->responseData().contains("id")); } -void ColnodTest::getTokens() -{ - serversdk::RequestManager reqMan; - ColnodAPI colnod(&reqMan); - - // get login token - auto login = colnod.requestLogin(); - QSignalSpy spy(login.get(), &serversdk::Request::finished); - spy.wait(); - QString token = getLoginToken(colnod); - Timestamp time; - time.setTimestamp(QDateTime::currentMSecsSinceEpoch()); - colnod.getTokensUpdated(time); -} - void ColnodTest::download_data_test() { serversdk::RequestManager reqMan;