From 51ebbbc569e682a7a12c2df5a8a0eb9533a6da62 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Fri, 18 Oct 2019 15:19:53 +0700 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=BA=D0=BE=D0=BD=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BE=D1=87=D0=B5=D1=80=D0=B5=D0=B4=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20loadRecent=20&=20saveRecent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reader/ServerStorage/ServerStorage.vue | 83 ++++++++++++++----- client/components/Reader/share/bookManager.js | 2 +- 2 files changed, 63 insertions(+), 22 deletions(-) diff --git a/client/components/Reader/ServerStorage/ServerStorage.vue b/client/components/Reader/ServerStorage/ServerStorage.vue index 768196e9..45e2a239 100644 --- a/client/components/Reader/ServerStorage/ServerStorage.vue +++ b/client/components/Reader/ServerStorage/ServerStorage.vue @@ -141,8 +141,8 @@ class ServerStorage extends Vue { await this.loadProfiles(force); this.checkCurrentProfile(); await this.currentProfileChanged(force); - await this.loadRecent(); - if (force) + const loadSuccess = await this.loadRecent(); + if (loadSuccess && force) await this.saveRecent(); } } @@ -381,7 +381,7 @@ class ServerStorage extends Vue { } else if (revs.items.recentMod.rev != this.cachedRecentMod.rev) { query = {recentMod: {}}; } else - return; + return true; } } catch(e) { this.error(`Ошибка соединения с сервером: ${e.message}`); @@ -402,20 +402,25 @@ class ServerStorage extends Vue { let newRecentPatch = recent.items.recentPatch; let newRecentMod = recent.items.recentMod; - if (!newRecent) + if (!newRecent) { newRecent = _.cloneDeep(this.cachedRecent); - if (!newRecentPatch) + } + if (!newRecentPatch) { newRecentPatch = _.cloneDeep(this.cachedRecentPatch); - if (!newRecentMod) + } + if (!newRecentMod) { newRecentMod = _.cloneDeep(this.cachedRecentMod); + } if (newRecent.rev == 0) newRecent.data = {}; if (newRecentPatch.rev == 0) newRecentPatch.data = {}; if (newRecentMod.rev == 0) newRecentMod.data = {}; let result = Object.assign({}, newRecent.data, newRecentPatch.data); - if (newRecentMod.key && result[newRecentMod.key]) - result[newRecentMod.key] = utils.applyObjDiff(result[newRecentMod.key], newRecentMod.mod); + + const md = newRecentMod.data; + if (md.key && result[md.key]) + result[md.key] = utils.applyObjDiff(result[md.key], md.mod); if (newRecent.rev != this.cachedRecent.rev) await this.setCachedRecent(newRecent); @@ -432,6 +437,7 @@ class ServerStorage extends Vue { await bookManager.setRecent(result); } else { this.warning(`Неверный ответ сервера: ${recent.state}`); + return; } if (doNotifySuccess) @@ -439,6 +445,7 @@ class ServerStorage extends Vue { } finally { this.loadingRecent = false; } + return true; } async saveRecent(itemKey, recurse) { @@ -449,18 +456,52 @@ class ServerStorage extends Vue { let needSaveRecent = false; let needSaveRecentPatch = false; - let needSaveRecentMod = true; + let needSaveRecentMod = false; - let newRecentMod = _.cloneDeep(this.cachedRecentPatch); - newRecentMod.rev++; + let applyMod = null; - let newRecentPatch = _.cloneDeep(this.cachedRecentPatch); - newRecentPatch.data[itemKey] = bm.recent[itemKey]; - newRecentPatch.rev++; - needSaveRecentPatch = true; + //newRecentMod + let newRecentMod = {}; - let newRecent = {rev: this.cachedRecent.rev + 1, data: bm.recent}; + if (itemKey && this.cachedRecentPatch.data[itemKey]) { + if (this.prevItemKey == itemKey) {//сохраняем только дифф + newRecentMod = _.cloneDeep(this.cachedRecentMod); + newRecentMod.rev++; + newRecentMod.data.key = itemKey; + newRecentMod.data.mod = utils.getObjDiff(this.cachedRecentPatch.data[itemKey], bm.recent[itemKey]); + needSaveRecentMod = true; + } else {//ключ не совпадает, надо сохранять патч + applyMod = newRecentMod.data; + } + } + this.prevItemKey = itemKey; + + //newRecentPatch + let newRecentPatch = {}; + if (itemKey && !needSaveRecentMod) { + newRecentPatch = _.cloneDeep(this.cachedRecentPatch); + newRecentPatch.rev++; + newRecentPatch.data[itemKey] = bm.recent[itemKey]; + if (applyMod && applyMod.key && newRecentPatch.data[applyMod.key]) + newRecentPatch.data[applyMod.key] = utils.applyObjDiff(newRecentPatch.data[applyMod.key], applyMod.mod); + newRecentMod = {rev: this.cachedRecentMod.rev + 1, data: {}}; + needSaveRecentPatch = true; + needSaveRecentMod = true; + } + + //newRecent + let newRecent = {}; + if (!itemKey || (needSaveRecentPatch && Object.keys(newRecentPatch.data).length > 2)) { + newRecent = {rev: this.cachedRecent.rev + 1, data: bm.recent}; + newRecentPatch = {rev: this.cachedRecentPatch.rev + 1, data: {}}; + newRecentMod = {rev: this.cachedRecentMod.rev + 1, data: {}}; + needSaveRecent = true; + needSaveRecentPatch = true; + needSaveRecentMod = true; + } + + //query let query = {}; if (needSaveRecent) { query = {recent: newRecent, recentPatch: newRecentPatch, recentMod: newRecentMod}; @@ -483,10 +524,10 @@ class ServerStorage extends Vue { if (result.state == 'reject') { - await this.loadRecent(true, false); + await this.loadRecent(false, false); this.warning(`Последние изменения отменены. Данные синхронизированы с сервером.`); - if (!recurse) { + if (!recurse && itemKey) { this.savingRecent = false; this.saveRecent(itemKey, true); return; @@ -494,11 +535,11 @@ class ServerStorage extends Vue { } else if (result.state == 'success') { //this.prevSavedItem = _.cloneDeep(bm.recent[itemKey]); - if (needSaveRecent) + if (needSaveRecent && newRecent.rev) await this.setCachedRecent(newRecent); - if (needSaveRecentPatch) + if (needSaveRecentPatch && newRecentPatch.rev) await this.setCachedRecentPatch(newRecentPatch); - if (needSaveRecentMod) + if (needSaveRecentMod && newRecentMod.rev) await this.setCachedRecentMod(newRecentMod); } } finally { diff --git a/client/components/Reader/share/bookManager.js b/client/components/Reader/share/bookManager.js index b8405574..efef4552 100644 --- a/client/components/Reader/share/bookManager.js +++ b/client/components/Reader/share/bookManager.js @@ -437,7 +437,7 @@ class BookManager { Object.assign(mergedRecent, value); - //подстраховка + //подстраховка от hotReload for (let i of Object.keys(mergedRecent)) { if (!mergedRecent[i].key || mergedRecent[i].key !== i) delete mergedRecent[i];