You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-07-16 00:14:34 +02:00
Download new items during sync
This commit is contained in:
@ -4,16 +4,29 @@
|
||||
|
||||
using namespace jop;
|
||||
|
||||
Synchronizer::Synchronizer(WebApi& api, Database &database) : api_(api), db_(database) {
|
||||
Synchronizer::Synchronizer(const QString &apiUrl, Database &database) : api_(apiUrl), db_(database) {
|
||||
qDebug() << api_.baseUrl();
|
||||
state_ = Idle;
|
||||
uploadsRemaining_ = 0;
|
||||
downloadsRemaining_ = 0;
|
||||
connect(&api_, SIGNAL(requestDone(QJsonObject,QString)), this, SLOT(api_requestDone(QJsonObject,QString)));
|
||||
}
|
||||
|
||||
void Synchronizer::start() {
|
||||
if (state_ != Idle) {
|
||||
qWarning() << "Cannot start synchronizer because synchronization already in progress. State: " << state_;
|
||||
return;
|
||||
}
|
||||
|
||||
qDebug() << "Starting synchronizer...";
|
||||
|
||||
state_ = UploadingChanges;
|
||||
|
||||
QVector<Change> changes = Change::all();
|
||||
changes = Change::mergedChanges(changes);
|
||||
|
||||
uploadsRemaining_ = changes.size();
|
||||
|
||||
foreach (Change change, changes) {
|
||||
jop::Table itemType = (jop::Table)change.value("item_type").toInt();
|
||||
QString itemId = change.value("item_id").toString();
|
||||
@ -28,7 +41,7 @@ void Synchronizer::start() {
|
||||
Folder folder;
|
||||
folder.load(itemId);
|
||||
QUrlQuery data = valuesToUrlQuery(folder.values());
|
||||
api_.put("folders/" + folder.id().toString(), QUrlQuery(), data, "putFolder:" + folder.id().toString());
|
||||
api_.put("folders/" + folder.id().toString(), QUrlQuery(), data, "upload:putFolder:" + folder.id().toString());
|
||||
|
||||
} else if (type == Change::Update) {
|
||||
|
||||
@ -39,15 +52,23 @@ void Synchronizer::start() {
|
||||
foreach (QString field, mergedFields) {
|
||||
data.addQueryItem(field, folder.value(field).toString());
|
||||
}
|
||||
api_.patch("folders/" + folder.id().toString(), QUrlQuery(), data, "patchFolder:" + folder.id().toString());
|
||||
api_.patch("folders/" + folder.id().toString(), QUrlQuery(), data, "upload:patchFolder:" + folder.id().toString());
|
||||
|
||||
} else if (type == Change::Delete) {
|
||||
|
||||
api_.del("folders/" + itemId, QUrlQuery(), QUrlQuery(), "deleteFolder:" + itemId);
|
||||
api_.del("folders/" + itemId, QUrlQuery(), QUrlQuery(), "upload:deleteFolder:" + itemId);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!uploadsRemaining_) {
|
||||
downloadChanges();
|
||||
}
|
||||
}
|
||||
|
||||
void Synchronizer::setSessionId(const QString &v) {
|
||||
api_.setSessionId(v);
|
||||
}
|
||||
|
||||
QUrlQuery Synchronizer::valuesToUrlQuery(const QHash<QString, Change::Value>& values) const {
|
||||
@ -58,31 +79,90 @@ QUrlQuery Synchronizer::valuesToUrlQuery(const QHash<QString, Change::Value>& va
|
||||
return query;
|
||||
}
|
||||
|
||||
void Synchronizer::api_requestDone(const QJsonObject& response, const QString& tag) {
|
||||
qDebug() << "WebApi: done" << tag;
|
||||
void Synchronizer::downloadChanges() {
|
||||
state_ = DownloadingChanges;
|
||||
//QUrlQuery data = valuesToUrlQuery(folder.values());
|
||||
api_.get("synchronizer", QUrlQuery(), QUrlQuery(), "download:getSynchronizer");
|
||||
}
|
||||
|
||||
void Synchronizer::api_requestDone(const QJsonObject& response, const QString& tag) {
|
||||
QStringList parts = tag.split(':');
|
||||
QString action = tag;
|
||||
QString category = parts[0];
|
||||
QString action = parts[1];
|
||||
QString id = "";
|
||||
|
||||
if (parts.size() == 2) {
|
||||
action = parts[0];
|
||||
id = parts[1];
|
||||
if (parts.size() == 3) {
|
||||
id = parts[2];
|
||||
}
|
||||
|
||||
qDebug() << "WebApi: done" << category << action << id;
|
||||
|
||||
// TODO: check for error
|
||||
|
||||
qDebug() << "Synced folder" << id;
|
||||
if (category == "upload") {
|
||||
uploadsRemaining_--;
|
||||
|
||||
if (action == "putFolder") {
|
||||
Change::disposeByItemId(id);
|
||||
}
|
||||
qDebug() << "Synced folder" << id;
|
||||
|
||||
if (action == "patchFolder") {
|
||||
Change::disposeByItemId(id);
|
||||
}
|
||||
if (action == "putFolder") {
|
||||
Change::disposeByItemId(id);
|
||||
}
|
||||
|
||||
if (action == "deleteFolder") {
|
||||
Change::disposeByItemId(id);
|
||||
if (action == "patchFolder") {
|
||||
Change::disposeByItemId(id);
|
||||
}
|
||||
|
||||
if (action == "deleteFolder") {
|
||||
Change::disposeByItemId(id);
|
||||
}
|
||||
|
||||
if (uploadsRemaining_ < 0) {
|
||||
qWarning() << "Mismatch on operations done:" << uploadsRemaining_;
|
||||
}
|
||||
|
||||
if (uploadsRemaining_ <= 0) {
|
||||
uploadsRemaining_ = 0;
|
||||
downloadChanges();
|
||||
}
|
||||
} else if (category == "download") {
|
||||
if (action == "getSynchronizer") {
|
||||
QJsonArray items = response["items"].toArray();
|
||||
foreach (QJsonValue item, items) {
|
||||
QJsonObject obj = item.toObject();
|
||||
QString itemId = obj["item_id"].toString();
|
||||
QString itemType = obj["item_type"].toString();
|
||||
QString operationType = obj["type"].toString();
|
||||
|
||||
QString path = itemType + "s"; // That should remain true
|
||||
|
||||
if (operationType == "create") {
|
||||
api_.get(path + "/" + itemId, QUrlQuery(), QUrlQuery(), "download:getFolder:" + itemId);
|
||||
}
|
||||
|
||||
downloadsRemaining_++;
|
||||
}
|
||||
} else {
|
||||
downloadsRemaining_--;
|
||||
|
||||
if (action == "getFolder") {
|
||||
Folder folder;
|
||||
folder.loadJsonObject(response);
|
||||
folder.save();
|
||||
|
||||
// TODO: save last rev ID
|
||||
}
|
||||
|
||||
if (downloadsRemaining_ < 0) {
|
||||
qCritical() << "Mismatch on download operations done" << downloadsRemaining_;
|
||||
}
|
||||
|
||||
if (downloadsRemaining_ <= 0) {
|
||||
qDebug() << "All download operations complete";
|
||||
downloadsRemaining_ = 0;
|
||||
state_ = Idle;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
qCritical() << "Invalid category" << category;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user