2016-12-27 21:25:07 +01:00
|
|
|
#include "synchronizer.h"
|
|
|
|
#include "models/folder.h"
|
|
|
|
#include "models/note.h"
|
|
|
|
|
|
|
|
using namespace jop;
|
|
|
|
|
|
|
|
Synchronizer::Synchronizer(WebApi& api, Database &database) : api_(api), db_(database) {
|
|
|
|
qDebug() << api_.baseUrl();
|
|
|
|
connect(&api_, SIGNAL(requestDone(QJsonObject,QString)), this, SLOT(api_requestDone(QJsonObject,QString)));
|
|
|
|
}
|
|
|
|
|
|
|
|
void Synchronizer::start() {
|
|
|
|
qDebug() << "Starting synchronizer...";
|
|
|
|
|
2017-01-02 16:28:03 +01:00
|
|
|
QVector<Change> changes = Change::all();
|
2017-01-03 19:42:01 +01:00
|
|
|
changes = Change::mergedChanges(changes);
|
|
|
|
foreach (Change change, changes) {
|
|
|
|
jop::Table itemType = (jop::Table)change.value("item_type").toInt();
|
|
|
|
QString itemId = change.value("item_id").toString();
|
|
|
|
Change::Type type = (Change::Type)change.value("type").toInt();
|
2017-01-02 16:28:03 +01:00
|
|
|
|
2017-01-03 19:42:01 +01:00
|
|
|
qDebug() << itemId << itemType << type;
|
|
|
|
|
|
|
|
if (itemType == jop::FoldersTable) {
|
|
|
|
|
|
|
|
if (type == Change::Create) {
|
|
|
|
|
|
|
|
Folder folder;
|
|
|
|
folder.load(itemId);
|
|
|
|
QUrlQuery data = valuesToUrlQuery(folder.values());
|
|
|
|
api_.put("folders/" + folder.id().toString(), QUrlQuery(), data, "putFolder:" + folder.id().toString());
|
|
|
|
|
|
|
|
} else if (type == Change::Update) {
|
|
|
|
|
|
|
|
Folder folder;
|
|
|
|
folder.load(itemId);
|
|
|
|
QStringList mergedFields = change.mergedFields();
|
|
|
|
QUrlQuery data;
|
|
|
|
foreach (QString field, mergedFields) {
|
|
|
|
data.addQueryItem(field, folder.value(field).toString());
|
|
|
|
}
|
|
|
|
api_.patch("folders/" + folder.id().toString(), QUrlQuery(), data, "patchFolder:" + folder.id().toString());
|
|
|
|
|
|
|
|
} else if (type == Change::Delete) {
|
|
|
|
|
|
|
|
api_.del("folders/" + itemId, QUrlQuery(), QUrlQuery(), "deleteFolder:" + itemId);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
2017-01-02 16:28:03 +01:00
|
|
|
}
|
2017-01-03 19:42:01 +01:00
|
|
|
}
|
2017-01-02 16:28:03 +01:00
|
|
|
|
2017-01-03 19:42:01 +01:00
|
|
|
QUrlQuery Synchronizer::valuesToUrlQuery(const QHash<QString, Change::Value>& values) const {
|
|
|
|
QUrlQuery query;
|
|
|
|
for (QHash<QString, Change::Value>::const_iterator it = values.begin(); it != values.end(); ++it) {
|
|
|
|
query.addQueryItem(it.key(), it.value().toString());
|
|
|
|
}
|
|
|
|
return query;
|
2016-12-27 21:25:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void Synchronizer::api_requestDone(const QJsonObject& response, const QString& tag) {
|
2017-01-03 19:42:01 +01:00
|
|
|
qDebug() << "WebApi: done" << tag;
|
|
|
|
|
2016-12-27 21:25:07 +01:00
|
|
|
QStringList parts = tag.split(':');
|
|
|
|
QString action = tag;
|
|
|
|
QString id = "";
|
|
|
|
|
|
|
|
if (parts.size() == 2) {
|
|
|
|
action = parts[0];
|
|
|
|
id = parts[1];
|
|
|
|
}
|
|
|
|
|
2017-01-03 19:42:01 +01:00
|
|
|
// TODO: check for error
|
|
|
|
|
|
|
|
qDebug() << "Synced folder" << id;
|
|
|
|
|
2016-12-27 21:25:07 +01:00
|
|
|
if (action == "putFolder") {
|
2017-01-03 19:42:01 +01:00
|
|
|
Change::disposeByItemId(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (action == "patchFolder") {
|
|
|
|
Change::disposeByItemId(id);
|
2016-12-27 21:25:07 +01:00
|
|
|
}
|
|
|
|
|
2017-01-03 19:42:01 +01:00
|
|
|
if (action == "deleteFolder") {
|
|
|
|
Change::disposeByItemId(id);
|
2016-12-27 21:25:07 +01:00
|
|
|
}
|
|
|
|
}
|