backbone.dropboxdatastore
Version:
Backbone Dropbox Datastore API adapter
3 lines • 5.43 kB
JavaScript
/*! backbone.dropboxdatastore - v0.5.0 - 2014-01-01
* Copyright (c) 2014 Dmytro Yarmak <dmytroyarmak@gmail.com>;*/
!function(a,b){"use strict";"object"==typeof exports&&"function"==typeof require?module.exports=b(require("underscore"),require("backbone")):"function"==typeof define&&define.amd?define(["underscore","backbone"],function(c,d){return b(c||a._,d||a.Backbone)}):b(_,Backbone)}(this,function(a,b){"use strict";return b.DropboxDatastore=function(a,b){b=b||{},this.name=a,this.datastoreId=b.datastoreId||"default",this._syncCollection=null},a.extend(b.DropboxDatastore.prototype,b.Events,{syncCollection:function(a){this._syncCollection=a},create:function(c){var d=a.bind(this._createWithTable,this,c);return this.getTable().then(d).then(b.DropboxDatastore.recordToJson)},update:function(c){var d=a.bind(this._updateWithTable,this,c);return this.getTable().then(d).then(b.DropboxDatastore.recordToJson)},find:function(c){var d=a.bind(this._findWithTable,this,c),e=this._throwIfNotFound;return this.getTable().then(d).then(e).then(b.DropboxDatastore.recordToJson)},findAll:function(){var b=a.bind(this._findAllWithTable,this);return this.getTable().then(b)},destroy:function(b){var c=a.bind(this._destroyWithTable,this,b);return this.getTable().then(c)},getTable:function(){return this._tablePromise||(this._tablePromise=this._createTablePromise()),this._tablePromise},getStatus:function(){return this._table&&this._table._datastore.getSyncStatus().uploading?"uploading":"synced"},close:function(){this._table&&(this._stopListenToChangeStatus(this._table._datastore),this._stopListenToChangeRecords(this._table._datastore))},_createTablePromise:function(){return b.DropboxDatastore.getDatastore(this.datastoreId).then(a.bind(function(a){var b=a.getTable(this.name);return this._startListenToChangeStatus(a),this._startListenToChangeRecords(a),this._table=b,b},this))},_createWithTable:function(a,b){return b.insert(a.toJSON())},_updateWithTable:function(a,b){var c=this._findWithTable(a,b);return c?c.update(a.toJSON()):c=b.insert(a.toJSON()),c},_findWithTable:function(b,c){var d,e={};if(b.isNew())throw new Error("Cannot fetch data for model without id");return"id"===b.idAttribute?d=c.get(b.id):(e[b.idAttribute]=b.id,d=a.first(c.query(e))),d},_findAllWithTable:function(c){var d=a.map(c.query(),b.DropboxDatastore.recordToJson);return d},_destroyWithTable:function(a,b){var c=this._findWithTable(a,b);return c&&c.deleteRecord(),{}},_throwIfNotFound:function(a){if(!a)throw new Error("Record not found");return a},_startListenToChangeStatus:function(b){this._changeStatusListener=a.bind(this._onChangeStatus,this),b.syncStatusChanged.addListener(this._changeStatusListener)},_startListenToChangeRecords:function(b){this._changeRecordsListener=a.bind(this._onChangeRecords,this),b.recordsChanged.addListener(this._changeRecordsListener)},_stopListenToChangeStatus:function(a){this._changeStatusListener&&(a.syncStatusChanged.removeListener(this._changeStatusListener),delete this._changeStatusListener)},_stopListenToChangeRecords:function(a){this._changeRecordsListener&&(a.recordsChanged.removeListener(this._changeRecordsListener),delete this._changeRecordsListener)},_onChangeStatus:function(){this.trigger("change:status",this.getStatus(),this)},_onChangeRecords:function(c){var d;this._syncCollection&&(d=b.DropboxDatastore.getChangesForTable(this.name,c),a.defer(b.DropboxDatastore.updateCollectionWithChanges,this._syncCollection,d))}}),a.extend(b.DropboxDatastore,{_datastorePromises:{},getDatastore:function(a){var b=this._datastorePromises[a];return b||(b=this._createDatastorePromise(a),this._datastorePromises[a]=b),b},_createDatastorePromise:function(c){var d=b.$.Deferred();return this.getDatastoreManager()._getOrCreateDatastoreByDsid(c,a.bind(function(a,b){a?d.reject(a):d.resolve(b)},this)),d.promise()},getDatastoreManager:function(){return this.getDropboxClient().getDatastoreManager()},getDropboxClient:function(){var a=b.DropboxDatastore.client;if(!a)throw new Error("Client should be defined for Backbone.DropboxDatastore");if(!a.isAuthenticated())throw new Error("Client should be authenticated for Backbone.DropboxDatastore");return a},recordToJson:function(b){return a.extend(b.getFields(),{id:b.getId()})},getChangesForTable:function(c,d){var e={toRemove:[],toAdd:[]};return a.each(d.affectedRecordsForTable(c),function(a){a.isDeleted()?e.toRemove.push(a.getId()):e.toAdd.push(b.DropboxDatastore.recordToJson(a))}),e},updateCollectionWithChanges:function(a,b){a.add(b.toAdd,{merge:!0}),a.remove(b.toRemove)},sync:function(c,d,e){var f=a.partial(b.DropboxDatastore._callSuccessHandler,d,e);return b.DropboxDatastore._doSyncMethod(d,c).then(f)},_doSyncMethod:function(a,c){var d=b.DropboxDatastore._getStoreFromModel(a);switch(c){case"read":return a instanceof b.Collection?d.findAll():d.find(a);case"create":return d.create(a);case"update":return d.update(a);case"delete":return d.destroy(a);default:throw new Error("Incorrect Sync method")}},_getStoreFromModel:function(a){return a.dropboxDatastore||a.collection.dropboxDatastore},_callSuccessHandler:function(a,c,d){return c&&c.success&&("0.9.10"===b.VERSION?c.success(a,d,c):c.success(d)),d}}),b.originalSync=b.sync,b.getSyncMethod=function(a){return a.dropboxDatastore||a.collection&&a.collection.dropboxDatastore?b.DropboxDatastore.sync:b.originalSync},b.sync=function(a,c,d){return b.getSyncMethod(c).call(this,a,c,d)},b.DropboxDatastore});