forked from ondra/colnod-connector
Add some logic for change tokens to Colnod depends on our DB
This commit is contained in:
parent
ecdb181ca9
commit
dcd0034110
@ -117,6 +117,34 @@ void ColnodAPI::syncDataToColnod()
|
|||||||
void ColnodAPI::syncChangedDataToColnod()
|
void ColnodAPI::syncChangedDataToColnod()
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
|
dataMan->loadTokensToAdd();
|
||||||
|
dataMan->loadTokensToDelete();
|
||||||
|
processDataToColnod();
|
||||||
|
dataMan->clear();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ColnodAPI::processDataToColnod()
|
||||||
|
{
|
||||||
|
QList<QString>* tokensToDelete = dataMan->getTokensToDelete();
|
||||||
|
if ((*tokensToDelete)[0] != "empty")
|
||||||
|
{
|
||||||
|
Response* resp0 = reqMan->deleteTokens(dataMan->getTokensToDelete());
|
||||||
|
connect(resp0, &Response::ready, [=](){
|
||||||
|
areProcessDataReady();
|
||||||
|
resp0->deleteLater();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
QList<QPointer<Token>>* 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()
|
void ColnodAPI::prepareDatabase()
|
||||||
@ -138,4 +166,10 @@ void ColnodAPI::areChangedDataReady()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ColnodAPI::areProcessDataReady()
|
||||||
|
{
|
||||||
|
if (dataMan->haveProcessData())
|
||||||
|
{
|
||||||
|
emit dataLoaded();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -19,17 +19,22 @@ public:
|
|||||||
void syncDataToColnod();
|
void syncDataToColnod();
|
||||||
|
|
||||||
|
|
||||||
void downloadChangedDataFromColnod();
|
|
||||||
void syncChangedDataFromColnod();
|
void syncChangedDataFromColnod();
|
||||||
void syncChangedDataToColnod();
|
void syncChangedDataToColnod();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void prepareDatabase();
|
void prepareDatabase();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void downloadChangedDataFromColnod();
|
||||||
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void dataDownloaded();
|
void dataDownloaded();
|
||||||
void partReady();
|
void dataLoaded();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
@ -41,6 +46,8 @@ private:
|
|||||||
void syncDeletedDataFromColnod();
|
void syncDeletedDataFromColnod();
|
||||||
void areDataReady();
|
void areDataReady();
|
||||||
void areChangedDataReady();
|
void areChangedDataReady();
|
||||||
|
void areProcessDataReady();
|
||||||
|
void processDataToColnod();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -73,7 +73,7 @@ void DatabaseManager::saveSubjectAttribute(Subject *subject, QString table)
|
|||||||
auto attributes = subject->getAtr();
|
auto attributes = subject->getAtr();
|
||||||
for (auto attribute : attributes){
|
for (auto attribute : attributes){
|
||||||
QString id = subject->idToStringWithoutBraces() + " " + attribute.first;
|
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) "
|
query.prepare(QString("UPDATE %1 SET id = :id, attribute_key = :key, attribute_value = :value, subject_id = :subject_id) "
|
||||||
"WHERE id = :id").arg(table));
|
"WHERE id = :id").arg(table));
|
||||||
@ -83,7 +83,7 @@ void DatabaseManager::saveSubjectAttribute(Subject *subject, QString table)
|
|||||||
query.bindValue(":subject_id", subject->idToStringWithoutBraces());
|
query.bindValue(":subject_id", subject->idToStringWithoutBraces());
|
||||||
query.exec();
|
query.exec();
|
||||||
}
|
}
|
||||||
/* else
|
else
|
||||||
{
|
{
|
||||||
query.prepare(QString("INSERT INTO %1 (id, attribute_key, attribute_value, subject_id)"
|
query.prepare(QString("INSERT INTO %1 (id, attribute_key, attribute_value, subject_id)"
|
||||||
"VALUES (:id, :key, :value, :subject_id)").arg(table));
|
"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(":value", attribute.second);
|
||||||
query.bindValue(":subject_id", subject->idToStringWithoutBraces());
|
query.bindValue(":subject_id", subject->idToStringWithoutBraces());
|
||||||
query.exec();
|
query.exec();
|
||||||
}*/
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ void DatabaseManager::createTables()
|
|||||||
|
|
||||||
uint64_t DatabaseManager::getLastUpdate()
|
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();
|
query.next();
|
||||||
return query.value(0).toULongLong();
|
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.bindValue(":time", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz"));
|
||||||
query.exec();
|
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();
|
||||||
|
}
|
||||||
|
|||||||
@ -36,6 +36,11 @@ public:
|
|||||||
uint64_t getLastUpdate();
|
uint64_t getLastUpdate();
|
||||||
void updateLastSync();
|
void updateLastSync();
|
||||||
|
|
||||||
|
QSqlQuery* getTokensToAdd();
|
||||||
|
QSqlQuery* getTokensToDelete();
|
||||||
|
|
||||||
|
QUuid getId(QString name);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool checkIfExists(QString id, QString table);
|
bool checkIfExists(QString id, QString table);
|
||||||
|
|||||||
@ -166,6 +166,13 @@ bool DataManager::haveChangedData()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DataManager::haveProcessData()
|
||||||
|
{
|
||||||
|
if ( !tokens.isEmpty() && !tokensToDelete.isEmpty())
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t DataManager::getLastUpdate()
|
uint64_t DataManager::getLastUpdate()
|
||||||
{
|
{
|
||||||
return db->getLastUpdate();
|
return db->getLastUpdate();
|
||||||
@ -190,4 +197,29 @@ void DataManager::updateLastSync()
|
|||||||
db->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");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -32,10 +32,18 @@ public:
|
|||||||
|
|
||||||
bool haveData();
|
bool haveData();
|
||||||
bool haveChangedData();
|
bool haveChangedData();
|
||||||
|
bool haveProcessData();
|
||||||
|
|
||||||
void emptyDatabase();
|
void emptyDatabase();
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
|
void loadTokensToAdd();
|
||||||
|
void loadTokensToDelete();
|
||||||
|
|
||||||
|
QList<QPointer<Token>>* getTokens() {return &tokens;}
|
||||||
|
QList<QString>* getTokensToDelete() {return &tokensToDelete;}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DatabaseManager *db = nullptr;
|
DatabaseManager *db = nullptr;
|
||||||
QList<QPointer<Subject>> subjects;
|
QList<QPointer<Subject>> subjects;
|
||||||
|
|||||||
@ -157,11 +157,11 @@ QByteArray RequestManager::makeTimeStampJson(uint64_t time)
|
|||||||
return doc.toJson();
|
return doc.toJson();
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray RequestManager::makeTokensJson(QList<QPointer<Token>> tokens)
|
QByteArray RequestManager::makeTokensJson(QList<QPointer<Token>>* tokens)
|
||||||
{
|
{
|
||||||
QJsonObject items;
|
QJsonObject items;
|
||||||
QJsonArray jsonTokens;
|
QJsonArray jsonTokens;
|
||||||
for (auto token : tokens)
|
for (auto token : *tokens)
|
||||||
{
|
{
|
||||||
QJsonObject jsonToken;
|
QJsonObject jsonToken;
|
||||||
jsonToken.insert("id",token->idToStringWithoutBraces());
|
jsonToken.insert("id",token->idToStringWithoutBraces());
|
||||||
@ -186,10 +186,10 @@ QByteArray RequestManager::makeTokensJson(QList<QPointer<Token>> tokens)
|
|||||||
return doc.toJson();
|
return doc.toJson();
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray RequestManager::makeIdsJson(QList<QString> ids)
|
QByteArray RequestManager::makeIdsJson(QList<QString>* ids)
|
||||||
{
|
{
|
||||||
QJsonArray jsonIds;
|
QJsonArray jsonIds;
|
||||||
for (auto id : ids)
|
for (auto id : *ids)
|
||||||
{
|
{
|
||||||
jsonIds.push_back(id);
|
jsonIds.push_back(id);
|
||||||
}
|
}
|
||||||
@ -265,12 +265,12 @@ Response* RequestManager::getAccessGroupMembershipDeleted(uint64_t time)
|
|||||||
return postRequestReturnLogic("/AccessManager/getAccessGroupMembershipDeleted", makeTimeStampJson(time));
|
return postRequestReturnLogic("/AccessManager/getAccessGroupMembershipDeleted", makeTimeStampJson(time));
|
||||||
}
|
}
|
||||||
|
|
||||||
Response* RequestManager::setTokens(QList<QPointer<Token>> tokens)
|
Response* RequestManager::setTokens(QList<QPointer<Token>>* tokens)
|
||||||
{
|
{
|
||||||
return postRequestReturnLogic("/TokenManager/setTokens", makeTokensJson(tokens));
|
return postRequestReturnLogic("/TokenManager/setTokens", makeTokensJson(tokens));
|
||||||
}
|
}
|
||||||
|
|
||||||
Response* RequestManager::deleteTokens(QList<QString> ids)
|
Response* RequestManager::deleteTokens(QList<QString>* ids)
|
||||||
{
|
{
|
||||||
return postRequestReturnLogic("/TokenManager/deleteTokens", makeIdsJson(ids));
|
return postRequestReturnLogic("/TokenManager/deleteTokens", makeIdsJson(ids));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -49,8 +49,8 @@ public:
|
|||||||
Response* getAccessGroupMembershipUpdated(uint64_t time);
|
Response* getAccessGroupMembershipUpdated(uint64_t time);
|
||||||
Response* getAccessGroupMembershipDeleted(uint64_t time);
|
Response* getAccessGroupMembershipDeleted(uint64_t time);
|
||||||
|
|
||||||
Response* setTokens(QList<QPointer<Token>> tokens);
|
Response* setTokens(QList<QPointer<Token>>* tokens);
|
||||||
Response* deleteTokens(QList<QString> ids);
|
Response* deleteTokens(QList<QString>* ids);
|
||||||
|
|
||||||
Response* login(); //I want it private, but unittest???
|
Response* login(); //I want it private, but unittest???
|
||||||
|
|
||||||
@ -65,8 +65,8 @@ private:
|
|||||||
QString getLoginHeader(QString username, QString hash);
|
QString getLoginHeader(QString username, QString hash);
|
||||||
|
|
||||||
QByteArray makeTimeStampJson(uint64_t time);
|
QByteArray makeTimeStampJson(uint64_t time);
|
||||||
QByteArray makeTokensJson(QList<QPointer<Token>> tokens);
|
QByteArray makeTokensJson(QList<QPointer<Token>>* tokens);
|
||||||
QByteArray makeIdsJson(QList<QString> ids);
|
QByteArray makeIdsJson(QList<QString>* ids);
|
||||||
Response* getLoginResponse();
|
Response* getLoginResponse();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|||||||
@ -2,6 +2,25 @@
|
|||||||
|
|
||||||
#include <QJsonArray>
|
#include <QJsonArray>
|
||||||
|
|
||||||
|
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) {
|
void Token::fromJSON(const QJsonObject &json) {
|
||||||
Entity::fromJSON(json);
|
Entity::fromJSON(json);
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,9 @@ class Token : public Entity {
|
|||||||
public:
|
public:
|
||||||
// using Entity::Entity;
|
// using Entity::Entity;
|
||||||
|
|
||||||
|
Token() = default;
|
||||||
|
Token(QString name, QString tokenData, QString decription = "mobile");
|
||||||
|
Token(QString name);
|
||||||
const QString &getTokenType() const;
|
const QString &getTokenType() const;
|
||||||
void setTokenType(const QString &tokenType);
|
void setTokenType(const QString &tokenType);
|
||||||
int getTokenBits() const;
|
int getTokenBits() const;
|
||||||
|
|||||||
@ -222,7 +222,7 @@ void UnitTest::setTokens()
|
|||||||
}
|
}
|
||||||
RequestManager* testAccess = new RequestManager();
|
RequestManager* testAccess = new RequestManager();
|
||||||
QSignalSpy spy(testAccess, SIGNAL(responseReady()));
|
QSignalSpy spy(testAccess, SIGNAL(responseReady()));
|
||||||
Response* response = testAccess->setTokens(tokens);
|
Response* response = testAccess->setTokens(&tokens);
|
||||||
QCOMPARE(spy.count(), 0);
|
QCOMPARE(spy.count(), 0);
|
||||||
spy.wait(15000);
|
spy.wait(15000);
|
||||||
QVERIFY(spy.isValid());
|
QVERIFY(spy.isValid());
|
||||||
@ -238,7 +238,7 @@ void UnitTest::deleteTokens()
|
|||||||
QList<QString> ids;
|
QList<QString> ids;
|
||||||
ids.append("582c982d-6fd7-4856-8548-7ce542791c7a");
|
ids.append("582c982d-6fd7-4856-8548-7ce542791c7a");
|
||||||
ids.append("3ff23b41-3da3-4b33-82ce-d8e2d8c9a546");
|
ids.append("3ff23b41-3da3-4b33-82ce-d8e2d8c9a546");
|
||||||
Response* response = testAccess->deleteTokens(ids);
|
Response* response = testAccess->deleteTokens(&ids);
|
||||||
QCOMPARE(spy.count(), 0);
|
QCOMPARE(spy.count(), 0);
|
||||||
spy.wait(15000);
|
spy.wait(15000);
|
||||||
QVERIFY(spy.isValid());
|
QVERIFY(spy.isValid());
|
||||||
|
|||||||
@ -12,7 +12,7 @@ void ComplexTest::cleanupTestCase()
|
|||||||
{
|
{
|
||||||
QList<QString> ids;
|
QList<QString> ids;
|
||||||
ids.append("582c982d-6fd7-4856-8548-7ce542791c7a");
|
ids.append("582c982d-6fd7-4856-8548-7ce542791c7a");
|
||||||
Response* deleteTokensResp = reqMan->deleteTokens(ids);
|
Response* deleteTokensResp = reqMan->deleteTokens(&ids);
|
||||||
QSignalSpy deleteTokensRespSpy(deleteTokensResp, &Response::ready);
|
QSignalSpy deleteTokensRespSpy(deleteTokensResp, &Response::ready);
|
||||||
QCOMPARE(deleteTokensRespSpy.count(), 0);
|
QCOMPARE(deleteTokensRespSpy.count(), 0);
|
||||||
deleteTokensRespSpy.wait(10000);
|
deleteTokensRespSpy.wait(10000);
|
||||||
@ -45,7 +45,7 @@ void ComplexTest::complexTest()
|
|||||||
// ADD_TOKENS_CHECK_BEGIN
|
// ADD_TOKENS_CHECK_BEGIN
|
||||||
QList<QPointer<Token>> tokens;
|
QList<QPointer<Token>> tokens;
|
||||||
tokens.append(getTestToken());
|
tokens.append(getTestToken());
|
||||||
Response* setTokensResp = reqMan->setTokens(tokens);
|
Response* setTokensResp = reqMan->setTokens(&tokens);
|
||||||
QSignalSpy setTokensRespSpy(setTokensResp, &Response::ready);
|
QSignalSpy setTokensRespSpy(setTokensResp, &Response::ready);
|
||||||
QCOMPARE(setTokensRespSpy.count(), 0);
|
QCOMPARE(setTokensRespSpy.count(), 0);
|
||||||
setTokensRespSpy.wait(10000);
|
setTokensRespSpy.wait(10000);
|
||||||
@ -69,7 +69,7 @@ void ComplexTest::complexTest()
|
|||||||
// DELETE_TOKENS_CHECK_BEGIN
|
// DELETE_TOKENS_CHECK_BEGIN
|
||||||
QList<QString> ids;
|
QList<QString> ids;
|
||||||
ids.append("582c982d-6fd7-4856-8548-7ce542791c7a");
|
ids.append("582c982d-6fd7-4856-8548-7ce542791c7a");
|
||||||
Response* deleteTokensResp = reqMan->deleteTokens(ids);
|
Response* deleteTokensResp = reqMan->deleteTokens(&ids);
|
||||||
QSignalSpy deleteTokensRespSpy(deleteTokensResp, &Response::ready);
|
QSignalSpy deleteTokensRespSpy(deleteTokensResp, &Response::ready);
|
||||||
QCOMPARE(deleteTokensRespSpy.count(), 0);
|
QCOMPARE(deleteTokensRespSpy.count(), 0);
|
||||||
deleteTokensRespSpy.wait(10000);
|
deleteTokensRespSpy.wait(10000);
|
||||||
@ -116,7 +116,7 @@ void ComplexTest::syncLastUpdated()
|
|||||||
QSignalSpy spy(api, &ColnodAPI::dataDownloaded);
|
QSignalSpy spy(api, &ColnodAPI::dataDownloaded);
|
||||||
spy.wait(10000);
|
spy.wait(10000);
|
||||||
api->syncChangedDataFromColnod();
|
api->syncChangedDataFromColnod();
|
||||||
//api->syncUpdatedDataToColnod();
|
// api->syncChangedDataToColnod();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user