Skip to content

Instantly share code, notes, and snippets.

@bdevel
Created May 12, 2016 23:46
Show Gist options
  • Save bdevel/345feb7aee8ba92c4c945a96499d5ac0 to your computer and use it in GitHub Desktop.
Save bdevel/345feb7aee8ba92c4c945a96499d5ac0 to your computer and use it in GitHub Desktop.
Partially completed JSON API Ember Adapter and serializer for ElasticSearch.
import DS from 'ember-data';
import Ember from 'ember';
import ENV from 'my-app/config/environment';
Ember.ENV.DEBUG = true;
const {get} = Ember;
const ElasticSearchAdapter = DS.JSONAPIAdapter.extend({
host: "http://localhost:9200",
namespace: "ist-dev",
// https://github.com/emberjs/data/blob/e190634f526339ee97dcd62e8bc3ffa8417986c0/addon/-private/adapters/build-url-mixin.js
/*buildURL: function(modelName, id, snapshot, requestType, query){
var url = `http://localhost:9200/${this.index}/${modelName}`;
if (id){url += '/'+id;}
console.log("build url:", modelName, id, snapshot, requestType, query);
return url;
},*/
xxfindHasMany: function(store, record, relationship, details) {
debugger;
},
createRecord(store, type, snapshot) {
var serializer = store.serializerFor(type.modelName);
var url = this.buildURL(type.modelName, null, snapshot, 'createRecord');
var payload = serializer.serialize(snapshot, { includeId: false, includeRoot: false });
return this.ajax(url, "POST", { data: payload }).then((resp, textStatus, xhr) => {
snapshot.record.set('id', resp._id);
//console.log("ajx done: ", data, textStatus, xhr);
//record.set('id', get(data, '_id')+'');
})
},
pathForType: function (modelName) {
var dashed = Ember.String.dasherize(modelName);
return Ember.String.pluralize(dashed);
},
// handleResponse(status, headers, payload, requestData) {
// console.log("status, headers, payload, requestData = ", status, headers, payload, requestData);
// if (this.isSuccess(status, headers, payload)) {
// return payload;
// } else if (this.isInvalid(status, headers, payload)) {
// return new InvalidError(payload.errors);
// }
// let errors = this.normalizeErrorResponse(status, headers, payload);
// let detailedMessage = this.generatedDetailedMessage(status, headers, payload, requestData);
// return new AdapterError(errors, detailedMessage);
// },
});
export default ElasticSearchAdapter;
// define("ember-data/-private/system/relationships/state/has-many", ["exports", "ember-data/-private/debug", "ember-d\
// ata/-private/system/promise-proxies", "ember-data/-private/system/relationships/state/relationship", "ember-data/-p\
// rivate/system/ordered-set", "ember-data/-private/system/many-array", "ember-data/-private/utils"], function (export\
// s, _emberDataPrivateDebug, _emberDataPrivateSystemPromiseProxies, _emberD\
ataPrivateSystemRelationshipsStateRelation\
// ship, _emberDataPrivateSystemOrderedSet, _emberDataPrivateSystemManyArray\
, _emberDataPrivateUtils) {
// exports.default = ManyRelationship;
// import ManyRelationship from "ember-data/-private/system/relationships/state/has-many";
// var oldFind = ManyRelationship.prototype.findRecords;
// ManyRelationship.prototype.findRecords = function() {
// let manyArray = this.manyArray.toArray();
// let internalModels = new Array(manyArray.length);
// for (let i = 0; i < manyArray.length; i++) {
// internalModels[i] = manyArray[i]._internalModel;
// }
// //TODO CLEANUP
// return this.store.findMany(internalModels).then(() => {
// if (!this.manyArray.get('isDestroyed')) {
// //Goes away after the manyArray refactor
// this.manyArray.set('isLoaded', true);
// }
// return this.manyArray;
// });
// };
import DS from 'ember-data';
//import BuildURLMixin from "ember-data/-private/adapters/build-url-mixin";
import ElasticSearchAdapter from "../adapters/application";
export default DS.JSONAPISerializer.extend({
// extractId: function () {
// console.log("extractID:", arguments);
// },
serialize: function(snapshot, options){
var hash = this._super(snapshot, options);
var out = hash.data;
delete out.type;
return out;
},
// serializeIntoHash(hash, typeClass, snapshot, options) {
// var s = this.serialize(snapshot, options);
// console.log("s = ", s);
// var out = Ember.merge(hash, s.data);
// console.log("out = ", out);
// return out;
// },
// serializeIntoHash(hash, typeClass, snapshot, options) {
// Ember.merge(hash, this.serialize(snapshot, options));
// },
modelNameFromPayloadKey: function(key) {
console.log("key", key);
// var out = Ember.String.singularize(normalizeModelName(key));
// console.log("key", key, ' -> ', out, arguments);
return key;
},
relationshipsUrlsForModel: function(modelClass, id) {
var modelName = modelClass.modelName;
var relationships = {};
Ember.get(modelClass, 'relationshipsByName').forEach((relationship) => {
var urlName = ElasticSearchAdapter.prototype.pathForType(relationship.type);//this.pathForType(otherModelName);
var url = '../../';// use relative so we stay in the same index
if (relationship.kind == 'hasMany'){
url += urlName + '/_search?q=' + modelName + ':' + id;// Build a search query to find relationships
} else if (kind == 'belongsTo'){
// TODO: ??? Pull out of payload and build url with the ID.
}
relationships[relationship.key] = {
links: {related: url}
};
});
return relationships;
},
normalizeResponse(store, primaryModelClass, payload, id, requestType) {
console.log("noramlizeResponse serialize:", arguments);
var out = {
data: {
id: payload._id,
// Note this needs to be singular despite JSON API spec. WTF?
// See: https://github.com/emberjs/data/blob/v2.4.0/addon/serializers/json.js#L518
type: primaryModelClass.modelName,
attributes: payload._source,
relationships: this.relationshipsUrlsForModel(primaryModelClass, payload._id)
}
};
switch (requestType) {
case 'findRecord':
return out;
//return this.normalizeFindRecordResponse(...arguments);
case 'queryRecord':
return this.normalizeQueryRecordResponse(...arguments);
case 'findAll':
debugger;
return this.normalizeFindAllResponse(...arguments);
case 'findBelongsTo':
return this.normalizeFindBelongsToResponse(...arguments);
case 'findHasMany':
return this.normalizeFindHasManyResponse(...arguments);
case 'findMany':
return this.normalizeFindManyResponse(...arguments);
case 'query':
return this.normalizeQueryResponse(...arguments);
case 'createRecord':
return {data: {id: payload._id, type: payload._type}};
case 'deleteRecord':
return this.normalizeDeleteRecordResponse(...arguments);
case 'updateRecord':
return {data: {id: payload._id, type: payload._type}};
}
},
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment