From ce7317c5102099af8258642fb02f3082c1c7ce8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Fischer?= Date: Wed, 9 Oct 2019 14:51:02 +0200 Subject: [PATCH] Working version for sync data from colnod to backend DB --- src/app/main.cpp | 1 - src/colnod/colnod.pri | 2 - src/colnod/colnodapi.h | 1 - src/colnod/data.cpp | 7 --- src/colnod/data.h | 24 --------- src/colnod/databasemanager.cpp | 59 +++++++++++++++----- src/colnod/databasemanager.h | 11 +++- src/colnod/datamanager.cpp | 17 ++++-- src/colnod/datamanager.h | 3 +- src/colnod/entity.cpp | 5 ++ src/colnod/entity.h | 76 +++++++++++++------------- src/colnod/subject.cpp | 17 ++++-- src/colnod/subject.h | 81 ++++++++++++++++------------ src/colnod/token.cpp | 4 ++ src/colnod/token.h | 98 +++++++++++++++++----------------- test/unitTests/UnitTest.cpp | 34 ++++++------ test/unitTests/unittest.h | 1 + 17 files changed, 248 insertions(+), 193 deletions(-) delete mode 100644 src/colnod/data.cpp delete mode 100644 src/colnod/data.h diff --git a/src/app/main.cpp b/src/app/main.cpp index 7759942..82a5be8 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -1,6 +1,5 @@ #include -#include "data.h" #include "datamanager.h" #include "colnodapi.h" diff --git a/src/colnod/colnod.pri b/src/colnod/colnod.pri index 2b038d4..51c711d 100644 --- a/src/colnod/colnod.pri +++ b/src/colnod/colnod.pri @@ -3,7 +3,6 @@ INCLUDEPATH += $$PWD message($$PWD) SOURCES += \ $$PWD/colnodapi.cpp \ - $$PWD/data.cpp \ $$PWD/databasemanager.cpp \ $$PWD/datamanager.cpp \ $$PWD/entity.cpp \ @@ -14,7 +13,6 @@ SOURCES += \ HEADERS += \ $$PWD/colnodapi.h \ - $$PWD/data.h \ $$PWD/databasemanager.h \ $$PWD/datamanager.h \ $$PWD/entity.h \ diff --git a/src/colnod/colnodapi.h b/src/colnod/colnodapi.h index e19d760..5c971d8 100644 --- a/src/colnod/colnodapi.h +++ b/src/colnod/colnodapi.h @@ -2,7 +2,6 @@ #define COLNODAPI_H #include "requestmanager.h" -#include "data.h" #include "datamanager.h" diff --git a/src/colnod/data.cpp b/src/colnod/data.cpp deleted file mode 100644 index 0ee6f2c..0000000 --- a/src/colnod/data.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "data.h" - -Data::Data() -{ - -} - diff --git a/src/colnod/data.h b/src/colnod/data.h deleted file mode 100644 index fc25e4e..0000000 --- a/src/colnod/data.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef DATA_H -#define DATA_H -#include - -#include "subject.h" -#include "token.h" -#include -#include - -class Data : public QObject -{ - Q_OBJECT - -public: - Data(); - - - -private: - - -}; - -#endif // DATA_H diff --git a/src/colnod/databasemanager.cpp b/src/colnod/databasemanager.cpp index 85c2654..47ddb2a 100644 --- a/src/colnod/databasemanager.cpp +++ b/src/colnod/databasemanager.cpp @@ -17,24 +17,49 @@ DatabaseManager::DatabaseManager(QString host, QString dbName, QString user, QSt query = QSqlQuery("query", db); } -void DatabaseManager::saveSubject(Subject* subject, QString table) +bool DatabaseManager::saveSubject(Subject* subject, QString table) { - query.prepare("INSERT INTO subject (id, name) VALUES (:id, :name)"); - query.bindValue(":table", table); - query.bindValue(":id",subject->getId().toString()); - qDebug() << subject->getId().toString() << subject->getName(); + QString id = subject->idToStringWithoutBraces(); + if (checkIfExists(id, table)) + return false; + query.prepare(QString("INSERT INTO %1 (id, name, last_update) " + "VALUES (:id, :name, :last_update)").arg(table)); + query.bindValue(":id", id); query.bindValue(":name", subject->getName()); + query.bindValue(":last_update", QDateTime::fromMSecsSinceEpoch(subject->getLastUpdate()).toString("yyyy-MM-dd hh:mm:ss.zzz")); query.exec(); + return true; } -void DatabaseManager::saveToken(Token* token, QString table) +bool DatabaseManager::saveToken(Token* token, QString table) { - query.prepare("INSERT INTO :table (id, name) VALUES (:id, :data, :subject_id)"); - query.bindValue(":table", table); - query.bindValue(":id",token->getId()); + QString id = token->idToStringWithoutBraces(); + if (checkIfExists(id, table)) + return false; + query.prepare(QString("INSERT INTO %1 (id, last_update, token_data, subject_id) " + "VALUES (:id, :last_update, :data, :subject_id)").arg(table)); + query.bindValue(":id", id); + query.bindValue(":last_update", QDateTime::fromMSecsSinceEpoch(token->getLastUpdate()).toString("yyyy-MM-dd hh:mm:ss.zzz")); query.bindValue(":data", token->getTokenData()); - query.bindValue(":subject_id", token->getSubjectId()); + query.bindValue(":subject_id", token->subjectIdToStringWithoutBraces()); query.exec(); + return true; +} + +void DatabaseManager::saveSubjectAttribute(Subject *subject, QString table) +{ + auto attributes = subject->getAtr(); + for (auto attribute : attributes){ + query.prepare(QString("INSERT INTO %1 (id, attribute_key, attribute_value, subject_id)" + "VALUES (:id, :key, :value, :subject_id)").arg(table)); + query.bindValue(":id", subject->idToStringWithoutBraces() + " " + attribute.first); + query.bindValue(":key", attribute.first); + query.bindValue(":value", attribute.second); + query.bindValue(":subject_id", subject->idToStringWithoutBraces()); + query.exec(); + } + + } QString DatabaseManager::getTestMessage(int id) @@ -43,7 +68,6 @@ QString DatabaseManager::getTestMessage(int id) query.bindValue(":id", id); query.exec(); query.next(); - //qDebug() << query.value(0); return query.value(0).toString(); } @@ -52,9 +76,6 @@ void DatabaseManager::createTestRecord(QString msg) query.exec("SELECT MAX(id) FROM test"); query.next(); int id = query.value(0).toInt() + 1; - //QString statement = QString("INSERT INTO test (id, message) VALUES (%1, '%2')").arg(id).arg(msg); - //query.exec(statement); - query.prepare("INSERT INTO test (id, message) VALUES (:id, :msg)"); query.bindValue(":id", id); query.bindValue(":msg", msg); @@ -63,3 +84,13 @@ void DatabaseManager::createTestRecord(QString msg) qDebug() << "U inserted new row, id: " << id << "msg: " << getTestMessage(id); } + + +bool DatabaseManager::checkIfExists(QString id, QString table) +{ + query.prepare(QString("SELECT exists(SELECT 1 FROM %1 WHERE id = :id)").arg(table)); + query.bindValue(":id", id); + query.exec(); + query.next(); + return query.value(0).toBool(); +} diff --git a/src/colnod/databasemanager.h b/src/colnod/databasemanager.h index 42a2eae..e4a0106 100644 --- a/src/colnod/databasemanager.h +++ b/src/colnod/databasemanager.h @@ -9,6 +9,7 @@ #include #include "subject.h" #include "token.h" +#include class DatabaseManager : public QObject @@ -17,8 +18,9 @@ class DatabaseManager : public QObject public: DatabaseManager(QString host, QString dbName, QString user, QString password); - void saveSubject(Subject* subject, QString table); - void saveToken(Token* token, QString table); + bool saveSubject(Subject* subject, QString table); + bool saveToken(Token* token, QString table); + void saveSubjectAttribute(Subject* subject, QString table); QString getTestMessage(int id); void createTestRecord(QString msg); @@ -26,6 +28,11 @@ public: bool getOpened() {return opened;} + +private: + bool checkIfExists(QString id, QString table); + + private: QSqlDatabase db; QSqlQuery query; diff --git a/src/colnod/datamanager.cpp b/src/colnod/datamanager.cpp index 857b765..05bcaa0 100644 --- a/src/colnod/datamanager.cpp +++ b/src/colnod/datamanager.cpp @@ -32,13 +32,24 @@ void DataManager::localSaveTokens(QString response) void DataManager::pushDataToDB() { + QSqlDatabase::database().transaction(); + qDebug() << "In progress..."; + int counter = 0; for (auto subject : subjects) { - db->saveSubject(subject, "subject"); + if (db->saveSubject(subject, "subject")) + counter++; + db->saveSubjectAttribute(subject, "subject_attribute"); } - + qDebug() << counter << " subjects has been updated"; + counter = 0; for (auto token : tokens) { - db->saveToken(token, "Subjects"); + if (db->saveToken(token, "token")) + counter++; } + QSqlDatabase::database().commit(); + qDebug() << counter << " tokens has been updated"; } + + diff --git a/src/colnod/datamanager.h b/src/colnod/datamanager.h index af741e6..425f769 100644 --- a/src/colnod/datamanager.h +++ b/src/colnod/datamanager.h @@ -7,7 +7,6 @@ #include "databasemanager.h" #include #include -#include "data.h" class DataManager : public QObject @@ -23,6 +22,8 @@ public: void pushDataToDB(); + + private: DatabaseManager *db = nullptr; QList> subjects; diff --git a/src/colnod/entity.cpp b/src/colnod/entity.cpp index 96eb597..da6f98f 100644 --- a/src/colnod/entity.cpp +++ b/src/colnod/entity.cpp @@ -33,6 +33,11 @@ void Entity::setLastUpdate(uint64_t lastUpdate) { this->lastUpdate = lastUpdate; } +QString Entity::idToStringWithoutBraces() +{ + return id.toString().mid(1,36); +} + void Entity::fromJSON(const QJsonObject &json) { id = json.value("id").toString(); name = json.value("name").toString(); diff --git a/src/colnod/entity.h b/src/colnod/entity.h index e416b51..d1b2aa6 100644 --- a/src/colnod/entity.h +++ b/src/colnod/entity.h @@ -1,37 +1,39 @@ -#ifndef COLNOD_CONNECTOR_ENTITY_H -#define COLNOD_CONNECTOR_ENTITY_H - -#include -#include -#include - - -class Entity : public QObject { -Q_OBJECT -public: - using QObject::QObject; - - const QUuid &getId() const; - void setId(const QUuid &id); - - const QString &getName() const; - void setName(const QString &name); - - const QString &getDescription() const; - void setDescription(const QString &description); - - uint64_t getLastUpdate() const; - void setLastUpdate(uint64_t lastUpdate); - - virtual void fromJSON(const QJsonObject &json); - virtual QJsonObject toJSON() const; -protected: - QUuid id; - QString name; - QString description; - qint64 lastUpdate; -}; - - - -#endif //COLNOD_CONNECTOR_ENTITY_H +#ifndef COLNOD_CONNECTOR_ENTITY_H +#define COLNOD_CONNECTOR_ENTITY_H + +#include +#include +#include + + +class Entity : public QObject { +Q_OBJECT +public: + using QObject::QObject; + + const QUuid &getId() const; + void setId(const QUuid &id); + + const QString &getName() const; + void setName(const QString &name); + + const QString &getDescription() const; + void setDescription(const QString &description); + + uint64_t getLastUpdate() const; + void setLastUpdate(uint64_t lastUpdate); + + QString idToStringWithoutBraces(); + + virtual void fromJSON(const QJsonObject &json); + virtual QJsonObject toJSON() const; +protected: + QUuid id; + QString name; + QString description; + qint64 lastUpdate; +}; + + + +#endif //COLNOD_CONNECTOR_ENTITY_H diff --git a/src/colnod/subject.cpp b/src/colnod/subject.cpp index 6ddff51..c2ae710 100644 --- a/src/colnod/subject.cpp +++ b/src/colnod/subject.cpp @@ -11,10 +11,13 @@ QString Subject::getEmail() const { void Subject::fromJSON(const QJsonObject &json) { Entity::fromJSON(json); - //attributes = json["attributes"]["items"].toObject(); - attributes = json.value("attributes").toObject().value("items").toObject(); - + for (int i = 0; i < attributeTypes->length(); i++) + { + if (!attributes[attributeTypes[i]].toString().isEmpty()){ + atr.append(qMakePair(attributeTypes[i], attributes[attributeTypes[i]].toString())); + } + } const auto &tokenFlagsArray = json.value("tokenFlags").toArray(); for(const auto &flag : tokenFlagsArray){ tokenFlags.insert(flag.toString()); @@ -72,3 +75,11 @@ const QSet &Subject::getPinFlags() const { void Subject::setPinFlags(const QSet &pinFlags) { Subject::pinFlags = pinFlags; } + +const QList> &Subject::getAtr() const { + return atr; +} + +void Subject::setAtr(const QList> &atr) { + this->atr = atr; +} diff --git a/src/colnod/subject.h b/src/colnod/subject.h index 8659c11..955f623 100644 --- a/src/colnod/subject.h +++ b/src/colnod/subject.h @@ -1,35 +1,46 @@ -#ifndef COLNOD_CONNECTOR_SUBJECT_H -#define COLNOD_CONNECTOR_SUBJECT_H - -#include - -#include "entity.h" - - -class Subject : public Entity { - -public: - using Entity::Entity; - - QString getEmail() const; - - const QJsonObject &getAttributes() const; - void setAttributes(const QJsonObject &attributes); - const QSet &getTokenFlags() const; - void setTokenFlags(const QSet &tokenFlags); - const QString &getPin() const; - void setPin(const QString &pin); - const QSet &getPinFlags() const; - void setPinFlags(const QSet &pinFlags); - - void fromJSON(const QJsonObject &json) override; - QJsonObject toJSON() const override; -protected: - QJsonObject attributes; - QSet tokenFlags; - QString pin; - QSet pinFlags; -}; - - -#endif //COLNOD_CONNECTOR_SUBJECT_H +#ifndef COLNOD_CONNECTOR_SUBJECT_H +#define COLNOD_CONNECTOR_SUBJECT_H + +#include + +#include "entity.h" +#include +#include +#include + +class Subject : public Entity { + +public: + using Entity::Entity; + + QString getEmail() const; + + const QJsonObject &getAttributes() const; + void setAttributes(const QJsonObject &attributes); + const QSet &getTokenFlags() const; + void setTokenFlags(const QSet &tokenFlags); + const QString &getPin() const; + void setPin(const QString &pin); + const QSet &getPinFlags() const; + void setPinFlags(const QSet &pinFlags); + // const QList> &getAtr() const; + // void setAtr(const QList> &atr); + + const QList> &getAtr() const; + void setAtr(const QList> &atr); + + void fromJSON(const QJsonObject &json) override; + QJsonObject toJSON() const override; +protected: + QJsonObject attributes; + QSet tokenFlags; + QString pin; + QSet pinFlags; + //QList> atr; + QList> atr; + const QString attributeTypes[6] = {"Jmeno", "Prijmeni", "ProfilParking", "Spolecnost", "Profil", "spz"}; + +}; + + +#endif //COLNOD_CONNECTOR_SUBJECT_H diff --git a/src/colnod/token.cpp b/src/colnod/token.cpp index bf306bf..008b0ee 100644 --- a/src/colnod/token.cpp +++ b/src/colnod/token.cpp @@ -106,3 +106,7 @@ const QUuid &Token::getSubjectId() const { void Token::setSubjectId(const QUuid &subjectId) { Token::subjectId = subjectId; } + +QString Token::subjectIdToStringWithoutBraces(){ + return subjectId.toString().mid(1,36); +} diff --git a/src/colnod/token.h b/src/colnod/token.h index fe06222..37a39a0 100644 --- a/src/colnod/token.h +++ b/src/colnod/token.h @@ -1,48 +1,50 @@ -#ifndef COLNOD_CONNECTOR_TOKEN_H -#define COLNOD_CONNECTOR_TOKEN_H - -#include "entity.h" - -#include - - -class Token : public Entity { -public: - // using Entity::Entity; - - const QString &getTokenType() const; - void setTokenType(const QString &tokenType); - int getTokenBits() const; - void setTokenBits(int tokenBits); - const QString &getTokenData() const; - void setTokenData(const QString &tokenData); - qint64 getValidFrom() const; - void setValidFrom(qint64 validFrom); - qint64 getValidTo() const; - void setValidTo(qint64 validTo); - int getTimeToLive() const; - void setTimeToLive(int timeToLive); - int getAuthErrors() const; - void setAuthErrors(int authErrors); - const QSet &getFlags() const; - void setFlags(const QSet &flags); - const QUuid &getSubjectId() const; - void setSubjectId(const QUuid &subjectId); - - - void fromJSON(const QJsonObject &json) override; - QJsonObject toJSON() const override; -protected: - QString tokenType; - int tokenBits; - QString tokenData; - qint64 validFrom; - qint64 validTo; - int timeToLive; - int authErrors; - QSet flags; - QUuid subjectId; -}; - - -#endif //COLNOD_CONNECTOR_TOKEN_H +#ifndef COLNOD_CONNECTOR_TOKEN_H +#define COLNOD_CONNECTOR_TOKEN_H + +#include "entity.h" + +#include + + +class Token : public Entity { +public: + // using Entity::Entity; + + const QString &getTokenType() const; + void setTokenType(const QString &tokenType); + int getTokenBits() const; + void setTokenBits(int tokenBits); + const QString &getTokenData() const; + void setTokenData(const QString &tokenData); + qint64 getValidFrom() const; + void setValidFrom(qint64 validFrom); + qint64 getValidTo() const; + void setValidTo(qint64 validTo); + int getTimeToLive() const; + void setTimeToLive(int timeToLive); + int getAuthErrors() const; + void setAuthErrors(int authErrors); + const QSet &getFlags() const; + void setFlags(const QSet &flags); + const QUuid &getSubjectId() const; + void setSubjectId(const QUuid &subjectId); + + QString subjectIdToStringWithoutBraces(); + + + void fromJSON(const QJsonObject &json) override; + QJsonObject toJSON() const override; +protected: + QString tokenType; + int tokenBits; + QString tokenData; + qint64 validFrom; + qint64 validTo; + int timeToLive; + int authErrors; + QSet flags; + QUuid subjectId; +}; + + +#endif //COLNOD_CONNECTOR_TOKEN_H diff --git a/test/unitTests/UnitTest.cpp b/test/unitTests/UnitTest.cpp index a25c365..fee5fb8 100644 --- a/test/unitTests/UnitTest.cpp +++ b/test/unitTests/UnitTest.cpp @@ -18,13 +18,14 @@ void UnitTest::loginSuccessfully() //POST request w/o datas void UnitTest::getSubjects() { + Response* response = new Response; RequestManager* testAccess = new RequestManager(); QSignalSpy spy(testAccess, SIGNAL(responseReady())); - testAccess->getSubjects(); + response = testAccess->getSubjects(); spy.wait(); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); - QString json = testAccess->getResponse(); + QString json = response->reply->readAll(); QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); QVERIFY(doc.isObject()); QVERIFY2(doc.object().value("items").isArray(), "No parameter 'id' in response"); @@ -35,14 +36,15 @@ void UnitTest::getSubjects() void UnitTest::getTokens() { + Response* response = new Response; RequestManager* testAccess = new RequestManager(); QSignalSpy spy(testAccess, SIGNAL(responseReady())); - testAccess->getTokens(); + response = testAccess->getTokens(); QCOMPARE(spy.count(), 0); spy.wait(); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); - QString json = testAccess->getResponse(); + QString json = response->reply->readAll(); QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); QVERIFY(doc.isObject()); QVERIFY2(doc.object().value("items").isArray(), "No parameter 'id' in response"); @@ -52,16 +54,17 @@ void UnitTest::getTokens() void UnitTest::getTokenSubject() { + Response* response = new Response; RequestManager* testAccess = new RequestManager(); QSignalSpy spy(testAccess, SIGNAL(responseReady())); - testAccess->getTokenSubject(); + response = testAccess->getTokenSubject(); QCOMPARE(spy.count(), 0); spy.wait(); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); - QString response = testAccess->getResponse(); - qDebug() << response; - QVERIFY(!response.isEmpty()); + QString json = response->reply->readAll(); + qDebug() << json; + QVERIFY(!json.isEmpty()); } void UnitTest::subjectJSONParser() @@ -79,13 +82,13 @@ void UnitTest::subjectJSONParser() QJsonObject obj = doc.object(); QJsonArray arr = obj["items"].toArray(); */ - + Response* response = new Response; RequestManager* testAccess = new RequestManager(); QSignalSpy spy(testAccess, SIGNAL(responseReady())); - testAccess->getSubjects(); + response = testAccess->getSubjects(); spy.wait(); - QString response = testAccess->getResponse(); - QJsonDocument doc = QJsonDocument::fromJson(response.toUtf8()); + QString json = response->reply->readAll(); + QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); QJsonArray arr = doc.object()["items"].toArray(); auto testSubject = new Subject(); testSubject->fromJSON(arr[1].toObject()); @@ -95,12 +98,13 @@ void UnitTest::subjectJSONParser() void UnitTest::tokenJSONParser() { + Response* response = new Response; RequestManager* testAccess = new RequestManager(); QSignalSpy spy(testAccess, SIGNAL(responseReady())); - testAccess->getTokens(); + response = testAccess->getTokens(); spy.wait(); - QString response = testAccess->getResponse(); - QJsonDocument doc = QJsonDocument::fromJson(response.toUtf8()); + QString json = response->reply->readAll(); + QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); QJsonArray arr = doc.object()["items"].toArray(); auto testToken = new Token(); testToken->fromJSON(arr[5].toObject()); diff --git a/test/unitTests/unittest.h b/test/unitTests/unittest.h index 0765fa6..911996a 100644 --- a/test/unitTests/unittest.h +++ b/test/unitTests/unittest.h @@ -8,6 +8,7 @@ #include "databasemanager.h" #include #include "datamanager.h" +#include "response.h" class UnitTest : public QObject