js-data-jsonapi-light
Version:
JsonApi adapter serializer/dezerializer light.
115 lines • 4.93 kB
JavaScript
"use strict";
var utils_1 = require("./utils");
var js_data_1 = require("js-data");
var strings_1 = require("./strings");
function wrapDeserialize(self) {
return function (mapper, res, opts) {
var beforeDeserialize = opts.beforeDeserialize || mapper.beforeDeserialize || self.options.beforeDeserialize, afterDeserialize = opts.afterDeserialize || mapper.afterDeserialize || self.options.afterDeserialize;
if (beforeDeserialize)
res = beforeDeserialize.call(self, mapper, res, opts);
res = jsonApiDeserialize.call(self, mapper, res, opts);
if (afterDeserialize)
res = afterDeserialize.call(self, mapper, res, opts);
return res;
};
}
exports.wrapDeserialize = wrapDeserialize;
function jsonApiDeserialize(mapper, res, opts) {
if (!res.data || !res.data.data)
return;
var store = mapper.datastore;
var collectionReceived = js_data_1.utils.isArray(res.data.data);
var itemsIndexed = {};
var itemCollection = [].concat(res.data.included || [])
.concat(res.data.data || []);
var i = itemCollection.length;
while (i--) {
var item = itemCollection[i];
if (!item.type || !item.id) {
itemCollection.splice(i, 1);
continue;
}
if (!itemsIndexed[item.type])
itemsIndexed[item.type] = {};
itemsIndexed[item.type][item.id] = item;
}
for (var type in itemsIndexed) {
var resource = store.getMapper(type);
if (!resource) {
this.warn(strings_1.WARNING.NO_RESSOURCE(type));
continue;
}
utils_1.mapperCacheRelationByField(resource);
for (var id in itemsIndexed[type]) {
var item = itemsIndexed[type][id];
item.attributes[resource.idAttribute] = id;
if (!item.relationships || !Object.keys(item.relationships))
continue;
for (var relationField in (item.relationships || {})) {
var relation = resource.relationByField[relationField];
if (!relation || !item.relationships[relationField] || !item.relationships[relationField].data) {
continue;
}
if (relation.type === 'belongsTo' || relation.type === 'hasOne') {
var link = item.relationships[relationField].data;
if (!js_data_1.utils.isObject(link)) {
this.warn(strings_1.WARNING.WRONG_RELATION_OBJECT_EXPECTED, relation);
continue;
}
if (relation.type === 'belongsTo') {
if (!relation.foreignKey) {
this.warn(strings_1.WARNING.NO_FOREIGN_KEY, relation);
}
else {
item.attributes[relation.foreignKey] = link.id;
}
}
if (itemsIndexed[link.type] && itemsIndexed[link.type][link.id]) {
var remoteIdAttribute = relation.relatedCollection.idAttribute;
var itemLinked = itemsIndexed[link.type][link.id];
itemLinked.attributes[remoteIdAttribute] = link.id;
item.attributes[relation.localField] = itemLinked.attributes;
}
}
else if (relation.type === 'hasMany') {
var links = item.relationships[relationField].data;
if (!js_data_1.utils.isArray(links)) {
this.warn(strings_1.WARNING.WRONG_RELATION_ARRAY_EXPECTED);
continue;
}
item.attributes[relation.localField] = [];
for (var i_1 = 0, l = links.length; i_1 < l; i_1++) {
var link = links[i_1];
if (itemsIndexed[link.type] && itemsIndexed[link.type][link.id]) {
var itemLinkd = itemsIndexed[link.type][link.id];
item.attributes[relation.localField].push(itemLinkd.attributes);
}
}
}
else {
this.warn(strings_1.WARNING.RELATION_UNKNOWN);
continue;
}
}
}
}
var outputDatas;
if (!collectionReceived) {
outputDatas = res.data.data.attributes;
}
else {
outputDatas = [];
for (var i_2 = 0, l = res.data.data.length; i_2 < l; i_2++) {
outputDatas.push(res.data.data[i_2].attributes);
}
}
if (!opts.raw) {
return outputDatas;
}
return {
result: outputDatas,
meta: res.data.meta
};
}
exports.jsonApiDeserialize = jsonApiDeserialize;
//# sourceMappingURL=deserializer.js.map