Skip to content

Commit

Permalink
[WIP] Implement basic JSON-API adapter
Browse files Browse the repository at this point in the history
  • Loading branch information
wecc committed Apr 22, 2015
1 parent 455b3d3 commit 0955b53
Show file tree
Hide file tree
Showing 9 changed files with 1,308 additions and 17 deletions.
6 changes: 4 additions & 2 deletions packages/ember-data/lib/adapters.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
*/

import FixtureAdapter from "ember-data/adapters/fixture-adapter";
import JSONAPIAdapter from "ember-data/adapters/json-api-adapter";
import RESTAdapter from "ember-data/adapters/rest-adapter";

export {
RESTAdapter,
FixtureAdapter
FixtureAdapter,
JSONAPIAdapter,
RESTAdapter
};
188 changes: 188 additions & 0 deletions packages/ember-data/lib/adapters/json-api-adapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
/**
@module ember-data
*/

import {
Adapter,
InvalidError
} from "ember-data/system/adapter";

import BuildURLMixin from "ember-data/adapters/build-url-mixin";

var get = Ember.get;
var forEach = Ember.ArrayPolyfills.forEach;

/**
@class JSONAPIAdapter
@constructor
@namespace DS
@extends DS.Adapter
*/
export default Adapter.extend(BuildURLMixin, {
defaultSerializer: '-json-api',

coalesceFindRequests: false,

/**
@property host
@type {String}
*/

/**
@property namespace
@type {String}
*/

find: function(store, type, id, record) {
return this.ajax(this.buildURL(type.typeKey, id, record), 'GET');
},

findAll: function(store, type) {
return this.ajax(this.buildURL(type.typeKey), 'GET');
},

findMany: function(store, type, ids, records) {
var data = {
filter: {
id: ids.join(',')
}
};
return this.ajax(this.buildURL(type.typeKey, ids, records), 'GET', { data: data });
},

findQuery: function(store, type, query) {
return this.ajax(this.buildURL(type.typeKey), 'GET', { data: query });
},



findBelongsTo: function(store, record, link, relationship) {
var url, id, type;

if (link.resource) {
url = link.resource;
} else {
id = get(record, 'id');
type = record.constructor.typeKey;
url = this.buildURL(type, id);
}

return this.ajax(url, 'GET');
},

findHasMany: function(store, record, link, relationship) {
var url; //, id, type, host;

if (link.resource) {
url = link.resource;
} else {
// TODO
return;
}

return this.ajax(url, 'GET');
},



createRecord: function(store, type, record) {
var serializer = store.serializerFor(type.typeKey);

var snapshot = record._createSnapshot();
var data = serializer.serialize(snapshot);

return this.ajax(this.buildURL(type.typeKey, null, record), "POST", { data: data });
},

updateRecord: function(store, type, record) {
var serializer = store.serializerFor(type.typeKey);

var snapshot = record._createSnapshot();
var data = serializer.serialize(snapshot, { includeId: true });

var id = get(record, 'id');

return this.ajax(this.buildURL(type.typeKey, id, record), "PUT", { data: data });
},

deleteRecord: function(store, type, record) {
var id = get(record, 'id');

return this.ajax(this.buildURL(type.typeKey, id, record), "DELETE");
},


pathForType: function(typeKey) {
return Ember.String.dasherize(typeKey);
},


ajax: function(url, type, options) {
var adapter = this;

return new Ember.RSVP.Promise(function(resolve, reject) {
var hash = adapter.ajaxOptions(url, type, options);

hash.success = function(json, textStatus, jqXHR) {
json = adapter.ajaxSuccess(jqXHR, json);
if (json instanceof InvalidError) {
Ember.run(null, reject, json);
} else {
Ember.run(null, resolve, json);
}
};

hash.error = function(jqXHR, textStatus, errorThrown) {
Ember.run(null, reject, adapter.ajaxError(jqXHR, jqXHR.responseText, errorThrown));
};

Ember.$.ajax(hash);
}, 'DS: JSONAPIAdapter#ajax ' + type + ' to ' + url);
},

ajaxOptions: function(url, type, options) {
var hash = options || {};
hash.url = url;
hash.type = type;
hash.dataType = 'json';
hash.context = this;

if (hash.data && type !== 'GET') {
hash.contentType = 'application/json; charset=utf-8';
hash.data = JSON.stringify(hash.data);
}

var headers = get(this, 'headers');
if (headers !== undefined) {
hash.beforeSend = function (xhr) {
forEach.call(Ember.keys(headers), function(key) {
xhr.setRequestHeader(key, headers[key]);
});
};
}

return hash;
},

ajaxError: function(jqXHR, responseText, errorThrown) {
var isObject = jqXHR !== null && typeof jqXHR === 'object';

if (isObject) {
jqXHR.then = null;
if (!jqXHR.errorThrown) {
if (typeof errorThrown === 'string') {
jqXHR.errorThrown = new Error(errorThrown);
} else {
jqXHR.errorThrown = errorThrown;
}
}
}

return jqXHR;
},

ajaxSuccess: function(jqXHR, jsonPayload) {
return jsonPayload;
}

});
6 changes: 4 additions & 2 deletions packages/ember-data/lib/initializers/store.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {JSONSerializer, RESTSerializer} from "ember-data/serializers";
import {RESTAdapter} from "ember-data/adapters";
import { JSONSerializer, JSONAPISerializer, RESTSerializer } from "ember-data/serializers";
import { JSONAPIAdapter, RESTAdapter } from "ember-data/adapters";
import ContainerProxy from "ember-data/system/container-proxy";
import Store from "ember-data/system/store";

