Skip to content

Commit

Permalink
Allow the store to pass adapter options to the adapter
Browse files Browse the repository at this point in the history
  • Loading branch information
bmac committed Jun 12, 2015
1 parent b63bb87 commit 43a48a3
Show file tree
Hide file tree
Showing 6 changed files with 166 additions and 42 deletions.
9 changes: 6 additions & 3 deletions packages/ember-data/lib/system/adapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ var Adapter = Ember.Object.extend({
@param {DS.Model} type
@param {String} id
@param {DS.Snapshot} snapshot
@param {Object} adapterOptions
@return {Promise} promise
*/
find: null,
Expand Down Expand Up @@ -151,6 +152,7 @@ var Adapter = Ember.Object.extend({
@param {DS.Store} store
@param {DS.Model} type
@param {String} sinceToken
@param {Object} adapterOptions
@return {Promise} promise
*/
findAll: null,
Expand Down Expand Up @@ -184,6 +186,7 @@ var Adapter = Ember.Object.extend({
@param {DS.Model} type
@param {Object} query
@param {DS.AdapterPopulatedRecordArray} recordArray
@param {Object} adapterOptions
@return {Promise} promise
*/
findQuery: null,
Expand Down Expand Up @@ -282,7 +285,7 @@ var Adapter = Ember.Object.extend({
@param {DS.Store} store
@param {DS.Model} type the DS.Model class of the record
@param {DS.Snapshot} snapshot
@param {Object} options
@param {Object} adapterOptions
@return {Promise} promise
*/
createRecord: null,
Expand Down Expand Up @@ -325,7 +328,7 @@ var Adapter = Ember.Object.extend({
@param {DS.Store} store
@param {DS.Model} type the DS.Model class of the record
@param {DS.Snapshot} snapshot
@param {Object} options
@param {Object} adapterOptions
@return {Promise} promise
*/
updateRecord: null,
Expand Down Expand Up @@ -368,7 +371,7 @@ var Adapter = Ember.Object.extend({
@param {DS.Store} store
@param {DS.Model} type the DS.Model class of the record
@param {DS.Snapshot} snapshot
@param {Object} options
@param {Object} adapterOptions
@return {Promise} promise
*/
deleteRecord: null,
Expand Down
4 changes: 2 additions & 2 deletions packages/ember-data/lib/system/model/internal-model.js
Original file line number Diff line number Diff line change
Expand Up @@ -127,11 +127,11 @@ InternalModel.prototype = {
this.send('deleteRecord');
},

save: function() {
save: function(options) {
var promiseLabel = "DS: Model#save " + this;
var resolver = Ember.RSVP.defer(promiseLabel);

this.store.scheduleSave(this, resolver);
this.store.scheduleSave(this, resolver, options);
return resolver.promise;
},

Expand Down
11 changes: 6 additions & 5 deletions packages/ember-data/lib/system/model/model.js
Original file line number Diff line number Diff line change
Expand Up @@ -494,8 +494,8 @@ var Model = Ember.Object.extend(Ember.Evented, {
@method deleteRecord
*/
deleteRecord: function() {
this._internalModel.deleteRecord();
deleteRecord: function(options) {
this._internalModel.deleteRecord(options);
},

/**
Expand All @@ -519,12 +519,13 @@ var Model = Ember.Object.extend(Ember.Evented, {
```
@method destroyRecord
@param {Object} options
@return {Promise} a promise that will be resolved when the adapter returns
successfully or rejected if the adapter returns with an error.
*/
destroyRecord: function() {
destroyRecord: function(options) {
this.deleteRecord();
return this.save();
return this.save(options);
},

/**
Expand Down Expand Up @@ -675,7 +676,7 @@ var Model = Ember.Object.extend(Ember.Evented, {
});
```
@method save
@param {Object} options a hash specifying save options sent to the server.
@param {Object} options
@return {Promise} a promise that will be resolved when the adapter returns
successfully or rejected if the adapter returns with an error.
*/
Expand Down
57 changes: 31 additions & 26 deletions packages/ember-data/lib/system/store.js
Original file line number Diff line number Diff line change
Expand Up @@ -605,7 +605,7 @@ Store = Service.extend({
}

if (internalModel.isEmpty()) {
fetchedInternalModel = this.scheduleFetch(internalModel);
fetchedInternalModel = this.scheduleFetch(internalModel, options);
//TODO double check about reloading
} else if (internalModel.isLoading()) {
fetchedInternalModel = internalModel._loadingPromise;
Expand Down Expand Up @@ -641,16 +641,17 @@ Store = Service.extend({
@private
@param {InternalModel} internalModel model
@return {Promise} promise
*/
fetchRecord: function(internalModel) {
*/
// TODO rename this to have an underscore
fetchRecord: function(internalModel, options) {
var typeClass = internalModel.type;
var id = internalModel.id;
var adapter = this.adapterFor(typeClass.modelName);

Ember.assert("You tried to find a record but you have no adapter (for " + typeClass + ")", adapter);
Ember.assert("You tried to find a record but your adapter (for " + typeClass + ") does not implement 'find'", typeof adapter.find === 'function');

var promise = _find(adapter, this, typeClass, id, internalModel);
var promise = _find(adapter, this, typeClass, id, internalModel, options);
return promise;
},

Expand All @@ -659,24 +660,25 @@ Store = Service.extend({
return Promise.all(map(internalModels, this.scheduleFetch, this));
},

scheduleFetch: function(internalModel) {
scheduleFetch: function(internalModel, options) {
var typeClass = internalModel.type;

if (internalModel._loadingPromise) { return internalModel._loadingPromise; }

var resolver = Ember.RSVP.defer('Fetching ' + typeClass + 'with id: ' + internalModel.id);
var recordResolverPair = {
var pendingFetchItem = {
record: internalModel,
resolver: resolver
resolver: resolver,
options: options
};
var promise = resolver.promise;

internalModel.loadingData(promise);

if (!this._pendingFetch.get(typeClass)) {
this._pendingFetch.set(typeClass, [recordResolverPair]);
this._pendingFetch.set(typeClass, [pendingFetchItem]);
} else {
this._pendingFetch.get(typeClass).push(recordResolverPair);
this._pendingFetch.get(typeClass).push(pendingFetchItem);
}
Ember.run.scheduleOnce('afterRender', this, this.flushAllPendingFetches);

Expand All @@ -692,19 +694,19 @@ Store = Service.extend({
this._pendingFetch = Map.create();
},

_flushPendingFetchForType: function (recordResolverPairs, typeClass) {
_flushPendingFetchForType: function (pendingFetchItems, typeClass) {
var store = this;
var adapter = store.adapterFor(typeClass.modelName);
var shouldCoalesce = !!adapter.findMany && adapter.coalesceFindRequests;
var records = Ember.A(recordResolverPairs).mapBy('record');
var records = Ember.A(pendingFetchItems).mapBy('record');

function _fetchRecord(recordResolverPair) {
recordResolverPair.resolver.resolve(store.fetchRecord(recordResolverPair.record));
recordResolverPair.resolver.resolve(store.fetchRecord(recordResolverPair.record, recordResolverPair.options)); // TODO adapter options
}

function resolveFoundRecords(records) {
forEach(records, function(record) {
var pair = Ember.A(recordResolverPairs).findBy('record', record);
var pair = Ember.A(pendingFetchItems).findBy('record', record);
if (pair) {
var resolver = pair.resolver;
resolver.resolve(record);
Expand Down Expand Up @@ -734,16 +736,16 @@ Store = Service.extend({

function rejectRecords(records, error) {
forEach(records, function(record) {
var pair = Ember.A(recordResolverPairs).findBy('record', record);
var pair = Ember.A(pendingFetchItems).findBy('record', record);
if (pair) {
var resolver = pair.resolver;
resolver.reject(error);
}
});
}

if (recordResolverPairs.length === 1) {
_fetchRecord(recordResolverPairs[0]);
if (pendingFetchItems.length === 1) {
_fetchRecord(pendingFetchItems[0]);
} else if (shouldCoalesce) {

// TODO: Improve records => snapshots => records => snapshots
Expand All @@ -769,14 +771,14 @@ Store = Service.extend({
then(makeMissingRecordsRejector(requestedRecords)).
then(null, makeRecordsRejector(requestedRecords));
} else if (ids.length === 1) {
var pair = Ember.A(recordResolverPairs).findBy('record', groupOfRecords[0]);
var pair = Ember.A(pendingFetchItems).findBy('record', groupOfRecords[0]);
_fetchRecord(pair);
} else {
Ember.assert("You cannot return an empty array from adapter's method groupRecordsForFindMany", false);
}
});
} else {
forEach(recordResolverPairs, _fetchRecord);
forEach(pendingFetchItems, _fetchRecord);
}
},

Expand Down Expand Up @@ -998,9 +1000,10 @@ Store = Service.extend({
@method query
@param {String} modelName
@param {any} query an opaque query to be used by the adapter
@param {Object} options
@return {Promise} promise
*/
query: function(modelName, query) {
query: function(modelName, query, options) {
Ember.assert('Passing classes to store methods has been removed. Please pass a dasherized string instead of '+ Ember.inspect(modelName), typeof modelName === 'string');
var typeClass = this.modelFor(modelName);
var array = this.recordArrayManager
Expand All @@ -1011,7 +1014,7 @@ Store = Service.extend({
Ember.assert("You tried to load a query but you have no adapter (for " + typeClass + ")", adapter);
Ember.assert("You tried to load a query but your adapter does not implement `findQuery`", typeof adapter.findQuery === 'function');

return promiseArray(_query(adapter, this, typeClass, query, array));
return promiseArray(_query(adapter, this, typeClass, query, array, options));
},

/**
Expand Down Expand Up @@ -1043,13 +1046,14 @@ Store = Service.extend({
@method findAll
@param {String} modelName
@param {Object} options
@return {DS.AdapterPopulatedRecordArray}
*/
findAll: function(modelName) {
findAll: function(modelName, options) {
Ember.assert('Passing classes to store methods has been removed. Please pass a dasherized string instead of '+ Ember.inspect(modelName), typeof modelName === 'string');
var typeClass = this.modelFor(modelName);

return this._fetchAll(typeClass, this.peekAll(modelName));
return this._fetchAll(typeClass, this.peekAll(modelName), options);
},

/**
Expand All @@ -1059,7 +1063,7 @@ Store = Service.extend({
@param {DS.RecordArray} array
@return {Promise} promise
*/
_fetchAll: function(typeClass, array) {
_fetchAll: function(typeClass, array, options) {
var adapter = this.adapterFor(typeClass.modelName);
var sinceToken = this.typeMapFor(typeClass).metadata.since;

Expand All @@ -1068,7 +1072,7 @@ Store = Service.extend({
Ember.assert("You tried to load all records but you have no adapter (for " + typeClass + ")", adapter);
Ember.assert("You tried to load all records but your adapter does not implement `findAll`", typeof adapter.findAll === 'function');

return promiseArray(_findAll(adapter, this, typeClass, sinceToken));
return promiseArray(_findAll(adapter, this, typeClass, sinceToken, options));
},

/**
Expand Down Expand Up @@ -1357,7 +1361,7 @@ Store = Service.extend({
internalModel.adapterWillCommit();
this._pendingSave.push({
snapshot: snapshot,
response: resolver,
resolver: resolver,
options: options
});
once(this, 'flushPendingSave');
Expand Down Expand Up @@ -2171,7 +2175,8 @@ function _commit(adapter, store, operation, snapshot, options) {
var record = snapshot._internalModel;
var modelName = snapshot.modelName;
var type = store.modelFor(modelName);
var promise = adapter[operation](store, type, snapshot, options); // TODO check this out
var adapterOptions = options && options.adapterOptions;
var promise = adapter[operation](store, type, snapshot, adapterOptions);
var serializer = serializerForAdapter(store, adapter, modelName);
var label = "DS: Extract and notify about " + operation + " completion of " + record;

Expand Down
15 changes: 9 additions & 6 deletions packages/ember-data/lib/system/store/finders.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@ import {
var Promise = Ember.RSVP.Promise;
var map = Ember.EnumerableUtils.map;

export function _find(adapter, store, typeClass, id, internalModel) {
export function _find(adapter, store, typeClass, id, internalModel, options) {
var adapterOptions = options && options.adapterOptions;
var snapshot = internalModel.createSnapshot();
var promise = adapter.find(store, typeClass, id, snapshot);
var promise = adapter.find(store, typeClass, id, snapshot, adapterOptions);
var serializer = serializerForAdapter(store, adapter, internalModel.type.modelName);
var label = "DS: Handle Adapter#find of " + typeClass + " with id: " + id;

Expand Down Expand Up @@ -118,8 +119,9 @@ export function _findBelongsTo(adapter, store, internalModel, link, relationship
}, null, "DS: Extract payload of " + internalModel + " : " + relationship.type);
}

export function _findAll(adapter, store, typeClass, sinceToken) {
var promise = adapter.findAll(store, typeClass, sinceToken);
export function _findAll(adapter, store, typeClass, sinceToken, options) {
var adapterOptions = options && options.adapterOptions;
var promise = adapter.findAll(store, typeClass, sinceToken, adapterOptions);
var modelName = typeClass.modelName;
var serializer = serializerForAdapter(store, adapter, modelName);
var label = "DS: Handle Adapter#findAll of " + typeClass;
Expand All @@ -139,9 +141,10 @@ export function _findAll(adapter, store, typeClass, sinceToken) {
}, null, "DS: Extract payload of findAll " + typeClass);
}

export function _query(adapter, store, typeClass, query, recordArray) {
export function _query(adapter, store, typeClass, query, recordArray, options) {
var modelName = typeClass.modelName;
var promise = adapter.findQuery(store, typeClass, query, recordArray);
var adapterOptions = options && options.adapterOptions;
var promise = adapter.findQuery(store, typeClass, query, recordArray, adapterOptions);
var serializer = serializerForAdapter(store, adapter, modelName);
var label = "DS: Handle Adapter#findQuery of " + typeClass;

Expand Down
Loading

0 comments on commit 43a48a3

Please sign in to comment.