Skip to content

Commit 730807d

Browse files
committedAug 28, 2014
Closes #141. #138.
1 parent ba78164 commit 730807d

15 files changed

+295
-192
lines changed
 

‎CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
- #118, #122 - Multiple relationships to the same model
2525
- #120 - When using DSCacheFactory, allow onExpire to be specified
2626
- #132 - Inject relations for parent resource on create
27+
- #141 - Allow lifecycle hooks to be overridden per method as well
2728

2829
###### Backwards compatible bug fixes
2930
- #126 - injectRelations isn't running when injecting an array

‎dist/angular-data.js

+146-95
Large diffs are not rendered by default.

‎dist/angular-data.min.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎src/datastore/async_methods/create.js

+24-15
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ function errorPrefix(resourceName) {
3434
*
3535
* - `{boolean=}` - `cacheResponse` - Inject the data returned by the adapter into the data store. Default: `true`.
3636
* - `{boolean=}` - `upsert` - If `attrs` already contains a primary key, then attempt to call `DS.update` instead. Default: `true`.
37+
* - `{function=}` - `beforeValidate` - Override the resource or global lifecycle hook.
38+
* - `{function=}` - `validate` - Override the resource or global lifecycle hook.
39+
* - `{function=}` - `afterValidate` - Override the resource or global lifecycle hook.
40+
* - `{function=}` - `beforeCreate` - Override the resource or global lifecycle hook.
41+
* - `{function=}` - `afterCreate` - Override the resource or global lifecycle hook.
3742
*
3843
* @returns {Promise} Promise produced by the `$q` service.
3944
*
@@ -49,19 +54,17 @@ function errorPrefix(resourceName) {
4954
function create(resourceName, attrs, options) {
5055
var DS = this;
5156
var deferred = DS.$q.defer();
52-
var promise = deferred.promise;
53-
var definition = DS.definitions[resourceName];
5457

5558
try {
59+
var definition = DS.definitions[resourceName];
60+
5661
options = options || {};
5762

5863
if (!definition) {
5964
throw new DS.errors.NER(errorPrefix(resourceName) + resourceName);
6065
} else if (!DS.utils.isObject(attrs)) {
6166
throw new DS.errors.IA(errorPrefix(resourceName) + 'attrs: Must be an object!');
6267
}
63-
var resource = DS.store[resourceName];
64-
6568
if (!('cacheResponse' in options)) {
6669
options.cacheResponse = true;
6770
}
@@ -70,30 +73,39 @@ function create(resourceName, attrs, options) {
7073
options.upsert = true;
7174
}
7275

76+
deferred.resolve(attrs);
77+
7378
if (options.upsert && attrs[definition.idAttribute]) {
74-
promise = DS.update(resourceName, attrs[definition.idAttribute], attrs, options);
79+
return DS.update(resourceName, attrs[definition.idAttribute], attrs, options);
7580
} else {
76-
promise = promise
81+
return deferred.promise
7782
.then(function (attrs) {
78-
return DS.$q.promisify(definition.beforeValidate)(resourceName, attrs);
83+
var func = options.beforeValidate ? DS.$q.promisify(options.beforeValidate) : definition.beforeValidate;
84+
return func.call(attrs, resourceName, attrs);
7985
})
8086
.then(function (attrs) {
81-
return DS.$q.promisify(definition.validate)(resourceName, attrs);
87+
var func = options.validate ? DS.$q.promisify(options.validate) : definition.validate;
88+
return func.call(attrs, resourceName, attrs);
8289
})
8390
.then(function (attrs) {
84-
return DS.$q.promisify(definition.afterValidate)(resourceName, attrs);
91+
var func = options.afterValidate ? DS.$q.promisify(options.afterValidate) : definition.afterValidate;
92+
return func.call(attrs, resourceName, attrs);
8593
})
8694
.then(function (attrs) {
87-
return DS.$q.promisify(definition.beforeCreate)(resourceName, attrs);
95+
var func = options.beforeCreate ? DS.$q.promisify(options.beforeCreate) : definition.beforeCreate;
96+
return func.call(attrs, resourceName, attrs);
8897
})
8998
.then(function (attrs) {
9099
return DS.adapters[options.adapter || definition.defaultAdapter].create(definition, definition.serialize(resourceName, attrs), options);
91100
})
92101
.then(function (res) {
93-
return DS.$q.promisify(definition.afterCreate)(resourceName, definition.deserialize(resourceName, res));
102+
var func = options.afterCreate ? DS.$q.promisify(options.afterCreate) : definition.afterCreate;
103+
var attrs = definition.deserialize(resourceName, res);
104+
return func.call(attrs, resourceName, attrs);
94105
})
95106
.then(function (data) {
96107
if (options.cacheResponse) {
108+
var resource = DS.store[resourceName];
97109
var created = DS.inject(definition.name, data, options);
98110
var id = created[definition.idAttribute];
99111
resource.completedQueries[id] = new Date().getTime();
@@ -105,13 +117,10 @@ function create(resourceName, attrs, options) {
105117
}
106118
});
107119
}
108-
109-
deferred.resolve(attrs);
110120
} catch (err) {
111121
deferred.reject(err);
122+
return deferred.promise;
112123
}
113-
114-
return promise;
115124
}
116125

117126
module.exports = create;

‎src/datastore/async_methods/destroy.js

+15-9
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@ function errorPrefix(resourceName, id) {
2828
*
2929
* @param {string} resourceName The resource type, e.g. 'user', 'comment', etc.
3030
* @param {string|number} id The primary key of the item to remove.
31-
* @param {object=} options Configuration options. Also passed along to the adapter's `destroy` method.
31+
* @param {object=} options Configuration options. Also passed along to the adapter's `destroy` method. Properties:
32+
*
33+
* - `{function=}` - `beforeDestroy` - Override the resource or global lifecycle hook.
34+
* - `{function=}` - `afterDestroy` - Override the resource or global lifecycle hook.
35+
*
3236
* @returns {Promise} Promise produced by the `$q` service.
3337
*
3438
* ## Resolves with:
@@ -44,10 +48,10 @@ function errorPrefix(resourceName, id) {
4448
function destroy(resourceName, id, options) {
4549
var DS = this;
4650
var deferred = DS.$q.defer();
47-
var promise = deferred.promise;
48-
var definition = DS.definitions[resourceName];
4951

5052
try {
53+
var definition = DS.definitions[resourceName];
54+
5155
options = options || {};
5256

5357
if (!definition) {
@@ -61,26 +65,28 @@ function destroy(resourceName, id, options) {
6165
throw new DS.errors.R(errorPrefix(resourceName, id) + 'id: "' + id + '" not found!');
6266
}
6367

64-
promise = promise
68+
deferred.resolve(item);
69+
70+
return deferred.promise
6571
.then(function (attrs) {
66-
return DS.$q.promisify(definition.beforeDestroy)(resourceName, attrs);
72+
var func = options.beforeDestroy ? DS.$q.promisify(options.beforeDestroy) : definition.beforeDestroy;
73+
return func.call(attrs, resourceName, attrs);
6774
})
6875
.then(function () {
6976
return DS.adapters[options.adapter || definition.defaultAdapter].destroy(definition, id, options);
7077
})
7178
.then(function () {
72-
return DS.$q.promisify(definition.afterDestroy)(resourceName, item);
79+
var func = options.afterDestroy ? DS.$q.promisify(options.afterDestroy) : definition.afterDestroy;
80+
return func.call(item, resourceName, item);
7381
})
7482
.then(function () {
7583
DS.eject(resourceName, id);
7684
return id;
7785
});
78-
deferred.resolve(item);
7986
} catch (err) {
8087
deferred.reject(err);
88+
return deferred.promise;
8189
}
82-
83-
return promise;
8490
}
8591

8692
module.exports = destroy;

‎src/datastore/async_methods/destroyAll.js

+5-6
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,10 @@ function errorPrefix(resourceName) {
5555
function destroyAll(resourceName, params, options) {
5656
var DS = this;
5757
var deferred = DS.$q.defer();
58-
var promise = deferred.promise;
59-
var definition = DS.definitions[resourceName];
6058

6159
try {
6260
var IA = DS.errors.IA;
61+
var definition = DS.definitions[resourceName];
6362

6463
options = options || {};
6564

@@ -71,19 +70,19 @@ function destroyAll(resourceName, params, options) {
7170
throw new IA(errorPrefix(resourceName) + 'options: Must be an object!');
7271
}
7372

74-
promise = promise
73+
deferred.resolve();
74+
75+
return deferred.promise
7576
.then(function () {
7677
return DS.adapters[options.adapter || definition.defaultAdapter].destroyAll(definition, params, options);
7778
})
7879
.then(function () {
7980
return DS.ejectAll(resourceName, params);
8081
});
81-
deferred.resolve();
8282
} catch (err) {
8383
deferred.reject(err);
84+
return deferred.promise;
8485
}
85-
86-
return promise;
8786
}
8887

8988
module.exports = destroyAll;

‎src/datastore/async_methods/find.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,11 @@ function find(resourceName, id, options) {
5252

5353
try {
5454
var IA = DS.errors.IA;
55+
var definition = DS.definitions[resourceName];
5556

5657
options = options || {};
5758

58-
if (!DS.definitions[resourceName]) {
59+
if (!definition) {
5960
throw new DS.errors.NER(errorPrefix(resourceName, id) + resourceName);
6061
} else if (!DS.utils.isString(id) && !DS.utils.isNumber(id)) {
6162
throw new IA(errorPrefix(resourceName, id) + 'id: Must be a string or a number!');
@@ -66,8 +67,6 @@ function find(resourceName, id, options) {
6667
if (!('cacheResponse' in options)) {
6768
options.cacheResponse = true;
6869
}
69-
70-
var definition = DS.definitions[resourceName];
7170
var resource = DS.store[resourceName];
7271

7372
if (options.bypassCache || !options.cacheResponse) {

‎src/datastore/async_methods/findAll.js

+6-7
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ function _findAll(resourceName, params, options) {
5656
var data = definition.deserialize(resourceName, res);
5757
if (options.cacheResponse) {
5858
try {
59-
return processResults.apply(DS, [data, resourceName, queryHash, options]);
59+
return processResults.call(DS, data, resourceName, queryHash, options);
6060
} catch (err) {
6161
return DS.$q.reject(err);
6262
}
@@ -138,7 +138,6 @@ function _findAll(resourceName, params, options) {
138138
function findAll(resourceName, params, options) {
139139
var DS = this;
140140
var deferred = DS.$q.defer();
141-
var promise = deferred.promise;
142141

143142
try {
144143
var IA = DS.errors.IA;
@@ -158,15 +157,15 @@ function findAll(resourceName, params, options) {
158157
options.cacheResponse = true;
159158
}
160159

161-
promise = promise.then(function () {
162-
return _findAll.apply(DS, [resourceName, params, options]);
163-
});
164160
deferred.resolve();
161+
162+
return deferred.promise.then(function () {
163+
return _findAll.call(DS, resourceName, params, options);
164+
});
165165
} catch (err) {
166166
deferred.reject(err);
167+
return deferred.promise;
167168
}
168-
169-
return promise;
170169
}
171170

172171
module.exports = findAll;

‎src/datastore/async_methods/loadRelations.js

+5-7
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,10 @@ function errorPrefix(resourceName) {
5858
function loadRelations(resourceName, instance, relations, options) {
5959
var DS = this;
6060
var deferred = DS.$q.defer();
61-
var promise = deferred.promise;
62-
var definition = DS.definitions[resourceName];
6361

6462
try {
6563
var IA = DS.errors.IA;
64+
var definition = DS.definitions[resourceName];
6665

6766
options = options || {};
6867

@@ -121,7 +120,9 @@ function loadRelations(resourceName, instance, relations, options) {
121120
}
122121
});
123122

124-
promise = promise
123+
deferred.resolve();
124+
125+
return deferred.promise
125126
.then(function () {
126127
return DS.$q.all(tasks);
127128
})
@@ -131,13 +132,10 @@ function loadRelations(resourceName, instance, relations, options) {
131132
});
132133
return instance;
133134
});
134-
135-
deferred.resolve();
136135
} catch (err) {
137136
deferred.reject(err);
137+
return deferred.promise;
138138
}
139-
140-
return promise;
141139
}
142140

143141
module.exports = loadRelations;

‎src/datastore/async_methods/save.js

+24-14
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ function errorPrefix(resourceName, id) {
3333
*
3434
* - `{boolean=}` - `cacheResponse` - Inject the data returned by the adapter into the data store. Default: `true`.
3535
* - `{boolean=}` - `changesOnly` - Only send changed and added values to the adapter. Default: `false`.
36+
* - `{function=}` - `beforeValidate` - Override the resource or global lifecycle hook.
37+
* - `{function=}` - `validate` - Override the resource or global lifecycle hook.
38+
* - `{function=}` - `afterValidate` - Override the resource or global lifecycle hook.
39+
* - `{function=}` - `beforeUpdate` - Override the resource or global lifecycle hook.
40+
* - `{function=}` - `afterUpdate` - Override the resource or global lifecycle hook.
3641
*
3742
* @returns {Promise} Promise produced by the `$q` service.
3843
*
@@ -49,11 +54,10 @@ function errorPrefix(resourceName, id) {
4954
function save(resourceName, id, options) {
5055
var DS = this;
5156
var deferred = DS.$q.defer();
52-
var promise = deferred.promise;
53-
var definition = DS.definitions[resourceName];
5457

5558
try {
5659
var IA = DS.errors.IA;
60+
var definition = DS.definitions[resourceName];
5761

5862
options = options || {};
5963

@@ -70,27 +74,32 @@ function save(resourceName, id, options) {
7074
throw new DS.errors.R(errorPrefix(resourceName, id) + 'id: "' + id + '" not found!');
7175
}
7276

73-
var resource = DS.store[resourceName];
74-
7577
if (!('cacheResponse' in options)) {
7678
options.cacheResponse = true;
7779
}
7880

79-
promise = promise
81+
deferred.resolve(item);
82+
83+
return deferred.promise
8084
.then(function (attrs) {
81-
return DS.$q.promisify(definition.beforeValidate)(resourceName, attrs);
85+
var func = options.beforeValidate ? DS.$q.promisify(options.beforeValidate) : definition.beforeValidate;
86+
return func.call(attrs, resourceName, attrs);
8287
})
8388
.then(function (attrs) {
84-
return DS.$q.promisify(definition.validate)(resourceName, attrs);
89+
var func = options.validate ? DS.$q.promisify(options.validate) : definition.validate;
90+
return func.call(attrs, resourceName, attrs);
8591
})
8692
.then(function (attrs) {
87-
return DS.$q.promisify(definition.afterValidate)(resourceName, attrs);
93+
var func = options.afterValidate ? DS.$q.promisify(options.afterValidate) : definition.afterValidate;
94+
return func.call(attrs, resourceName, attrs);
8895
})
8996
.then(function (attrs) {
90-
return DS.$q.promisify(definition.beforeUpdate)(resourceName, attrs);
97+
var func = options.beforeUpdate ? DS.$q.promisify(options.beforeUpdate) : definition.beforeUpdate;
98+
return func.call(attrs, resourceName, attrs);
9199
})
92100
.then(function (attrs) {
93101
if (options.changesOnly) {
102+
var resource = DS.store[resourceName];
94103
resource.observers[id].deliver();
95104
var toKeep = [],
96105
changes = DS.changes(resourceName, id);
@@ -112,25 +121,26 @@ function save(resourceName, id, options) {
112121
return DS.adapters[options.adapter || definition.defaultAdapter].update(definition, id, definition.serialize(resourceName, attrs), options);
113122
})
114123
.then(function (res) {
115-
return DS.$q.promisify(definition.afterUpdate)(resourceName, definition.deserialize(resourceName, res));
124+
var func = options.afterUpdate ? DS.$q.promisify(options.afterUpdate) : definition.afterUpdate;
125+
var attrs = definition.deserialize(resourceName, res);
126+
return func.call(attrs, resourceName, attrs);
116127
})
117128
.then(function (data) {
118129
if (options.cacheResponse) {
130+
var resource = DS.store[resourceName];
119131
var saved = DS.inject(definition.name, data, options);
120132
resource.previousAttributes[id] = DS.utils.deepMixIn({}, saved);
121133
resource.saved[id] = DS.utils.updateTimestamp(resource.saved[id]);
134+
resource.observers[id].discardChanges();
122135
return DS.get(resourceName, id);
123136
} else {
124137
return data;
125138
}
126139
});
127-
128-
deferred.resolve(item);
129140
} catch (err) {
130141
deferred.reject(err);
142+
return deferred.promise;
131143
}
132-
133-
return promise;
134144
}
135145

136146
module.exports = save;

‎src/datastore/async_methods/update.js

+24-15
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ function errorPrefix(resourceName, id) {
3636
* @param {object=} options Optional configuration. Also passed along to the adapter's `update` method. Properties:
3737
*
3838
* - `{boolean=}` - `cacheResponse` - Inject the data returned by the adapter into the data store. Default: `true`.
39+
* - `{function=}` - `beforeValidate` - Override the resource or global lifecycle hook.
40+
* - `{function=}` - `validate` - Override the resource or global lifecycle hook.
41+
* - `{function=}` - `afterValidate` - Override the resource or global lifecycle hook.
42+
* - `{function=}` - `beforeUpdate` - Override the resource or global lifecycle hook.
43+
* - `{function=}` - `afterUpdate` - Override the resource or global lifecycle hook.
3944
*
4045
* @returns {Promise} Promise produced by the `$q` service.
4146
*
@@ -51,14 +56,14 @@ function errorPrefix(resourceName, id) {
5156
function update(resourceName, id, attrs, options) {
5257
var DS = this;
5358
var deferred = DS.$q.defer();
54-
var promise = deferred.promise;
5559

5660
try {
5761
var IA = DS.errors.IA;
62+
var definition = DS.definitions[resourceName];
5863

5964
options = options || {};
6065

61-
if (!DS.definitions[resourceName]) {
66+
if (!definition) {
6267
throw new DS.errors.NER(errorPrefix(resourceName, id) + resourceName);
6368
} else if (!DS.utils.isString(id) && !DS.utils.isNumber(id)) {
6469
throw new IA(errorPrefix(resourceName, id) + 'id: Must be a string or a number!');
@@ -68,50 +73,54 @@ function update(resourceName, id, attrs, options) {
6873
throw new IA(errorPrefix(resourceName, id) + 'options: Must be an object!');
6974
}
7075

71-
var definition = DS.definitions[resourceName];
72-
var resource = DS.store[resourceName];
73-
7476
if (!('cacheResponse' in options)) {
7577
options.cacheResponse = true;
7678
}
7779

78-
promise = promise
80+
deferred.resolve(attrs);
81+
82+
return deferred.promise
7983
.then(function (attrs) {
80-
return DS.$q.promisify(definition.beforeValidate)(resourceName, attrs);
84+
var func = options.beforeValidate ? DS.$q.promisify(options.beforeValidate) : definition.beforeValidate;
85+
return func.call(attrs, resourceName, attrs);
8186
})
8287
.then(function (attrs) {
83-
return DS.$q.promisify(definition.validate)(resourceName, attrs);
88+
var func = options.validate ? DS.$q.promisify(options.validate) : definition.validate;
89+
return func.call(attrs, resourceName, attrs);
8490
})
8591
.then(function (attrs) {
86-
return DS.$q.promisify(definition.afterValidate)(resourceName, attrs);
92+
var func = options.afterValidate ? DS.$q.promisify(options.afterValidate) : definition.afterValidate;
93+
return func.call(attrs, resourceName, attrs);
8794
})
8895
.then(function (attrs) {
89-
return DS.$q.promisify(definition.beforeUpdate)(resourceName, attrs);
96+
var func = options.beforeUpdate ? DS.$q.promisify(options.beforeUpdate) : definition.beforeUpdate;
97+
return func.call(attrs, resourceName, attrs);
9098
})
9199
.then(function (attrs) {
92100
return DS.adapters[options.adapter || definition.defaultAdapter].update(definition, id, definition.serialize(resourceName, attrs), options);
93101
})
94102
.then(function (res) {
95-
return DS.$q.promisify(definition.afterUpdate)(resourceName, definition.deserialize(resourceName, res));
103+
var func = options.afterUpdate ? DS.$q.promisify(options.afterUpdate) : definition.afterUpdate;
104+
var attrs = definition.deserialize(resourceName, res);
105+
return func.call(attrs, resourceName, attrs);
96106
})
97107
.then(function (data) {
98108
if (options.cacheResponse) {
109+
var resource = DS.store[resourceName];
99110
var updated = DS.inject(definition.name, data, options);
100111
var id = updated[definition.idAttribute];
101112
resource.previousAttributes[id] = DS.utils.deepMixIn({}, updated);
102113
resource.saved[id] = DS.utils.updateTimestamp(resource.saved[id]);
114+
resource.observers[id].discardChanges();
103115
return DS.get(definition.name, id);
104116
} else {
105117
return data;
106118
}
107119
});
108-
109-
deferred.resolve(attrs);
110120
} catch (err) {
111121
deferred.reject(err);
122+
return deferred.promise;
112123
}
113-
114-
return promise;
115124
}
116125

117126
module.exports = update;

‎src/datastore/async_methods/updateAll.js

+17-14
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,14 @@ function errorPrefix(resourceName) {
6868
function updateAll(resourceName, attrs, params, options) {
6969
var DS = this;
7070
var deferred = DS.$q.defer();
71-
var promise = deferred.promise;
7271

7372
try {
7473
var IA = DS.errors.IA;
74+
var definition = DS.definitions[resourceName];
7575

7676
options = options || {};
7777

78-
if (!DS.definitions[resourceName]) {
78+
if (!definition) {
7979
throw new DS.errors.NER(errorPrefix(resourceName) + resourceName);
8080
} else if (!DS.utils.isObject(attrs)) {
8181
throw new IA(errorPrefix(resourceName) + 'attrs: Must be an object!');
@@ -85,30 +85,36 @@ function updateAll(resourceName, attrs, params, options) {
8585
throw new IA(errorPrefix(resourceName) + 'options: Must be an object!');
8686
}
8787

88-
var definition = DS.definitions[resourceName];
89-
9088
if (!('cacheResponse' in options)) {
9189
options.cacheResponse = true;
9290
}
9391

94-
promise = promise
92+
deferred.resolve(attrs);
93+
94+
return deferred.promise
9595
.then(function (attrs) {
96-
return DS.$q.promisify(definition.beforeValidate)(resourceName, attrs);
96+
var func = options.beforeValidate ? DS.$q.promisify(options.beforeValidate) : definition.beforeValidate;
97+
return func.call(attrs, resourceName, attrs);
9798
})
9899
.then(function (attrs) {
99-
return DS.$q.promisify(definition.validate)(resourceName, attrs);
100+
var func = options.validate ? DS.$q.promisify(options.validate) : definition.validate;
101+
return func.call(attrs, resourceName, attrs);
100102
})
101103
.then(function (attrs) {
102-
return DS.$q.promisify(definition.afterValidate)(resourceName, attrs);
104+
var func = options.afterValidate ? DS.$q.promisify(options.afterValidate) : definition.afterValidate;
105+
return func.call(attrs, resourceName, attrs);
103106
})
104107
.then(function (attrs) {
105-
return DS.$q.promisify(definition.beforeUpdate)(resourceName, attrs);
108+
var func = options.beforeUpdate ? DS.$q.promisify(options.beforeUpdate) : definition.beforeUpdate;
109+
return func.call(attrs, resourceName, attrs);
106110
})
107111
.then(function (attrs) {
108112
return DS.adapters[options.adapter || definition.defaultAdapter].updateAll(definition, definition.serialize(resourceName, attrs), params, options);
109113
})
110114
.then(function (res) {
111-
return DS.$q.promisify(definition.afterUpdate)(resourceName, definition.deserialize(resourceName, res));
115+
var func = options.afterUpdate ? DS.$q.promisify(options.afterUpdate) : definition.afterUpdate;
116+
var attrs = definition.deserialize(resourceName, res);
117+
return func.call(attrs, resourceName, attrs);
112118
})
113119
.then(function (data) {
114120
if (options.cacheResponse) {
@@ -117,13 +123,10 @@ function updateAll(resourceName, attrs, params, options) {
117123
return data;
118124
}
119125
});
120-
121-
deferred.resolve(attrs);
122126
} catch (err) {
123127
deferred.reject(err);
128+
return deferred.promise;
124129
}
125-
126-
return promise;
127130
}
128131

129132
module.exports = updateAll;

‎src/datastore/sync_methods/defineResource.js

+14
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,20 @@ function defineResource(definition) {
294294
}
295295
});
296296

297+
def.beforeValidate = DS.$q.promisify(def.beforeValidate);
298+
def.validate = DS.$q.promisify(def.validate);
299+
def.afterValidate = DS.$q.promisify(def.afterValidate);
300+
def.beforeCreate = DS.$q.promisify(def.beforeCreate);
301+
def.afterCreate = DS.$q.promisify(def.afterCreate);
302+
def.beforeUpdate = DS.$q.promisify(def.beforeUpdate);
303+
def.afterUpdate = DS.$q.promisify(def.afterUpdate);
304+
def.beforeDestroy = DS.$q.promisify(def.beforeDestroy);
305+
def.afterDestroy = DS.$q.promisify(def.afterDestroy);
306+
307+
if (typeof Object.freeze === 'function') {
308+
Object.freeze(def);
309+
}
310+
297311
return def;
298312
} catch (err) {
299313
DS.$log.error(err);

‎src/datastore/sync_methods/ejectAll.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,10 @@ function ejectAll(resourceName, params) {
100100

101101
if (!DS.$rootScope.$$phase) {
102102
DS.$rootScope.$apply(function () {
103-
ejected = _ejectAll.apply(DS, [definition, resource, params]);
103+
ejected = _ejectAll.call(DS, definition, resource, params);
104104
});
105105
} else {
106-
ejected = _ejectAll.apply(DS, [definition, resource, params]);
106+
ejected = _ejectAll.call(DS, definition, resource, params);
107107
}
108108

109109
return ejected;

‎src/index.js

+8-3
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,15 @@
5252
$provide.decorator('$q', ['$delegate', function ($delegate) {
5353
// do whatever you you want
5454
$delegate.promisify = function (fn, target) {
55-
var _this = this;
55+
if (!fn) {
56+
return;
57+
} else if (typeof fn !== 'function') {
58+
throw new Error('Can only promisify functions!');
59+
}
60+
var $q = this;
5661
return function () {
57-
var deferred = _this.defer(),
58-
args = Array.prototype.slice.apply(arguments);
62+
var deferred = $q.defer();
63+
var args = Array.prototype.slice.apply(arguments);
5964

6065
args.push(function (err, result) {
6166
if (err) {

0 commit comments

Comments
 (0)
Please sign in to comment.