mirror of
https://gitlab.com/spaceti-app/integrations/acs/colnod-connector.git
synced 2026-07-12 16:50:48 +02:00
add checks and fix bugs
This commit is contained in:
parent
44310bfd9d
commit
e52c293a41
@ -96,6 +96,18 @@ void DatabaseAPI::setLastUpdate(const QHash<QString, std::shared_ptr<Token>> &to
|
|||||||
qInfo(database) << equals;
|
qInfo(database) << equals;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DatabaseAPI::setLastUpdate(const QList<QString> ids)
|
||||||
|
{
|
||||||
|
auto query = mDbMan->createQuery();
|
||||||
|
for (const auto &id : ids){
|
||||||
|
query.prepare("UPDATE colnod_token SET last_update = :last_update WHERE id = :id");
|
||||||
|
query.bindValue(":last_update", QDateTime::fromMSecsSinceEpoch(getNow()).toString("yyyy-MM-dd hh:mm:ss.zzz"));
|
||||||
|
query.bindValue(":id", id);
|
||||||
|
mDbMan->executeQuery(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
qint64 DatabaseAPI::getNow()
|
qint64 DatabaseAPI::getNow()
|
||||||
{
|
{
|
||||||
auto query = mDbMan->execPlainSql("SELECT EXTRACT(EPOCH FROM NOW())*1000");
|
auto query = mDbMan->execPlainSql("SELECT EXTRACT(EPOCH FROM NOW())*1000");
|
||||||
@ -105,15 +117,14 @@ qint64 DatabaseAPI::getNow()
|
|||||||
|
|
||||||
void DatabaseAPI::initNewTokens()
|
void DatabaseAPI::initNewTokens()
|
||||||
{
|
{
|
||||||
auto query = mDbMan->execPlainSql("SELECT id, auth_errors, description, enabled, last_update, name, no_validity, time_to_live, token_bits, token_data, token_type, subject_id, last_modified, deleted "
|
auto query = mDbMan->execPlainSql("SELECT * FROM colnod_token WHERE name IS NULL");
|
||||||
"FROM colnod_token WHERE name IS NULL");
|
|
||||||
QHash<QString, std::shared_ptr<Token>> tokensToInit;
|
QHash<QString, std::shared_ptr<Token>> tokensToInit;
|
||||||
while (query.next()){
|
auto list = utils->tableFromQuery<Token>(query);
|
||||||
auto token = std::make_shared<Token>();
|
for (const auto &token : list) {
|
||||||
token->fromSQLRecord(query);
|
|
||||||
qint16 num = getNumOfTokensOfSubject(token->subjectId());
|
qint16 num = getNumOfTokensOfSubject(token->subjectId());
|
||||||
token->setName(getSubjectNameByTokenId(token->id()) + "_mobile_" + QString::number(num + 1));
|
token->setName(getSubjectNameByTokenId(token->id()) + "_mobile_" + QString::number(num + 1));
|
||||||
token->setDescription("mobile");
|
token->setDescription("mobile");
|
||||||
|
token->setTokenData(token->tokenData().toUpper());
|
||||||
tokensToInit.insert(token->id(), token);
|
tokensToInit.insert(token->id(), token);
|
||||||
}
|
}
|
||||||
uploadTokens(tokensToInit);
|
uploadTokens(tokensToInit);
|
||||||
@ -166,7 +177,7 @@ void DatabaseAPI::deleteItems(const QList<QString> &ids, const QString &tableNam
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<Token> DatabaseAPI::getLastUpdate(const QString &id)
|
std::shared_ptr<Token> DatabaseAPI::getToken(const QString &id)
|
||||||
{
|
{
|
||||||
auto query = mDbMan->createQuery();
|
auto query = mDbMan->createQuery();
|
||||||
query.prepare("SELECT * FROM colnod_token WHERE id = :id");
|
query.prepare("SELECT * FROM colnod_token WHERE id = :id");
|
||||||
@ -178,6 +189,15 @@ std::shared_ptr<Token> DatabaseAPI::getLastUpdate(const QString &id)
|
|||||||
return list.at(0);
|
return list.at(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DatabaseAPI::isAlreadyDeleted(const QString &id)
|
||||||
|
{
|
||||||
|
auto token = getToken(id);
|
||||||
|
if (token->lastUpdate() >= token->lastModified())
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
bool DatabaseAPI::exists(const QString &id, const QString &tableName)
|
bool DatabaseAPI::exists(const QString &id, const QString &tableName)
|
||||||
{
|
{
|
||||||
auto query = mDbMan->createQuery();
|
auto query = mDbMan->createQuery();
|
||||||
|
|||||||
@ -24,6 +24,7 @@ public:
|
|||||||
qint64 getLastSync();
|
qint64 getLastSync();
|
||||||
void setLastSync(qint64 timestamp);
|
void setLastSync(qint64 timestamp);
|
||||||
void setLastUpdate(const QHash<QString, std::shared_ptr<Token> > &tokens);
|
void setLastUpdate(const QHash<QString, std::shared_ptr<Token> > &tokens);
|
||||||
|
void setLastUpdate(const QList<QString> ids);
|
||||||
qint64 getNow();
|
qint64 getNow();
|
||||||
|
|
||||||
void initNewTokens();
|
void initNewTokens();
|
||||||
@ -33,7 +34,9 @@ public:
|
|||||||
void uploadSubjects(const QHash<QString, std::shared_ptr<Subject> > &subjects);
|
void uploadSubjects(const QHash<QString, std::shared_ptr<Subject> > &subjects);
|
||||||
void deleteItems(const QList<QString> &ids, const QString &tableName);
|
void deleteItems(const QList<QString> &ids, const QString &tableName);
|
||||||
|
|
||||||
std::shared_ptr<Token> getLastUpdate(const QString &id);
|
std::shared_ptr<Token> getToken(const QString &id);
|
||||||
|
|
||||||
|
bool isAlreadyDeleted(const QString &id);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool exists(const QString &id, const QString &tableName);
|
bool exists(const QString &id, const QString &tableName);
|
||||||
|
|||||||
@ -95,23 +95,39 @@ void SyncManager::prepareData()
|
|||||||
QList<QString> conflicts;
|
QList<QString> conflicts;
|
||||||
QList<QString> alreadySynced;
|
QList<QString> alreadySynced;
|
||||||
|
|
||||||
|
// check modifed tokens from colnod, dont want update token, if it was edited in db after or has been already synced
|
||||||
for (const auto &colnodToken : colnodDataToProcess->updatedTokens) {
|
for (const auto &colnodToken : colnodDataToProcess->updatedTokens) {
|
||||||
if (databaseDataToProcess->updatedTokens.contains(colnodToken->id())) {
|
if (databaseDataToProcess->updatedTokens.contains(colnodToken->id())) {
|
||||||
|
// updated in db later
|
||||||
if (databaseDataToProcess->updatedTokens.value(colnodToken->id()) > colnodToken) {
|
if (databaseDataToProcess->updatedTokens.value(colnodToken->id()) > colnodToken) {
|
||||||
conflicts.append(colnodToken->id());
|
conflicts.append(colnodToken->id());
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
auto token = database->getLastUpdate(colnodToken->id());
|
auto token = database->getToken(colnodToken->id());
|
||||||
if ( token )
|
if ( token )
|
||||||
|
// alredy synced ( tokens are same )
|
||||||
if (token == colnodToken)
|
if (token == colnodToken)
|
||||||
alreadySynced.append(colnodToken->id());
|
alreadySynced.append(colnodToken->id());
|
||||||
}
|
}
|
||||||
|
// remove tokens which should be not updated
|
||||||
for (const auto &id : conflicts)
|
for (const auto &id : conflicts)
|
||||||
colnodDataToProcess->updatedTokens.remove(id);
|
colnodDataToProcess->updatedTokens.remove(id);
|
||||||
for (const auto &id : alreadySynced)
|
for (const auto &id : alreadySynced)
|
||||||
colnodDataToProcess->updatedTokens.remove(id);
|
colnodDataToProcess->updatedTokens.remove(id);
|
||||||
|
|
||||||
|
conflicts.clear();
|
||||||
|
|
||||||
|
// chech for already deleted ( in previous synced tokens were deleted from colnod, so it come to this sync but we dont want to sync it again
|
||||||
|
for (const auto &id : colnodDataToProcess->deletedTokens) {
|
||||||
|
if (database->isAlreadyDeleted(id)) {
|
||||||
|
conflicts.append(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (const auto &id : conflicts) {
|
||||||
|
colnodDataToProcess->deletedTokens.removeOne(id);
|
||||||
|
}
|
||||||
|
|
||||||
qInfo(syncmanager) << tab << "-> COLNOD DATA - CHANGES:";
|
qInfo(syncmanager) << tab << "-> COLNOD DATA - CHANGES:";
|
||||||
qInfo(syncmanager) << tab << tab << conflicts.size() << "TOKENS WERE MODIFIED IN DATABASE";
|
qInfo(syncmanager) << tab << tab << conflicts.size() << "TOKENS WERE MODIFIED IN DATABASE";
|
||||||
qInfo(syncmanager) << tab << tab << alreadySynced.size() << "TOKENS WERE ALREADY SYNCED";
|
qInfo(syncmanager) << tab << tab << alreadySynced.size() << "TOKENS WERE ALREADY SYNCED";
|
||||||
@ -119,14 +135,16 @@ void SyncManager::prepareData()
|
|||||||
|
|
||||||
conflicts.clear();
|
conflicts.clear();
|
||||||
|
|
||||||
for (const auto &databaseToken : databaseData->updatedTokens) {
|
// chech modified from db, remove token if it was edited in colnod later
|
||||||
|
for (const auto &databaseToken : databaseDataToProcess->updatedTokens) {
|
||||||
if (colnodDataToProcess->updatedTokens.contains(databaseToken->id())) {
|
if (colnodDataToProcess->updatedTokens.contains(databaseToken->id())) {
|
||||||
if (databaseToken < colnodDataToProcess->updatedTokens.value(databaseToken->id()))
|
if (databaseToken < colnodDataToProcess->updatedTokens.value(databaseToken->id()))
|
||||||
conflicts.append(databaseToken->id());
|
conflicts.append(databaseToken->id());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
// restriction cauesed by colnod rest api
|
||||||
if (databaseToken->description() != "mobile") {
|
if (databaseToken->description() != "mobile") {
|
||||||
qWarning(syncmanager) << "Token:" << databaseToken->id() << "doesn't have 'mobile' in description and won't be pushed to Colnod";
|
qCritical(syncmanager) << "Token:" << databaseToken->id() << "doesn't have 'mobile' in description, can't be ";
|
||||||
conflicts.append(databaseToken->id());
|
conflicts.append(databaseToken->id());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -160,6 +178,7 @@ void SyncManager::updateLastUpdate(qint64 syncBegin)
|
|||||||
Timestamp time;
|
Timestamp time;
|
||||||
time.set_timestamp(syncBegin);
|
time.set_timestamp(syncBegin);
|
||||||
colnod->getTokensUpdated(time);
|
colnod->getTokensUpdated(time);
|
||||||
|
database->setLastUpdate(databaseDataToProcess->deletedTokens);
|
||||||
connect(colnod.get(), &ColnodAPI::partOfDataReady, [=](const std::shared_ptr<Data> &data){
|
connect(colnod.get(), &ColnodAPI::partOfDataReady, [=](const std::shared_ptr<Data> &data){
|
||||||
database->setLastUpdate(data->updatedTokens);
|
database->setLastUpdate(data->updatedTokens);
|
||||||
emit syncFinished();
|
emit syncFinished();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user