Работа над ServerStorage

This commit is contained in:
Book Pauk
2019-03-20 13:59:37 +07:00
parent f9d8b37b1a
commit 826ee18666
4 changed files with 109 additions and 18 deletions

View File

@@ -21,7 +21,7 @@ export default @Component({
this.serverSyncEnabledChanged(); this.serverSyncEnabledChanged();
}, },
serverStorageKey: function() { serverStorageKey: function() {
this.serverStorageKeyChanged(); this.serverStorageKeyChanged(true);
}, },
settings: function() { settings: function() {
this.debouncedSaveSettings(); this.debouncedSaveSettings();
@@ -30,7 +30,7 @@ export default @Component({
this.saveProfiles(); this.saveProfiles();
}, },
currentProfile: function() { currentProfile: function() {
this.currentProfileChanged(); this.currentProfileChanged(true);
}, },
}, },
}) })
@@ -58,28 +58,34 @@ class ServerStorage extends Vue {
await this.currentProfileChanged(); await this.currentProfileChanged();
} }
async generateNewServerStorageKey() {
const key = utils.toBase58(utils.randomArray(32));
this.commit('reader/setServerStorageKey', key);
await this.serverStorageKeyChanged();
}
async serverSyncEnabledChanged() { async serverSyncEnabledChanged() {
if (this.serverSyncEnabled) { if (this.serverSyncEnabled) {
this.prevServerStorageKey = null; this.prevServerStorageKey = null;
await this.serverStorageKeyChanged(); await this.serverStorageKeyChanged(true);
} }
} }
async serverStorageKeyChanged() { async serverStorageKeyChanged(force) {
if (this.prevServerStorageKey != this.serverStorageKey) { if (this.prevServerStorageKey != this.serverStorageKey) {
this.prevServerStorageKey = this.serverStorageKey; this.prevServerStorageKey = this.serverStorageKey;
this.hashedStorageKey = utils.toBase58(cryptoUtils.sha256(this.serverStorageKey)); this.hashedStorageKey = utils.toBase58(cryptoUtils.sha256(this.serverStorageKey));
await this.loadProfiles(); await this.loadProfiles(force);
this.checkCurrentProfile(); this.checkCurrentProfile();
} }
} }
async currentProfileChanged() { async currentProfileChanged(force) {
if (!this.currentProfile) if (!this.currentProfile)
return; return;
await this.loadSettings(); await this.loadSettings(force);
} }
get serverSyncEnabled() { get serverSyncEnabled() {
@@ -140,11 +146,25 @@ class ServerStorage extends Vue {
this.$notify.error({message}); this.$notify.error({message});
} }
async loadSettings() { async loadSettings(force) {
if (!this.serverSyncEnabled || !this.currentProfile) if (!this.serverSyncEnabled || !this.currentProfile)
return; return;
const setsId = `settings-${this.currentProfile}`; const setsId = `settings-${this.currentProfile}`;
const oldRev = this.settingsRev[setsId] || 0;
//проверим ревизию на сервере
if (!force) {
try {
const revs = await this.storageCheck({[setsId]: {}});
if (revs.state == 'success' && revs.items[setsId].rev == oldRev) {
return;
}
} catch(e) {
this.error(`Ошибка соединения с сервером: ${e.message}`);
return;
}
}
let sets = null; let sets = null;
try { try {
sets = await this.storageGet({[setsId]: {}}); sets = await this.storageGet({[setsId]: {}});
@@ -154,7 +174,6 @@ class ServerStorage extends Vue {
} }
if (sets.state == 'success') { if (sets.state == 'success') {
const oldRev = this.settingsRev[setsId] || 0;
sets = sets.items[setsId]; sets = sets.items[setsId];
if (sets.rev == 0) if (sets.rev == 0)
@@ -194,7 +213,7 @@ class ServerStorage extends Vue {
} }
if (result.state == 'reject') { if (result.state == 'reject') {
await this.loadSettings(); await this.loadSettings(true);
const newSettings = utils.applyObjDiff(this.settings, diff); const newSettings = utils.applyObjDiff(this.settings, diff);
this.commit('reader/setSettings', newSettings); this.commit('reader/setSettings', newSettings);
} }
@@ -216,10 +235,24 @@ class ServerStorage extends Vue {
} }
} }
async loadProfiles() { async loadProfiles(force) {
if (!this.serverSyncEnabled) if (!this.serverSyncEnabled)
return; return;
const oldRev = this.profilesRev;
//проверим ревизию на сервере
if (!force) {
try {
const revs = await this.storageCheck({'profiles': {}});
if (revs.state == 'success' && revs.items.profiles.rev == oldRev) {
return;
}
} catch(e) {
this.error(`Ошибка соединения с сервером: ${e.message}`);
return;
}
}
let prof = null; let prof = null;
try { try {
prof = await this.storageGet({'profiles': {}}); prof = await this.storageGet({'profiles': {}});
@@ -229,7 +262,6 @@ class ServerStorage extends Vue {
} }
if (prof.state == 'success') { if (prof.state == 'success') {
const oldRev = this.profilesRev;
prof = prof.items.profiles; prof = prof.items.profiles;
if (prof.rev == 0) if (prof.rev == 0)
@@ -253,6 +285,12 @@ class ServerStorage extends Vue {
if (utils.isEmptyObjDiff(diff)) if (utils.isEmptyObjDiff(diff))
return; return;
//обнуляются профили во время разработки, подстраховка
if (!this.$store.state.reader.allowProfilesSave) {
console.error('Сохранение профилей не санкционировано');
return;
}
this.savingProfiles = true; this.savingProfiles = true;
try { try {
let result = {state: ''}; let result = {state: ''};
@@ -269,7 +307,7 @@ class ServerStorage extends Vue {
} }
if (result.state == 'reject') { if (result.state == 'reject') {
await this.loadProfiles(); await this.loadProfiles(true);
const newProfiles = utils.applyObjDiff(this.profiles, diff); const newProfiles = utils.applyObjDiff(this.profiles, diff);
this.commit('reader/setProfiles', newProfiles); this.commit('reader/setProfiles', newProfiles);
} }
@@ -291,10 +329,7 @@ class ServerStorage extends Vue {
} }
} }
async generateNewServerStorageKey() { async loadRecent() {
const key = utils.toBase58(utils.randomArray(32));
this.commit('reader/setServerStorageKey', key);
await this.serverStorageKeyChanged();
} }
async storageCheck(items) { async storageCheck(items) {

View File

@@ -658,7 +658,11 @@ class SettingsPage extends Vue {
this.$alert('Такой профиль уже существует', 'Ошибка'); this.$alert('Такой профиль уже существует', 'Ошибка');
} else { } else {
const newProfiles = Object.assign({}, this.profiles, {[result.value]: 1}); const newProfiles = Object.assign({}, this.profiles, {[result.value]: 1});
this.commit('reader/setAllowProfilesSave', true);
await this.$nextTick();//ждем обработчики watch
this.commit('reader/setProfiles', newProfiles); this.commit('reader/setProfiles', newProfiles);
await this.$nextTick();//ждем обработчики watch
this.commit('reader/setAllowProfilesSave', false);
this.currentProfile = result.value; this.currentProfile = result.value;
} }
} }
@@ -686,7 +690,11 @@ class SettingsPage extends Vue {
if (this.profiles[this.currentProfile]) { if (this.profiles[this.currentProfile]) {
const newProfiles = Object.assign({}, this.profiles); const newProfiles = Object.assign({}, this.profiles);
delete newProfiles[this.currentProfile]; delete newProfiles[this.currentProfile];
this.commit('reader/setAllowProfilesSave', true);
await this.$nextTick();//ждем обработчики watch
this.commit('reader/setProfiles', newProfiles); this.commit('reader/setProfiles', newProfiles);
await this.$nextTick();//ждем обработчики watch
this.commit('reader/setAllowProfilesSave', false);
this.currentProfile = ''; this.currentProfile = '';
} }
} }
@@ -710,7 +718,11 @@ class SettingsPage extends Vue {
}); });
if (result.value && result.value.toLowerCase() == 'да') { if (result.value && result.value.toLowerCase() == 'да') {
this.commit('reader/setAllowProfilesSave', true);
await this.$nextTick();//ждем обработчики watch
this.commit('reader/setProfiles', {}); this.commit('reader/setProfiles', {});
await this.$nextTick();//ждем обработчики watch
this.commit('reader/setAllowProfilesSave', false);
this.currentProfile = ''; this.currentProfile = '';
} }
} catch (e) { } catch (e) {

View File

@@ -25,6 +25,8 @@ class BookManager {
async init(settings) { async init(settings) {
this.settings = settings; this.settings = settings;
this.eventListeners = [];
//bmCacheStore нужен только для ускорения загрузки читалки //bmCacheStore нужен только для ускорения загрузки читалки
this.booksCached = await bmCacheStore.getItem('books'); this.booksCached = await bmCacheStore.getItem('books');
if (!this.booksCached) if (!this.booksCached)
@@ -33,7 +35,8 @@ class BookManager {
this.recentLast = await bmCacheStore.getItem('recent-last'); this.recentLast = await bmCacheStore.getItem('recent-last');
if (this.recentLast) if (this.recentLast)
this.recent[this.recentLast.key] = this.recentLast; this.recent[this.recentLast.key] = this.recentLast;
this.recentRev = bmRecentStore.getItem('recent-rev') || 0;
this.recentLastRev = bmRecentStore.getItem('recent-last-rev') || 0;
this.books = Object.assign({}, this.booksCached); this.books = Object.assign({}, this.booksCached);
this.recentChanged1 = true; this.recentChanged1 = true;
@@ -255,9 +258,11 @@ class BookManager {
//кэшируем, аккуратно //кэшируем, аккуратно
if (!(this.recentLast && this.recentLast.key == result.key)) { if (!(this.recentLast && this.recentLast.key == result.key)) {
await bmCacheStore.setItem('recent', this.recent); await bmCacheStore.setItem('recent', this.recent);
this.emit('recent-changed');
} }
this.recentLast = result; this.recentLast = result;
await bmCacheStore.setItem('recent-last', this.recentLast); await bmCacheStore.setItem('recent-last', this.recentLast);
this.emit('recent-last-changed');
this.recentChanged1 = true; this.recentChanged1 = true;
this.recentChanged2 = true; this.recentChanged2 = true;
@@ -277,6 +282,7 @@ class BookManager {
this.recent[value.key].deleted = 1; this.recent[value.key].deleted = 1;
await bmRecentStore.setItem(value.key, this.recent[value.key].deleted); await bmRecentStore.setItem(value.key, this.recent[value.key].deleted);
await bmCacheStore.setItem('recent', this.recent); await bmCacheStore.setItem('recent', this.recent);
this.emit('recent-changed');
this.recentChanged1 = true; this.recentChanged1 = true;
this.recentChanged2 = true; this.recentChanged2 = true;
@@ -339,6 +345,40 @@ class BookManager {
return result; return result;
} }
setRecent(newRecent) {
this.recent = newRecent;
}
setRecentLast(newRecentLast) {
this.recentLast = newRecentLast;
}
setRecentRev(newRecentRev) {
bmRecentStore.setItem('recent-rev', newRecentRev);
this.recentRev = newRecentRev;
}
setRecentLastRev(newRecentLastRev) {
bmRecentStore.setItem('recent-last-rev', newRecentLastRev);
this.recentLastRev = newRecentLastRev;
}
addEventListener(listener) {
if (this.eventListeners.indexOf(listener) < 0)
this.eventListeners.push(listener);
}
removeEventListener(listener) {
const i = this.eventListeners.indexOf(listener);
if (i >= 0)
this.eventListeners.splice(i, 1);
}
emit(eventName, value) {
for (const listener of this.eventListeners)
listener(eventName, value);
}
} }
export default new BookManager(); export default new BookManager();

View File

@@ -182,6 +182,7 @@ const state = {
serverStorageKey: '', serverStorageKey: '',
profiles: {}, profiles: {},
profilesRev: 0, profilesRev: 0,
allowProfilesSave: false,//подстраховка для разработки
currentProfile: '', currentProfile: '',
settings: Object.assign({}, settingDefaults), settings: Object.assign({}, settingDefaults),
settingsRev: {}, settingsRev: {},
@@ -210,6 +211,9 @@ const mutations = {
setProfilesRev(state, value) { setProfilesRev(state, value) {
state.profilesRev = value; state.profilesRev = value;
}, },
setAllowProfilesSave(state, value) {
state.allowProfilesSave = value;
},
setCurrentProfile(state, value) { setCurrentProfile(state, value) {
state.currentProfile = value; state.currentProfile = value;
}, },