Expand Down Expand Up @@ -31,7 +31,9 @@ export default function initializeStore(registry, application) {

// new go forward paths
registry.register('serializer:-default', JSONSerializer);
registry.register('serializer:-json-api', JSONAPISerializer);
registry.register('serializer:-rest', RESTSerializer);
registry.register('adapter:-json-api', JSONAPIAdapter);
registry.register('adapter:-rest', RESTAdapter);

// Eagerly generate the store so defaultStore is populated.
Expand Down
23 changes: 15 additions & 8 deletions packages/ember-data/lib/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,16 @@ import {
import ManyArray from "ember-data/system/many-array";
import RecordArrayManager from "ember-data/system/record-array-manager";
import {
RESTAdapter,
FixtureAdapter
FixtureAdapter,
JSONAPIAdapter,
RESTAdapter
} from "ember-data/adapters";
import BuildURLMixin from "ember-data/adapters/build-url-mixin";
import JSONSerializer from "ember-data/serializers/json-serializer";
import RESTSerializer from "ember-data/serializers/rest-serializer";
import {
JSONSerializer,
JSONAPISerializer,
RESTSerializer
} from "ember-data/serializers";
import "ember-inflector";
import EmbeddedRecordsMixin from "ember-data/serializers/embedded-records-mixin";
import {
Expand Down Expand Up @@ -100,12 +104,15 @@ DS.ManyArray = ManyArray;

DS.RecordArrayManager = RecordArrayManager;

DS.RESTAdapter = RESTAdapter;
DS.BuildURLMixin = BuildURLMixin;
DS.BuildURLMixin = BuildURLMixin;

DS.FixtureAdapter = FixtureAdapter;
DS.JSONAPIAdapter = JSONAPIAdapter;
DS.RESTAdapter = RESTAdapter;

DS.RESTSerializer = RESTSerializer;
DS.JSONSerializer = JSONSerializer;
DS.JSONSerializer = JSONSerializer;
DS.JSONAPISerializer = JSONAPISerializer;
DS.RESTSerializer = RESTSerializer;

DS.Transform = Transform;
DS.DateTransform = DateTransform;
Expand Down
2 changes: 2 additions & 0 deletions packages/ember-data/lib/serializers.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import JSONSerializer from "ember-data/serializers/json-serializer";
import JSONAPISerializer from "ember-data/serializers/json-api-serializer";
import RESTSerializer from "ember-data/serializers/rest-serializer";

export {
JSONSerializer,
JSONAPISerializer,
RESTSerializer
};
Loading

0 comments on commit 0955b53

Please sign in to comment.