From 66b99f5df78bbb9495aa017a04922727ee20460a Mon Sep 17 00:00:00 2001 From: David Tang Date: Fri, 7 Nov 2014 12:58:23 -0800 Subject: [PATCH] adds DS.getAll --- dist/angular-data.js | 97 ++++++++++++++++--- dist/angular-data.min.js | 4 +- src/datastore/sync_methods/getAll.js | 58 +++++++++++ src/datastore/sync_methods/index.js | 10 ++ .../datastore/sync_methods/getAll.test.js | 27 ++++++ 5 files changed, 180 insertions(+), 16 deletions(-) create mode 100644 src/datastore/sync_methods/getAll.js create mode 100644 test/integration/datastore/sync_methods/getAll.test.js diff --git a/dist/angular-data.js b/dist/angular-data.js index d3c4485..26f1064 100644 --- a/dist/angular-data.js +++ b/dist/angular-data.js @@ -4860,7 +4860,7 @@ function DSProvider() { module.exports = DSProvider; -},{"./async_methods":61,"./sync_methods":81}],68:[function(require,module,exports){ +},{"./async_methods":61,"./sync_methods":82}],68:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.bindAll(scope, expr, ' + resourceName + ', params[, cb]): '; } @@ -6127,6 +6127,65 @@ function get(resourceName, id, options) { module.exports = get; },{}],80:[function(require,module,exports){ +function errorPrefix(resourceName) { + return 'DS.getAll(' + resourceName + '[, ids]): '; +} + +/** + * @doc method + * @id DS.sync methods:getAll + * @name getAll + * @description + * Synchronously return all of the resource. + * + * ## Signature: + * ```js + * DS.getAll(resourceName[, ids]) + * ``` + * + * ## Example: + * + * ```js + * DS.getAll('document'); // [{ author: 'John Anderson', id: 5 }] + * ``` + * + * ## Throws + * + * - `{IllegalArgumentError}` + * - `{NonexistentResourceError}` + * + * @param {string} resourceName The resource type, e.g. 'user', 'comment', etc. + * @param {array} ids Optional list of primary keys to filter the array of results by. + * + * @returns {array} The items of the type specified by `resourceName`. + */ +function getAll(resourceName, ids) { + var DS = this; + var IA = DS.errors.IA; + var resource; + var collection = []; + + if (!DS.definitions[resourceName]) { + throw new DS.errors.NER(errorPrefix(resourceName) + resourceName); + } else if (arguments.length === 2 && !DS.utils.isArray(ids)) { + throw new IA(errorPrefix(resourceName, ids) + 'ids: Must be an array!'); + } + + resource = DS.store[resourceName]; + + if (DS.utils.isArray(ids)) { + for (var i = 0; i < ids.length; i++) { + collection.push(resource.index.get(ids[i])); + } + } else { + collection = resource.collection.slice(); + } + + return collection; +} + +module.exports = getAll; +},{}],81:[function(require,module,exports){ function errorPrefix(resourceName, id) { return 'DS.hasChanges(' + resourceName + ', ' + id + '): '; } @@ -6191,7 +6250,7 @@ function hasChanges(resourceName, id) { module.exports = hasChanges; -},{}],81:[function(require,module,exports){ +},{}],82:[function(require,module,exports){ module.exports = { /** @@ -6314,6 +6373,16 @@ module.exports = { */ get: require('./get'), + /** + * @doc method + * @id DS.sync methods:getAll + * @name getAll + * @methodOf DS + * @description + * See [DS.getAll](/documentation/api/api/DS.sync methods:getAll). + */ + getAll: require('./getAll'), + /** * @doc method * @id DS.sync methods:hasChanges @@ -6405,7 +6474,7 @@ module.exports = { unlinkInverse: require('./unlinkInverse') }; -},{"./bindAll":68,"./bindOne":69,"./changeHistory":70,"./changes":71,"./compute":72,"./createInstance":73,"./defineResource":74,"./digest":75,"./eject":76,"./ejectAll":77,"./filter":78,"./get":79,"./hasChanges":80,"./inject":82,"./lastModified":83,"./lastSaved":84,"./link":85,"./linkAll":86,"./linkInverse":87,"./previous":88,"./unlinkInverse":89}],82:[function(require,module,exports){ +},{"./bindAll":68,"./bindOne":69,"./changeHistory":70,"./changes":71,"./compute":72,"./createInstance":73,"./defineResource":74,"./digest":75,"./eject":76,"./ejectAll":77,"./filter":78,"./get":79,"./getAll":80,"./hasChanges":81,"./inject":83,"./lastModified":84,"./lastSaved":85,"./link":86,"./linkAll":87,"./linkInverse":88,"./previous":89,"./unlinkInverse":90}],83:[function(require,module,exports){ var observe = require('../../../lib/observe-js/observe-js'); var _compute = require('./compute')._compute; @@ -6714,7 +6783,7 @@ function inject(resourceName, attrs, options) { module.exports = inject; -},{"../../../lib/observe-js/observe-js":1,"./compute":72}],83:[function(require,module,exports){ +},{"../../../lib/observe-js/observe-js":1,"./compute":72}],84:[function(require,module,exports){ function errorPrefix(resourceName, id) { return 'DS.lastModified(' + resourceName + '[, ' + id + ']): '; } @@ -6773,7 +6842,7 @@ function lastModified(resourceName, id) { module.exports = lastModified; -},{}],84:[function(require,module,exports){ +},{}],85:[function(require,module,exports){ function errorPrefix(resourceName, id) { return 'DS.lastSaved(' + resourceName + '[, ' + id + ']): '; } @@ -6837,7 +6906,7 @@ function lastSaved(resourceName, id) { module.exports = lastSaved; -},{}],85:[function(require,module,exports){ +},{}],86:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.link(' + resourceName + ', id[, relations]): '; } @@ -6939,7 +7008,7 @@ function link(resourceName, id, relations) { module.exports = link; -},{}],86:[function(require,module,exports){ +},{}],87:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.linkAll(' + resourceName + '[, params][, relations]): '; } @@ -7056,7 +7125,7 @@ function linkAll(resourceName, params, relations) { module.exports = linkAll; -},{}],87:[function(require,module,exports){ +},{}],88:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.linkInverse(' + resourceName + ', id[, relations]): '; } @@ -7154,7 +7223,7 @@ function linkInverse(resourceName, id, relations) { module.exports = linkInverse; -},{}],88:[function(require,module,exports){ +},{}],89:[function(require,module,exports){ function errorPrefix(resourceName, id) { return 'DS.previous(' + resourceName + '[, ' + id + ']): '; } @@ -7211,7 +7280,7 @@ function previous(resourceName, id) { module.exports = previous; -},{}],89:[function(require,module,exports){ +},{}],90:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.unlinkInverse(' + resourceName + ', id[, relations]): '; } @@ -7312,7 +7381,7 @@ function unlinkInverse(resourceName, id, relations) { module.exports = unlinkInverse; -},{}],90:[function(require,module,exports){ +},{}],91:[function(require,module,exports){ /** * @doc function * @id errors.types:IllegalArgumentError @@ -7445,7 +7514,7 @@ module.exports = [function () { }; }]; -},{}],91:[function(require,module,exports){ +},{}],92:[function(require,module,exports){ (function (window, angular, undefined) { 'use strict'; @@ -7534,7 +7603,7 @@ module.exports = [function () { })(window, window.angular); -},{"./adapters/http":54,"./adapters/localStorage":55,"./datastore":67,"./errors":90,"./utils":92}],92:[function(require,module,exports){ +},{"./adapters/http":54,"./adapters/localStorage":55,"./datastore":67,"./errors":91,"./utils":93}],93:[function(require,module,exports){ var DSErrors = require('./errors'); function Events(target) { @@ -7747,4 +7816,4 @@ module.exports = ['$q', function ($q) { }; }]; -},{"./errors":90,"mout/array/contains":2,"mout/array/filter":3,"mout/array/find":4,"mout/array/remove":9,"mout/array/slice":10,"mout/array/sort":11,"mout/array/toLookup":12,"mout/lang/isBoolean":19,"mout/lang/isEmpty":20,"mout/lang/isRegExp":25,"mout/object/deepMixIn":31,"mout/object/keys":35,"mout/object/merge":36,"mout/object/mixIn":37,"mout/object/pick":39,"mout/object/set":40,"mout/random/guid":42,"mout/string/makePath":49,"mout/string/pascalCase":50,"mout/string/upperCase":53}]},{},[91]); +},{"./errors":91,"mout/array/contains":2,"mout/array/filter":3,"mout/array/find":4,"mout/array/remove":9,"mout/array/slice":10,"mout/array/sort":11,"mout/array/toLookup":12,"mout/lang/isBoolean":19,"mout/lang/isEmpty":20,"mout/lang/isRegExp":25,"mout/object/deepMixIn":31,"mout/object/keys":35,"mout/object/merge":36,"mout/object/mixIn":37,"mout/object/pick":39,"mout/object/set":40,"mout/random/guid":42,"mout/string/makePath":49,"mout/string/pascalCase":50,"mout/string/upperCase":53}]},{},[92]); diff --git a/dist/angular-data.min.js b/dist/angular-data.min.js index 9e8249c..2cfd736 100644 --- a/dist/angular-data.min.js +++ b/dist/angular-data.min.js @@ -8,5 +8,5 @@ * @overview Data store for Angular.js. */ !function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;gb&&a.check_();)b++;return global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;acycles&&anyChanged);global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}});var observerSentinel={},expectedRecordTypes={add:!0,update:!0,"delete":!0};global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ObjectObserver=ObjectObserver}((exports.Number={isNaN:window.isNaN})?exports:exports)},{}],2:[function(a,b){function c(a,b){return-1!==d(a,b)}var d=a("./indexOf");b.exports=c},{"./indexOf":7}],3:[function(a,b){function c(a,b,c){b=d(b,c);var e=[];if(null==a)return e;for(var f,g=-1,h=a.length;++g=0?a[e]:void 0}var d=a("./findIndex");b.exports=c},{"./findIndex":5}],5:[function(a,b){function c(a,b,c){if(b=d(b,c),null==a)return-1;for(var e=-1,f=a.length;++ec?d+c:c;d>e;){if(a[e]===b)return e;e++}return-1}b.exports=c},{}],8:[function(a,b){function c(a){return null!=a&&""!==a}function d(a,b){return b=b||"",e(a,c).join(b)}var e=a("./filter");b.exports=d},{"./filter":3}],9:[function(a,b){function c(a,b){var c=d(a,b);-1!==c&&a.splice(c,1)}var d=a("./indexOf");b.exports=c},{"./indexOf":7}],10:[function(a,b){function c(a,b,c){var d=a.length;b=null==b?0:0>b?Math.max(d+b,0):Math.min(b,d),c=null==c?d:0>c?Math.max(d+c,0):Math.min(c,d);for(var e=[];c>b;)e.push(a[b++]);return e}b.exports=c},{}],11:[function(a,b){function c(a,b){if(null==a)return[];if(a.length<2)return a;null==b&&(b=d);var f,g,h;return f=~~(a.length/2),g=c(a.slice(0,f),b),h=c(a.slice(f,a.length),b),e(g,h,b)}function d(a,b){return b>a?-1:a>b?1:0}function e(a,b,c){for(var d=[];a.length&&b.length;)d.push(c(a[0],b[0])<=0?a.shift():b.shift());return a.length&&d.push.apply(d,a),b.length&&d.push.apply(d,b),d}b.exports=c},{}],12:[function(a,b){function c(a,b){var c={};if(null==a)return c;var e,f=-1,g=a.length;if(d(b))for(;++f0?a:6;for(var b="";a--;)b+=d(e);return b}var d=a("./choice"),e="0123456789abcdef".split("");b.exports=c},{"./choice":41}],45:[function(a,b){function c(a,b){return a=null==a?d:~~a,b=null==b?e:~~b,Math.round(f(a-.5,b+.499999999999))}var d=a("../number/MIN_INT"),e=a("../number/MAX_INT"),f=a("./rand");b.exports=c},{"../number/MAX_INT":28,"../number/MIN_INT":29,"./rand":43}],46:[function(a,b){function c(){return c.get()}c.get=Math.random,b.exports=c},{}],47:[function(a,b){function c(a){return a=d(a),a=e(a),a=f(a).replace(/[\-_]/g," ").replace(/\s[a-z]/g,g).replace(/\s+/g,"").replace(/^[A-Z]/g,h)}var d=a("../lang/toString"),e=a("./replaceAccents"),f=a("./removeNonWord"),g=a("./upperCase"),h=a("./lowerCase");b.exports=c},{"../lang/toString":27,"./lowerCase":48,"./removeNonWord":51,"./replaceAccents":52,"./upperCase":53}],48:[function(a,b){function c(a){return a=d(a),a.toLowerCase()}var d=a("../lang/toString");b.exports=c},{"../lang/toString":27}],49:[function(a,b){function c(){var a=d(e(arguments),"/");return a.replace(/([^:\/]|^)\/{2,}/g,"$1/")}var d=a("../array/join"),e=a("../array/slice");b.exports=c},{"../array/join":8,"../array/slice":10}],50:[function(a,b){function c(a){return a=d(a),e(a).replace(/^[a-z]/,f)}var d=a("../lang/toString"),e=a("./camelCase"),f=a("./upperCase");b.exports=c},{"../lang/toString":27,"./camelCase":47,"./upperCase":53}],51:[function(a,b){function c(a){return a=d(a),a.replace(e,"")}var d=a("../lang/toString"),e=/[^\x20\x2D0-9A-Z\x5Fa-z\xC0-\xD6\xD8-\xF6\xF8-\xFF]/g;b.exports=c},{"../lang/toString":27}],52:[function(a,b){function c(a){return a=d(a),a.search(/[\xC0-\xFF]/g)>-1&&(a=a.replace(/[\xC0-\xC5]/g,"A").replace(/[\xC6]/g,"AE").replace(/[\xC7]/g,"C").replace(/[\xC8-\xCB]/g,"E").replace(/[\xCC-\xCF]/g,"I").replace(/[\xD0]/g,"D").replace(/[\xD1]/g,"N").replace(/[\xD2-\xD6\xD8]/g,"O").replace(/[\xD9-\xDC]/g,"U").replace(/[\xDD]/g,"Y").replace(/[\xDE]/g,"P").replace(/[\xE0-\xE5]/g,"a").replace(/[\xE6]/g,"ae").replace(/[\xE7]/g,"c").replace(/[\xE8-\xEB]/g,"e").replace(/[\xEC-\xEF]/g,"i").replace(/[\xF1]/g,"n").replace(/[\xF2-\xF6\xF8]/g,"o").replace(/[\xF9-\xFC]/g,"u").replace(/[\xFE]/g,"p").replace(/[\xFD\xFF]/g,"y")),a}var d=a("../lang/toString");b.exports=c},{"../lang/toString":27}],53:[function(a,b){function c(a){return a=d(a),a.toUpperCase()}var d=a("../lang/toString");b.exports=c},{"../lang/toString":27}],54:[function(a,b){function c(){var a=this.defaults={queryTransform:function(a,b){return b},forceTrailingSlash:!1,$httpConfig:{}};this.$get=["$http","$log","DSUtils",function(b,c,d){return{defaults:a,HTTP:function(e){var f=(new Date).getTime();return this.defaults.forceTrailingSlash&&"/"!==e.url[e.url.length]&&(e.url+="/"),e=d.deepMixIn(e,a.$httpConfig),b(e).then(function(a){return c.debug(a.config.method+" request:"+a.config.url+" Time taken: "+((new Date).getTime()-f)+"ms",arguments),a})},GET:function(a,b){return b=b||{},"method"in b||(b.method="GET"),this.HTTP(d.deepMixIn(b,{url:a}))},POST:function(a,b,c){return c=c||{},"method"in c||(c.method="POST"),this.HTTP(d.deepMixIn(c,{url:a,data:b}))},PUT:function(a,b,c){return c=c||{},"method"in c||(c.method="PUT"),this.HTTP(d.deepMixIn(c,{url:a,data:b||{}}))},DEL:function(a,b){return b=b||{},"method"in b||(b.method="DELETE"),this.HTTP(d.deepMixIn(b,{url:a}))},find:function(a,b,c){return c=c||{},this.GET(d.makePath(c.baseUrl||a.baseUrl,a.getEndpoint(b,c),b),c)},findAll:function(b,c,e){return e=e||{},e.params=e.params||{},c&&(c=a.queryTransform(b.name,c),d.deepMixIn(e.params,c)),this.GET(d.makePath(e.baseUrl||b.baseUrl,b.getEndpoint(null,e)),e)},create:function(a,b,c){return c=c||{},this.POST(d.makePath(c.baseUrl||a.baseUrl,a.getEndpoint(b,c)),b,c)},update:function(a,b,c,e){return e=e||{},this.PUT(d.makePath(e.baseUrl||a.baseUrl,a.getEndpoint(b,e),b),c,e)},updateAll:function(b,c,e,f){return f=f||{},f.params=f.params||{},e&&(e=a.queryTransform(b.name,e),d.deepMixIn(f.params,e)),this.PUT(d.makePath(f.baseUrl||b.baseUrl,b.getEndpoint(null,f)),c,f)},destroy:function(a,b,c){return c=c||{},this.DEL(d.makePath(c.baseUrl||a.baseUrl,a.getEndpoint(b,c),b),c)},destroyAll:function(b,c,e){return e=e||{},e.params=e.params||{},c&&(c=a.queryTransform(b.name,c),d.deepMixIn(e.params,c)),this.DEL(d.makePath(e.baseUrl||b.baseUrl,b.getEndpoint(null,e)),e)}}}]}b.exports=c},{}],55:[function(a,b){function c(){this.$get=["$q","DSUtils","DSErrors",function(a,b){return{getIds:function(a,c){var d,e=b.makePath(c.baseUrl,"DSKeys",a),f=localStorage.getItem(e);return f?d=b.fromJson(f):(localStorage.setItem(e,b.toJson({})),d={}),d},saveKeys:function(a,c,d){var e=b.makePath(d.baseUrl,"DSKeys",c);localStorage.setItem(e,b.toJson(a))},ensureId:function(a,b,c){var d=this.getIds(b,c);d[a]=1,this.saveKeys(d,b,c)},removeId:function(a,b,c){var d=this.getIds(b,c);delete d[a],this.saveKeys(d,b,c)},GET:function(b){var c=a.defer();try{var d=localStorage.getItem(b);c.resolve(d?angular.fromJson(d):void 0)}catch(e){c.reject(e)}return c.promise},PUT:function(a,c){var d=this;return d.GET(a).then(function(e){return e&&b.deepMixIn(e,c),localStorage.setItem(a,angular.toJson(e||c)),d.GET(a)})},DEL:function(b){var c=a.defer();try{localStorage.removeItem(b),c.resolve()}catch(d){c.reject(d)}return c.promise},find:function(c,d,e){return e=e||{},this.GET(b.makePath(e.baseUrl||c.baseUrl,c.endpoint,d)).then(function(b){return b?b:a.reject(new Error("Not Found!"))})},findAll:function(c,d,e){var f=this,g=a.defer();e=e||{},"allowSimpleWhere"in e||(e.allowSimpleWhere=!0);var h=[],i=b.keys(f.getIds(c.name,e));return b.forEach(i,function(a){var d=localStorage.getItem(b.makePath(e.baseUrl||c.baseUrl,c.getEndpoint(a,e),a));d&&h.push(b.fromJson(d))}),g.resolve(f.DS.defaults.defaultFilter.call(f.DS,h,c.name,d,e)),g.promise},create:function(a,c,d){var e=this;return c[a.idAttribute]=c[a.idAttribute]||b.guid(),d=d||{},this.PUT(b.makePath(d.baseUrl||a.baseUrl,a.getEndpoint(c,d),c[a.idAttribute]),c).then(function(b){return e.ensureId(b[a.idAttribute],a.name,d),b})},update:function(a,c,d,e){return e=e||{},this.PUT(b.makePath(e.baseUrl||a.baseUrl,a.getEndpoint(c,e),c),d)},updateAll:function(c,d,e,f){var g=this;return this.findAll(c,e,f).then(function(e){var h=[];return b.forEach(e,function(a){h.push(g.update(c,a[c.idAttribute],d,f))}),a.all(h)})},destroy:function(a,c,d){return d=d||{},this.DEL(b.makePath(d.baseUrl||a.baseUrl,a.getEndpoint(c,d),c))},destroyAll:function(c,d,e){var f=this;return this.findAll(c,d,e).then(function(d){var g=[];return b.forEach(d,function(a){g.push(f.destroy(c,a[c.idAttribute],e))}),a.all(g)})}}}]}b.exports=c},{}],56:[function(a,b){function c(a){return"DS.create("+a+", attrs[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.$q.defer();try{var h,i=e.definitions[a];if(d=d||{},!i)throw new e.errors.NER(c(a)+a);if(!f.isObject(b))throw new e.errors.IA(c(a)+"attrs: Must be an object!");return d=f._(i,d),g.resolve(b),d.upsert&&b[i.idAttribute]?e.update(a,b[i.idAttribute],b,d):g.promise.then(function(b){return d.beforeValidate.call(b,a,b)}).then(function(b){return d.validate.call(b,a,b)}).then(function(b){return d.afterValidate.call(b,a,b)}).then(function(b){return d.beforeCreate.call(b,a,b)}).then(function(b){return d.notify&&e.emit(i,"beforeCreate",f.merge({},b)),d.eagerInject&&d.cacheResponse&&(b[i.idAttribute]=b[i.idAttribute]||f.guid(),h=e.inject(a,b)),e.adapters[d.adapter||i.defaultAdapter].create(i,d.serialize?d.serialize(a,b):i.serialize(a,b),d)}).then(function(b){var c=d.deserialize?d.deserialize(a,b):i.deserialize(a,b);return d.afterCreate.call(c,a,c)}).then(function(b){if(d.notify&&e.emit(i,"afterCreate",f.merge({},b)),d.cacheResponse){var c=e.store[a];if(d.eagerInject){var g=b[i.idAttribute],j=h[i.idAttribute],k=e.get(a,j);c.previousAttributes[g]=c.previousAttributes[j],c.changeHistories[g]=c.changeHistories[j],c.observers[g]=c.observers[j],c.modified[g]=c.modified[j],c.saved[g]=c.saved[j],c.index.put(g,k),e.eject(a,j,{notify:!1}),k[i.idAttribute]=g,c.collection.push(k)}var l=e.inject(a,b,d),m=l[i.idAttribute];return c.completedQueries[m]=(new Date).getTime(),c.previousAttributes[m]=f.deepMixIn({},l),c.saved[m]=f.updateTimestamp(c.saved[m]),e.get(a,m)}return e.createInstance(a,b,d)}).catch(function(b){return d.eagerInject&&d.cacheResponse&&e.eject(a,h[i.idAttribute],{notify:!1}),e.$q.reject(b)})}catch(j){return g.reject(j),g.promise}}b.exports=d},{}],57:[function(a,b){function c(a,b){return"DS.destroy("+a+", "+b+"[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.$q.defer();try{var h=e.definitions[a];if(d=d||{},b=f.resolveId(h,b),!h)throw new e.errors.NER(c(a,b)+a);if(!f.isString(b)&&!f.isNumber(b))throw new e.errors.IA(c(a,b)+"id: Must be a string or a number!");var i=e.get(a,b);if(!i)throw new e.errors.R(c(a,b)+'id: "'+b+'" not found!');return d=f._(h,d),g.resolve(i),g.promise.then(function(b){return d.beforeDestroy.call(b,a,b)}).then(function(c){return d.notify&&e.emit(h,"beforeDestroy",f.merge({},c)),d.eagerEject&&e.eject(a,b),e.adapters[d.adapter||h.defaultAdapter].destroy(h,b,d)}).then(function(){return d.afterDestroy.call(i,a,i)}).then(function(){return d.notify&&e.emit(h,"afterDestroy",f.merge({},i)),e.eject(a,b),b}).catch(function(b){return d.eagerEject&&i&&e.inject(a,i),e.$q.reject(b)})}catch(j){return g.reject(j),g.promise}}b.exports=d},{}],58:[function(a,b){function c(a){return"DS.destroyAll("+a+", params[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.$q.defer();try{var h=e.errors.IA,i=e.definitions[a];if(d=d||{},!i)throw new e.errors.NER(c(a)+a);if(!f.isObject(b))throw new h(c(a)+"params: Must be an object!");if(!f.isObject(d))throw new h(c(a)+"options: Must be an object!");return d=f._(i,d),g.resolve(),g.promise.then(function(){return e.adapters[d.adapter||i.defaultAdapter].destroyAll(i,b,d)}).then(function(){return e.ejectAll(a,b)})}catch(j){return g.reject(j),g.promise}}b.exports=d},{}],59:[function(a,b){function c(a,b){return"DS.find("+a+", "+b+"[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.$q.defer(),h=g.promise;try{var i=e.errors.IA,j=e.definitions[a];if(d=d||{},!j)throw new e.errors.NER(c(a,b)+a);if(!f.isString(b)&&!f.isNumber(b))throw new i(c(a,b)+"id: Must be a string or a number!");if(!f.isObject(d))throw new i(c(a,b)+"options: Must be an object!");d=f._(j,d);var k=e.store[a];if((d.bypassCache||!d.cacheResponse)&&delete k.completedQueries[b],!(b in k.completedQueries))return b in k.pendingQueries||(h=k.pendingQueries[b]=e.adapters[d.adapter||j.defaultAdapter].find(j,b,d).then(function(c){var f=d.deserialize?d.deserialize(a,c):j.deserialize(a,c);return delete k.pendingQueries[b],d.cacheResponse?(k.completedQueries[b]=(new Date).getTime(),e.inject(a,f,d)):e.createInstance(a,f,d)},function(a){return delete k.pendingQueries[b],e.$q.reject(a)})),k.pendingQueries[b];g.resolve(e.get(a,b))}catch(l){g.reject(l)}return h}b.exports=d},{}],60:[function(a,b){function c(a){return"DS.findAll("+a+", params[, options]): "}function d(a,b,d,e){var f=this,g=f.utils,h=f.store[b],i=f.definitions[b].idAttribute,j=(new Date).getTime();a=a||[],delete h.pendingQueries[d],h.completedQueries[d]=j,h.collectionModified=g.updateTimestamp(h.collectionModified);var k=f.inject(b,a,e);return g.isArray(k)?angular.forEach(k,function(a){a&&a[i]&&(h.completedQueries[a[i]]=j)}):(f.$log.warn(c(b)+"response is expected to be an array!"),h.completedQueries[k[i]]=j),k}function e(a,b,c){var e=this,f=e.utils,g=e.definitions[a],h=e.store[a],i=f.toJson(b);return(c.bypassCache||!c.cacheResponse)&&delete h.completedQueries[i],i in h.completedQueries?e.filter(a,b,c):(i in h.pendingQueries||(h.pendingQueries[i]=e.adapters[c.adapter||g.defaultAdapter].findAll(g,b,c).then(function(b){delete h.pendingQueries[i];var j=c.deserialize?c.deserialize(a,b):g.deserialize(a,b);if(!c.cacheResponse)return f.forEach(j,function(b,d){j[d]=e.createInstance(a,b,c)}),j;try{return d.call(e,j,a,i,c)}catch(k){return e.$q.reject(k)}},function(a){return delete h.pendingQueries[i],e.$q.reject(a)})),h.pendingQueries[i])}function f(a,b,d){var f=this,g=f.utils,h=f.$q.defer(),i=f.definitions[a];try{var j=f.errors.IA;if(d=d||{},b=b||{},!i)throw new f.errors.NER(c(a)+a);if(!g.isObject(b))throw new j(c(a)+"params: Must be an object!");if(!g.isObject(d))throw new j(c(a)+"options: Must be an object!");return d=g._(i,d),h.resolve(),h.promise.then(function(){return e.call(f,a,b,d)})}catch(k){return h.reject(k),h.promise}}b.exports=f},{}],61:[function(a,b){b.exports={create:a("./create"),destroy:a("./destroy"),destroyAll:a("./destroyAll"),find:a("./find"),findAll:a("./findAll"),loadRelations:a("./loadRelations"),refresh:a("./refresh"),save:a("./save"),update:a("./update"),updateAll:a("./updateAll")}},{"./create":56,"./destroy":57,"./destroyAll":58,"./find":59,"./findAll":60,"./loadRelations":62,"./refresh":63,"./save":64,"./update":65,"./updateAll":66}],62:[function(a,b){function c(a){return"DS.loadRelations("+a+", instance(Id), relations[, options]): "}function d(a,b,d,e){var f=this,g=f.utils,h=f.$q.defer();try{var i=f.errors.IA,j=f.definitions[a];if(e=e||{},(g.isString(b)||g.isNumber(b))&&(b=f.get(a,b)),angular.isString(d)&&(d=[d]),!j)throw new f.errors.NER(c(a)+a);if(!g.isObject(b))throw new i(c(a)+"instance(Id): Must be a string, number or object!");if(!g.isArray(d))throw new i(c(a)+"relations: Must be a string or an array!");if(!g.isObject(e))throw new i(c(a)+"options: Must be an object!");e=g._(j,e),e.hasOwnProperty("findBelongsTo")||(e.findBelongsTo=!0),e.hasOwnProperty("findHasMany")||(e.findHasMany=!0);var k=[],l=[];return g.forEach(j.relationList,function(a){var c=a.relation;if(g.contains(d,c)){var h,i={};i[a.foreignKey]=b[j.idAttribute],"hasMany"===a.type&&i[a.foreignKey]?h=f.findAll(c,i,e):"hasOne"===a.type?a.localKey&&b[a.localKey]?h=f.find(c,b[a.localKey],e):a.foreignKey&&i[a.foreignKey]&&(h=f.findAll(c,i,e).then(function(a){return a.length?a[0]:null})):b[a.localKey]&&(h=f.find(c,b[a.localKey],e)),h&&(k.push(h),l.push(a.localField))}}),h.resolve(),h.promise.then(function(){return f.$q.all(k)}).then(function(a){return angular.forEach(l,function(c,d){b[c]=a[d]}),b})}catch(m){return h.reject(m),h.promise}}b.exports=d},{}],63:[function(a,b){function c(a,b){return"DS.refresh("+a+", "+b+"[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.errors.IA,h=e.definitions[a];if(d=d||{},b=f.resolveId(e.definitions[a],b),h){if(f.isString(b)||f.isNumber(b)){if(f.isObject(d)){if(d=f._(h,d),d.bypassCache=!0,e.get(a,b))return e.find(a,b,d);var i=e.$q.defer();return i.resolve(),i.promise}throw new g(c(a,b)+"options: Must be an object!")}throw new g(c(a,b)+"id: Must be a string or a number!")}throw new e.errors.NER(c(a,b)+a)}b.exports=d},{}],64:[function(a,b){function c(a,b){return"DS.save("+a+", "+b+"[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.$q.defer();try{var h=e.errors.IA,i=e.definitions[a];if(d=d||{},b=f.resolveId(i,b),!i)throw new e.errors.NER(c(a,b)+a);if(!f.isString(b)&&!f.isNumber(b))throw new h(c(a,b)+"id: Must be a string or a number!");if(!f.isObject(d))throw new h(c(a,b)+"options: Must be an object!");var j=e.get(a,b);if(!j)throw new e.errors.R(c(a,b)+'id: "'+b+'" not found!');return d=f._(i,d),g.resolve(j),g.promise.then(function(b){return d.beforeValidate.call(b,a,b)}).then(function(b){return d.validate.call(b,a,b)}).then(function(b){return d.afterValidate.call(b,a,b)}).then(function(b){return d.beforeUpdate.call(b,a,b)}).then(function(c){if(d.notify&&e.emit(i,"beforeUpdate",f.merge({},c)),d.changesOnly){var g=e.store[a];g.observers[b].deliver();var h=[],j=e.changes(a,b);for(var k in j.added)h.push(k);for(k in j.changed)h.push(k);if(j=f.pick(c,h),f.isEmpty(j))return c;c=j}return e.adapters[d.adapter||i.defaultAdapter].update(i,b,d.serialize?d.serialize(a,c):i.serialize(a,c),d)}).then(function(b){var c=d.deserialize?d.deserialize(a,b):i.deserialize(a,b);return d.afterUpdate.call(c,a,c)}).then(function(c){if(d.notify&&e.emit(i,"afterUpdate",f.merge({},c)),d.cacheResponse){var g=e.store[a],h=e.inject(i.name,c,d);return g.previousAttributes[b]=f.deepMixIn({},h),g.saved[b]=f.updateTimestamp(g.saved[b]),g.observers[b].discardChanges(),e.get(a,b)}return c})}catch(k){return g.reject(k),g.promise}}b.exports=d},{}],65:[function(a,b){function c(a,b){return"DS.update("+a+", "+b+", attrs[, options]): "}function d(a,b,d,e){var f=this,g=f.utils,h=f.$q.defer();try{var i=f.errors.IA,j=f.definitions[a];if(e=e||{},b=g.resolveId(j,b),!j)throw new f.errors.NER(c(a,b)+a);if(!g.isString(b)&&!g.isNumber(b))throw new i(c(a,b)+"id: Must be a string or a number!");if(!g.isObject(d))throw new i(c(a,b)+"attrs: Must be an object!");if(!g.isObject(e))throw new i(c(a,b)+"options: Must be an object!");return e=g._(j,e),h.resolve(d),h.promise.then(function(b){return e.beforeValidate.call(b,a,b)}).then(function(b){return e.validate.call(b,a,b)}).then(function(b){return e.afterValidate.call(b,a,b) -}).then(function(b){return e.beforeUpdate.call(b,a,b)}).then(function(c){return e.notify&&f.emit(j,"beforeUpdate",g.merge({},c)),f.adapters[e.adapter||j.defaultAdapter].update(j,b,e.serialize?e.serialize(a,c):j.serialize(a,c),e)}).then(function(b){var c=e.deserialize?e.deserialize(a,b):j.deserialize(a,b);return e.afterUpdate.call(c,a,c)}).then(function(b){if(e.notify&&f.emit(j,"afterUpdate",g.merge({},b)),e.cacheResponse){var c=f.store[a],d=f.inject(j.name,b,e),h=d[j.idAttribute];return c.previousAttributes[h]=g.deepMixIn({},d),c.saved[h]=g.updateTimestamp(c.saved[h]),c.observers[h].discardChanges(),f.get(j.name,h)}return b})}catch(k){return h.reject(k),h.promise}}b.exports=d},{}],66:[function(a,b){function c(a){return"DS.updateAll("+a+", attrs, params[, options]): "}function d(a,b,d,e){var f=this,g=f.utils,h=f.$q.defer();try{var i=f.errors.IA,j=f.definitions[a];if(e=e||{},!j)throw new f.errors.NER(c(a)+a);if(!g.isObject(b))throw new i(c(a)+"attrs: Must be an object!");if(!g.isObject(d))throw new i(c(a)+"params: Must be an object!");if(!g.isObject(e))throw new i(c(a)+"options: Must be an object!");return e=g._(j,e),h.resolve(b),h.promise.then(function(b){return e.beforeValidate.call(b,a,b)}).then(function(b){return e.validate.call(b,a,b)}).then(function(b){return e.afterValidate.call(b,a,b)}).then(function(b){return e.beforeUpdate.call(b,a,b)}).then(function(b){return e.notify&&f.emit(j,"beforeUpdate",g.merge({},b)),f.adapters[e.adapter||j.defaultAdapter].updateAll(j,e.serialize?e.serialize(a,b):j.serialize(a,b),d,e)}).then(function(b){var c=e.deserialize?e.deserialize(a,b):j.deserialize(a,b);return e.afterUpdate.call(c,a,c)}).then(function(a){return e.notify&&f.emit(j,"afterUpdate",g.merge({},a)),e.cacheResponse?f.inject(j.name,a,e):a})}catch(k){return h.reject(k),h.promise}}b.exports=d},{}],67:[function(a,b){function c(a,b,c){c(null,b)}function d(){}function e(){var b=this.defaults=new d;this.$get=["$rootScope","$log","$q","DSHttpAdapter","DSLocalStorageAdapter","DSUtils","DSErrors",function(c,d,e,f,g,h,i){var j,k=a("./sync_methods"),l=a("./async_methods");try{j=angular.injector(["angular-data.DSCacheFactory"]).get("DSCacheFactory")}catch(m){d.debug("DSCacheFactory is unavailable. Resorting to the lesser capabilities of $cacheFactory."),j=angular.injector(["ng"]).get("$cacheFactory")}var n={emit:function(a,b){var d=Array.prototype.slice.call(arguments,2);d.unshift(a.name),d.unshift("DS."+b),a.emit.apply(a,d),"broadcast"===a.events?c.$broadcast.apply(c,d):"emit"===a.events&&c.$emit.apply(c,d)},$rootScope:c,$log:d,$q:e,cacheFactory:j,defaults:b,store:{},definitions:{},adapters:{DSHttpAdapter:f,DSLocalStorageAdapter:g},errors:i,utils:h};return h.deepFreeze(k),h.deepFreeze(l),h.deepMixIn(n,k),h.deepMixIn(n,l),h.deepFreeze(n.errors),h.deepFreeze(n.utils),f.DS=n,g.DS=n,("function"!=typeof Object.observe||"function"!=typeof Array.observe)&&c.$watch(function(){return(new Date).getTime()/100|0},function(){n.digest()}),n}]}d.prototype.idAttribute="id",d.prototype.defaultAdapter="DSHttpAdapter",d.prototype.defaultFilter=function(a,b,c,d){var e=this,f=a,g=null,h={skip:"",offset:"",where:"",limit:"",orderBy:"",sort:""};g=e.utils.isObject(c.where)?c.where:{},d.allowSimpleWhere&&e.utils.forEach(c,function(a,b){b in h||b in g||(g[b]={"==":a})}),e.utils.isEmpty(g)&&(g=null),g&&(f=e.utils.filter(f,function(a){var b=!0,c=!0;return e.utils.forEach(g,function(d,f){e.utils.isString(d)?d={"===":d}:(e.utils.isNumber(d)||e.utils.isBoolean(d))&&(d={"==":d}),e.utils.isObject(d)&&e.utils.forEach(d,function(d,g){"=="===g?c=b?a[f]==d:c&&a[f]==d:"==="===g?c=b?a[f]===d:c&&a[f]===d:"!="===g?c=b?a[f]!=d:c&&a[f]!=d:"!=="===g?c=b?a[f]!==d:c&&a[f]!==d:">"===g?c=b?a[f]>d:c&&a[f]>d:">="===g?c=b?a[f]>=d:c&&a[f]>=d:"<"===g?c=b?a[f]"===g?c=b?a[f]>d:c||a[f]>d:"|>="===g?c=b?a[f]>=d:c||a[f]>=d:"|<"===g?c=b?a[f]f?-1:f>d?1:0:f>d?-1:d>f?1:0})});var j=angular.isNumber(c.limit)?c.limit:null,k=null;return angular.isNumber(c.skip)?k=c.skip:angular.isNumber(c.offset)&&(k=c.offset),j&&k?f=e.utils.slice(f,k,Math.min(f.length,k+j)):e.utils.isNumber(j)?f=e.utils.slice(f,0,Math.min(f.length,j)):e.utils.isNumber(k)&&(f=k=b?a+1:b},deepFreeze:function i(a){if("function"==typeof Object.freeze){var b,c;Object.freeze(a);for(c in a)b=a[c],a.hasOwnProperty(c)&&"object"==typeof b&&!Object.isFrozen(b)&&i(b)}},diffObjectFromOldObject:function(a,b,c){var e={},f={},g={};c=c||[];for(var h in b){var i=a[h];d(h,c)||(void 0===i||i!==b[h])&&(h in a?i!==b[h]&&(g[h]=i):f[h]=void 0)}for(var j in a)j in b||d(j,c)||(e[j]=a[j]);return{added:e,removed:f,changed:g}},Events:c}}]},{"./errors":90,"mout/array/contains":2,"mout/array/filter":3,"mout/array/find":4,"mout/array/remove":9,"mout/array/slice":10,"mout/array/sort":11,"mout/array/toLookup":12,"mout/lang/isBoolean":19,"mout/lang/isEmpty":20,"mout/lang/isRegExp":25,"mout/object/deepMixIn":31,"mout/object/keys":35,"mout/object/merge":36,"mout/object/mixIn":37,"mout/object/pick":39,"mout/object/set":40,"mout/random/guid":42,"mout/string/makePath":49,"mout/string/pascalCase":50,"mout/string/upperCase":53}]},{},[91]); \ No newline at end of file +}).then(function(b){return e.beforeUpdate.call(b,a,b)}).then(function(c){return e.notify&&f.emit(j,"beforeUpdate",g.merge({},c)),f.adapters[e.adapter||j.defaultAdapter].update(j,b,e.serialize?e.serialize(a,c):j.serialize(a,c),e)}).then(function(b){var c=e.deserialize?e.deserialize(a,b):j.deserialize(a,b);return e.afterUpdate.call(c,a,c)}).then(function(b){if(e.notify&&f.emit(j,"afterUpdate",g.merge({},b)),e.cacheResponse){var c=f.store[a],d=f.inject(j.name,b,e),h=d[j.idAttribute];return c.previousAttributes[h]=g.deepMixIn({},d),c.saved[h]=g.updateTimestamp(c.saved[h]),c.observers[h].discardChanges(),f.get(j.name,h)}return b})}catch(k){return h.reject(k),h.promise}}b.exports=d},{}],66:[function(a,b){function c(a){return"DS.updateAll("+a+", attrs, params[, options]): "}function d(a,b,d,e){var f=this,g=f.utils,h=f.$q.defer();try{var i=f.errors.IA,j=f.definitions[a];if(e=e||{},!j)throw new f.errors.NER(c(a)+a);if(!g.isObject(b))throw new i(c(a)+"attrs: Must be an object!");if(!g.isObject(d))throw new i(c(a)+"params: Must be an object!");if(!g.isObject(e))throw new i(c(a)+"options: Must be an object!");return e=g._(j,e),h.resolve(b),h.promise.then(function(b){return e.beforeValidate.call(b,a,b)}).then(function(b){return e.validate.call(b,a,b)}).then(function(b){return e.afterValidate.call(b,a,b)}).then(function(b){return e.beforeUpdate.call(b,a,b)}).then(function(b){return e.notify&&f.emit(j,"beforeUpdate",g.merge({},b)),f.adapters[e.adapter||j.defaultAdapter].updateAll(j,e.serialize?e.serialize(a,b):j.serialize(a,b),d,e)}).then(function(b){var c=e.deserialize?e.deserialize(a,b):j.deserialize(a,b);return e.afterUpdate.call(c,a,c)}).then(function(a){return e.notify&&f.emit(j,"afterUpdate",g.merge({},a)),e.cacheResponse?f.inject(j.name,a,e):a})}catch(k){return h.reject(k),h.promise}}b.exports=d},{}],67:[function(a,b){function c(a,b,c){c(null,b)}function d(){}function e(){var b=this.defaults=new d;this.$get=["$rootScope","$log","$q","DSHttpAdapter","DSLocalStorageAdapter","DSUtils","DSErrors",function(c,d,e,f,g,h,i){var j,k=a("./sync_methods"),l=a("./async_methods");try{j=angular.injector(["angular-data.DSCacheFactory"]).get("DSCacheFactory")}catch(m){d.debug("DSCacheFactory is unavailable. Resorting to the lesser capabilities of $cacheFactory."),j=angular.injector(["ng"]).get("$cacheFactory")}var n={emit:function(a,b){var d=Array.prototype.slice.call(arguments,2);d.unshift(a.name),d.unshift("DS."+b),a.emit.apply(a,d),"broadcast"===a.events?c.$broadcast.apply(c,d):"emit"===a.events&&c.$emit.apply(c,d)},$rootScope:c,$log:d,$q:e,cacheFactory:j,defaults:b,store:{},definitions:{},adapters:{DSHttpAdapter:f,DSLocalStorageAdapter:g},errors:i,utils:h};return h.deepFreeze(k),h.deepFreeze(l),h.deepMixIn(n,k),h.deepMixIn(n,l),h.deepFreeze(n.errors),h.deepFreeze(n.utils),f.DS=n,g.DS=n,("function"!=typeof Object.observe||"function"!=typeof Array.observe)&&c.$watch(function(){return(new Date).getTime()/100|0},function(){n.digest()}),n}]}d.prototype.idAttribute="id",d.prototype.defaultAdapter="DSHttpAdapter",d.prototype.defaultFilter=function(a,b,c,d){var e=this,f=a,g=null,h={skip:"",offset:"",where:"",limit:"",orderBy:"",sort:""};g=e.utils.isObject(c.where)?c.where:{},d.allowSimpleWhere&&e.utils.forEach(c,function(a,b){b in h||b in g||(g[b]={"==":a})}),e.utils.isEmpty(g)&&(g=null),g&&(f=e.utils.filter(f,function(a){var b=!0,c=!0;return e.utils.forEach(g,function(d,f){e.utils.isString(d)?d={"===":d}:(e.utils.isNumber(d)||e.utils.isBoolean(d))&&(d={"==":d}),e.utils.isObject(d)&&e.utils.forEach(d,function(d,g){"=="===g?c=b?a[f]==d:c&&a[f]==d:"==="===g?c=b?a[f]===d:c&&a[f]===d:"!="===g?c=b?a[f]!=d:c&&a[f]!=d:"!=="===g?c=b?a[f]!==d:c&&a[f]!==d:">"===g?c=b?a[f]>d:c&&a[f]>d:">="===g?c=b?a[f]>=d:c&&a[f]>=d:"<"===g?c=b?a[f]"===g?c=b?a[f]>d:c||a[f]>d:"|>="===g?c=b?a[f]>=d:c||a[f]>=d:"|<"===g?c=b?a[f]f?-1:f>d?1:0:f>d?-1:d>f?1:0})});var j=angular.isNumber(c.limit)?c.limit:null,k=null;return angular.isNumber(c.skip)?k=c.skip:angular.isNumber(c.offset)&&(k=c.offset),j&&k?f=e.utils.slice(f,k,Math.min(f.length,k+j)):e.utils.isNumber(j)?f=e.utils.slice(f,0,Math.min(f.length,j)):e.utils.isNumber(k)&&(f=k=b?a+1:b},deepFreeze:function i(a){if("function"==typeof Object.freeze){var b,c;Object.freeze(a);for(c in a)b=a[c],a.hasOwnProperty(c)&&"object"==typeof b&&!Object.isFrozen(b)&&i(b)}},diffObjectFromOldObject:function(a,b,c){var e={},f={},g={};c=c||[];for(var h in b){var i=a[h];d(h,c)||(void 0===i||i!==b[h])&&(h in a?i!==b[h]&&(g[h]=i):f[h]=void 0)}for(var j in a)j in b||d(j,c)||(e[j]=a[j]);return{added:e,removed:f,changed:g}},Events:c}}]},{"./errors":91,"mout/array/contains":2,"mout/array/filter":3,"mout/array/find":4,"mout/array/remove":9,"mout/array/slice":10,"mout/array/sort":11,"mout/array/toLookup":12,"mout/lang/isBoolean":19,"mout/lang/isEmpty":20,"mout/lang/isRegExp":25,"mout/object/deepMixIn":31,"mout/object/keys":35,"mout/object/merge":36,"mout/object/mixIn":37,"mout/object/pick":39,"mout/object/set":40,"mout/random/guid":42,"mout/string/makePath":49,"mout/string/pascalCase":50,"mout/string/upperCase":53}]},{},[92]); \ No newline at end of file diff --git a/src/datastore/sync_methods/getAll.js b/src/datastore/sync_methods/getAll.js new file mode 100644 index 0000000..0cd4830 --- /dev/null +++ b/src/datastore/sync_methods/getAll.js @@ -0,0 +1,58 @@ +function errorPrefix(resourceName) { + return 'DS.getAll(' + resourceName + '[, ids]): '; +} + +/** + * @doc method + * @id DS.sync methods:getAll + * @name getAll + * @description + * Synchronously return all of the resource. + * + * ## Signature: + * ```js + * DS.getAll(resourceName[, ids]) + * ``` + * + * ## Example: + * + * ```js + * DS.getAll('document'); // [{ author: 'John Anderson', id: 5 }] + * ``` + * + * ## Throws + * + * - `{IllegalArgumentError}` + * - `{NonexistentResourceError}` + * + * @param {string} resourceName The resource type, e.g. 'user', 'comment', etc. + * @param {array} ids Optional list of primary keys to filter the array of results by. + * + * @returns {array} The items of the type specified by `resourceName`. + */ +function getAll(resourceName, ids) { + var DS = this; + var IA = DS.errors.IA; + var resource; + var collection = []; + + if (!DS.definitions[resourceName]) { + throw new DS.errors.NER(errorPrefix(resourceName) + resourceName); + } else if (arguments.length === 2 && !DS.utils.isArray(ids)) { + throw new IA(errorPrefix(resourceName, ids) + 'ids: Must be an array!'); + } + + resource = DS.store[resourceName]; + + if (DS.utils.isArray(ids)) { + for (var i = 0; i < ids.length; i++) { + collection.push(resource.index.get(ids[i])); + } + } else { + collection = resource.collection.slice(); + } + + return collection; +} + +module.exports = getAll; \ No newline at end of file diff --git a/src/datastore/sync_methods/index.js b/src/datastore/sync_methods/index.js index 3ed2e49..cb0df4c 100644 --- a/src/datastore/sync_methods/index.js +++ b/src/datastore/sync_methods/index.js @@ -120,6 +120,16 @@ module.exports = { */ get: require('./get'), + /** + * @doc method + * @id DS.sync methods:getAll + * @name getAll + * @methodOf DS + * @description + * See [DS.getAll](/documentation/api/api/DS.sync methods:getAll). + */ + getAll: require('./getAll'), + /** * @doc method * @id DS.sync methods:hasChanges diff --git a/test/integration/datastore/sync_methods/getAll.test.js b/test/integration/datastore/sync_methods/getAll.test.js new file mode 100644 index 0000000..da1bce0 --- /dev/null +++ b/test/integration/datastore/sync_methods/getAll.test.js @@ -0,0 +1,27 @@ +describe('DS.getAll(resourceName)', function () { + function errorPrefix(resourceName) { + return 'DS.getAll(' + resourceName + '[, ids]): '; + } + + beforeEach(startInjector); + + it('should throw an error when method pre-conditions are not met', function () { + assert.throws(function () { + DS.getAll('does not exist'); + }, DS.errors.NonexistentResourceError, errorPrefix('does not exist', {}) + 'does not exist is not a registered resource!'); + + angular.forEach(TYPES_EXCEPT_ARRAY, function (key) { + assert.throws(function () { + DS.getAll('post', key); + }, DS.errors.IllegalArgumentError, errorPrefix('post', key) + 'ids: Must be an array!'); + }); + }); + it('should return an array of all items in the store', function() { + assert.isArray(DS.getAll('post'), 'should be an empty array'); + }); + it('should return results that match a set of ids', function() { + DS.inject('post', [ p1, p2, p3 ]); + var posts = DS.getAll('post', [ 5, 7 ]); + assert.deepEqual(angular.toJson(posts), angular.toJson([ p1, p3 ])); + }); +}); \ No newline at end of file