Created
May 12, 2016 23:46
-
-
Save bdevel/345feb7aee8ba92c4c945a96499d5ac0 to your computer and use it in GitHub Desktop.
Partially completed JSON API Ember Adapter and serializer for ElasticSearch.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
// }); | |
// }; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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