Add some logic for change tokens to Colnod depends on our DB

This commit is contained in:
Ondřej Fischer 2019-10-17 15:06:29 +02:00
parent ecdb181ca9
commit dcd0034110
12 changed files with 155 additions and 23 deletions

View File

@ -117,6 +117,34 @@ void ColnodAPI::syncDataToColnod()
void ColnodAPI::syncChangedDataToColnod()
{
// 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()
@ -138,4 +166,10 @@ void ColnodAPI::areChangedDataReady()
}
void ColnodAPI::areProcessDataReady()
{
if (dataMan->haveProcessData())
{
emit dataLoaded();
}
}

View File

@ -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();

View File

@ -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();
}

View File

@ -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);

View File

@ -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");
}

View File

@ -32,10 +32,18 @@ public:
bool haveData();
bool haveChangedData();
bool haveProcessData();
void emptyDatabase();
void clear();
void loadTokensToAdd();
void loadTokensToDelete();
QList<QPointer<Token>>* getTokens() {return &tokens;}
QList<QString>* getTokensToDelete() {return &tokensToDelete;}
private:
DatabaseManager *db = nullptr;
QList<QPointer<Subject>> subjects;

View File

@ -157,11 +157,11 @@ QByteArray RequestManager::makeTimeStampJson(uint64_t time)
return doc.toJson();
}
QByteArray RequestManager::makeTokensJson(QList<QPointer<Token>> tokens)
QByteArray RequestManager::makeTokensJson(QList<QPointer<Token>>* 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<QPointer<Token>> tokens)
return doc.toJson();
}
QByteArray RequestManager::makeIdsJson(QList<QString> ids)
QByteArray RequestManager::makeIdsJson(QList<QString>* 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<QPointer<Token>> tokens)
Response* RequestManager::setTokens(QList<QPointer<Token>>* 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));
}

View File

@ -49,8 +49,8 @@ public:
Response* getAccessGroupMembershipUpdated(uint64_t time);
Response* getAccessGroupMembershipDeleted(uint64_t time);
Response* setTokens(QList<QPointer<Token>> tokens);
Response* deleteTokens(QList<QString> ids);
Response* setTokens(QList<QPointer<Token>>* tokens);
Response* deleteTokens(QList<QString>* 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<QPointer<Token>> tokens);
QByteArray makeIdsJson(QList<QString> ids);
QByteArray makeTokensJson(QList<QPointer<Token>>* tokens);
QByteArray makeIdsJson(QList<QString>* ids);
Response* getLoginResponse();
private slots:

View File

@ -2,6 +2,25 @@
#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) {
Entity::fromJSON(json);

View File

@ -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;

View File

@ -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<QString> 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());

View File

@ -12,7 +12,7 @@ void ComplexTest::cleanupTestCase()
{
QList<QString> 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<QPointer<Token>> 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<QString> 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();
}