From bb7f2dd35eb0d49257132eb253b56470118370e5 Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Thu, 19 May 2016 14:27:01 +0200 Subject: [PATCH] Refactor StorageManager --- src/asset_manager/view/AssetsView.js | 2 +- src/editor/model/Editor.js | 6 +- src/storage_manager/config/config.js | 41 +++- src/storage_manager/main.js | 201 +++++++----------- src/storage_manager/model/LocalStorage.js | 5 - src/storage_manager/model/RemoteStorage.js | 5 - src/storage_manager/model/StorageInterface.js | 19 -- 7 files changed, 121 insertions(+), 158 deletions(-) delete mode 100644 src/storage_manager/model/StorageInterface.js diff --git a/src/asset_manager/view/AssetsView.js b/src/asset_manager/view/AssetsView.js index af3f92d98..31ea219e0 100644 --- a/src/asset_manager/view/AssetsView.js +++ b/src/asset_manager/view/AssetsView.js @@ -16,7 +16,7 @@ define(['backbone', './AssetView', './AssetImageView', './FileUploader'], // Check if storage is required and if Storage Manager is available if(this.config.stm && this.config.storageType !== ''){ var type = this.config.storageType; - this.provider = this.config.stm.getProvider(type); + this.provider = this.config.stm.get(type); this.storeName = this.config.storageName ? this.config.storageName : this.className; if(this.provider){ // Create new instance of provider diff --git a/src/editor/model/Editor.js b/src/editor/model/Editor.js index 41fc1fab9..584dd7914 100644 --- a/src/editor/model/Editor.js +++ b/src/editor/model/Editor.js @@ -124,7 +124,7 @@ define([ avSt = opt ? opt.avoidStore : 0; this.set('changesCount', count); - if(this.stm.isAutosave() && count < this.stm.getChangesBeforeSave()) + if(this.stm.isAutosave() && count < this.stm.getStepsBeforeSave()) return; if(!avSt){ @@ -219,7 +219,7 @@ define([ initStorage: function() { this.stm = new StorageManager(this.config.storageManager); - this.stm.loadDefaultProviders().setCurrentProvider(this.config.storageType); + this.stm.loadDefaultProviders().setCurrent(this.config.storageType); this.set('StorageManager', this.stm); }, @@ -355,7 +355,7 @@ define([ var updatedCount = this.get('changesCount') + 1, avSt = opt ? opt.avoidStore : 0; this.set('changesCount', updatedCount); - if(this.stm.isAutosave() && updatedCount < this.stm.getChangesBeforeSave()){ + if(this.stm.isAutosave() && updatedCount < this.stm.getStepsBeforeSave()){ return; } diff --git a/src/storage_manager/config/config.js b/src/storage_manager/config/config.js index 60901bc6a..cdd00aea9 100644 --- a/src/storage_manager/config/config.js +++ b/src/storage_manager/config/config.js @@ -1,19 +1,48 @@ define(function () { + return { // Enable/Disable autosaving - autosave : 1, + autosave: 1, // Indicates which storage to use. Available: local | remote - storageType : 'local', + storageType: 'local', // If autosave enabled, indicates how many changes (general changes to structure) // need to be done before save. Useful with remoteStorage to reduce remote calls - changesBeforeSave : 1, + stepsBeforeSave: 1, + + //Enable/Disable components model (JSON format) + storeComponents: true, + + //Enable/Disable styles model (JSON format) + storeStyles: false, + + //Enable/Disable saving HTML template + storeHtml: false, + + //Enable/Disable saving HTML template + storeCss: false, + + // ONLY FOR REMOTE STORAGE + // Custom params that should be passed with each store/load request + params: {}, + + // Endpoint where to save all stuff + urlStore: '', + + // Endpoint where to fetch data + urlLoad: '', + + //Callback before request + beforeSend: function(jqXHR, settings){}, + + //Callback after request + onComplete: function(jqXHR, status){}, // Defaults for remote storage - remoteStorage : { + remoteStorage: { //Enable/Disable components model (JSON format) - storeComponents: true, + storeComponents: true, //Enable/Disable styles model (JSON format) storeStyles: false, //Enable/Disable saving HTML template @@ -47,6 +76,6 @@ define(function () { }, // Defaults for local storage - localStorage : {}, + localStorage: {}, }; }); \ No newline at end of file diff --git a/src/storage_manager/main.js b/src/storage_manager/main.js index 7c1bc432d..4aaaf1503 100644 --- a/src/storage_manager/main.js +++ b/src/storage_manager/main.js @@ -5,190 +5,153 @@ define(function(require) { * * @return {Object} * */ - function StorageManager(config) - { - var c = config || {}, - defaults = require('./config/config'), - LocalStorage = require('./model/LocalStorage'), - RemoteStorage = require('./model/RemoteStorage'), - StorageInterface = require('./model/StorageInterface'); + var StorageManager = function(config) { + var c = config || {}, + defaults = require('./config/config'), + LocalStorage = require('./model/LocalStorage'), + RemoteStorage = require('./model/RemoteStorage'); for (var name in defaults){ if (!(name in c)) c[name] = defaults[name]; } - this.providers = {}; - this.defaultProviders = {}; - this.autosave = c.autosave; - this.currentProvider = c.storageType || null; - this.changesBeforeSave = c.changesBeforeSave; - this.si = new StorageInterface(); + var storages = {}; + var defaultStorages = {}; - var Local = new LocalStorage(c.localStorage), - Remote = new RemoteStorage(c.remoteStorage); + defaultStorages.remote = new RemoteStorage(c.remoteStorage); + defaultStorages.local = new LocalStorage(c.localStorage); - this.defaultProviders[Local.getId()] = Local; - this.defaultProviders[Remote.getId()] = Remote; - } - - StorageManager.prototype = { + return { /** - * Check if autosave enabled - * - * @return boolean + * Checks if autosave is enabled + * @return {Boolean} * */ - isAutosave : function(){ - return this.autosave; + isAutosave: function(){ + return c.autosave; }, /** - * Set autosave - * @param {Mixed} v Value - * - * @return this + * Set autosave value + * @param {Boolean} v + * @return {this} * */ setAutosave : function(v){ - this.autosave = v; + c.autosave = !!v; return this; }, /** - * Returns value of changes required before save - * - * @return {Integer} + * Returns number of steps required before trigger autosave + * @return {number} * */ - getChangesBeforeSave : function(){ - return this.changesBeforeSave; + getStepsBeforeSave: function(){ + return c.stepsBeforeSave; }, /** - * Set changesBeforeSave value - * @param {Mixed} v Value - * - * @return this + * Set steps required before trigger autosave + * @param {number} v + * @return {this} * */ - setChangesBeforeSave : function(v){ - this.changesBeforeSave = v; + setStepsBeforeSave: function(v){ + c.stepsBeforeSave = v; return this; }, /** - * Add new storage provider - * @param {StorageInterface} provider - * - * @return self + * Add new storage + * @param {string} id Storage ID + * @param {Object} storage Storage wrapper + * @param {Function} storage.load Load method + * @param {Function} storage.store Store method + * @return {this} + * @example + * storageManager.add('local2', { + * load: function(item){ + * return localStorage.getItem(name); + * }, + * store: function(item, value){ + * localStorage.setItem(item, value); + * } + * }); * */ - addProvider : function(provider) { - // Check interface implementation - for (var method in this.si) - if(!provider[method]) - console.warn("addProvider: method '"+ method +"' was not found inside '"+ provider.getId() +"' object"); - - this.providers[provider.getId()] = provider; - if(!this.currentProvider) - this.currentProvider = provider.getId(); + add: function(id, storage) { + storages[id] = storage; return this; }, /** - * Returns storage provider - * @param {Integer} id Storage provider ID - * - * @return {StorageInterface}|null + * Returns storage by id + * @param {string} id Storage ID + * @return {Object|null} * */ - getProvider : function(id){ - var provider = null; - if(id && this.providers[id]) - provider = this.providers[id]; - return provider; + get: function(id){ + return storages[id] || null; }, /** - * Returns storage providers - * + * Returns all storages * @return {Array} * */ - getProviders : function(){ - return this.providers; - }, - - /** - * Get current provider - * - * @return {StorageInterface} - * */ - getCurrentProvider : function() { - if(!this.currentProvider) - this.loadDefaultProviders(); - return this.getProvider(this.currentProvider); + getStorages: function() { + return storages; }, /** - * Set current provider - * @param {Integer} id Storage provider ID - * - * @return this + * Returns current storage type + * @return {string} * */ - setCurrentProvider : function(id) { - this.currentProvider = id; - return this; + getCurrent: function() { + return c.currentStorage; }, /** - * Load default providers - * - * @return this + * Set current storage type + * @param {string} id Storage ID + * @return {this} * */ - loadDefaultProviders : function() { - for (var id in this.defaultProviders) { - this.addProvider(this.defaultProviders[id]); - } + setCurrent: function(id) { + c.currentStorage = id; return this; }, /** * Store resource - * @param {String} name Name of the resource - * @param {String} value Value of the resource - * - * @return {Object|null} + * @param {String} name Resource's name + * @param {String} value Resource's value + * @return {Object|null} * */ - store : function(name, value){ - var pv = this.getCurrentProvider(); - - if(pv) - return pv.store(name, value); - - return; + store: function(name, value){ + var st = this.get(this.getCurrent()); + return st ? st.store(name, value) : null; }, /** * Load resource - * @param {String} name Name of the resource - * - * @return {Object|null} + * @param {string} name Resource's name + * @return {Object|null} Loaded resource * */ - load : function(name){ - var pv = this.getCurrentProvider(); - - if(pv) - return pv.load(name); - - return; + load: function(name){ + var st = this.get(this.getCurrent()); + return st ? st.load(name) : null; }, /** - * Remove resource - * @param {String} name Name of the resource - * - * @return {Object}|void + * Load default storages + * @return {this} + * @private * */ - remove : function(name){ - return this.getCurrentProvider().remove(name); + loadDefaultProviders : function() { + for (var id in defaultStorages) + this.add(id, defaultStorages[id]); + return this; }, + + }; }; return StorageManager; + }); \ No newline at end of file diff --git a/src/storage_manager/model/LocalStorage.js b/src/storage_manager/model/LocalStorage.js index 45e5f58c3..8dae5db38 100644 --- a/src/storage_manager/model/LocalStorage.js +++ b/src/storage_manager/model/LocalStorage.js @@ -10,11 +10,6 @@ define(['backbone'], errorNoSupport : 'Error encountered while parsing JSON response', }, - /** @inheritdoc */ - getId : function() { - return 'local'; - }, - /** @inheritdoc */ store : function(name, value) { this.checkStorageEnvironment(); diff --git a/src/storage_manager/model/RemoteStorage.js b/src/storage_manager/model/RemoteStorage.js index 1eebd890e..75701b421 100644 --- a/src/storage_manager/model/RemoteStorage.js +++ b/src/storage_manager/model/RemoteStorage.js @@ -15,11 +15,6 @@ define(['backbone'], errorLoad : 'Response is not a valid JSON', }, - /** @inheritdoc */ - getId : function() { - return 'remote'; - }, - /** @inheritdoc */ store : function(name, value) { var fd = new FormData(), diff --git a/src/storage_manager/model/StorageInterface.js b/src/storage_manager/model/StorageInterface.js deleted file mode 100644 index 4566f7cb8..000000000 --- a/src/storage_manager/model/StorageInterface.js +++ /dev/null @@ -1,19 +0,0 @@ -define(function() { - /** - * @class StorageInterface - * */ - function StorageInterface() {} - - StorageInterface.prototype = { - - getId : function() {}, - - store : function(name, value) {}, - - load : function(name) {}, - - remove : function(name) {}, - }; - - return StorageInterface; -}); \ No newline at end of file