coloquent-test2
Version:
Library for retrieving model objects from a JSON-API, with a fluent syntax inspired by Laravel Eloquent.
100 lines • 4.81 kB
JavaScript
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var ToManyRelation_1 = require("../relation/ToManyRelation");
var ToOneRelation_1 = require("../relation/ToOneRelation");
var Map_1 = require("../util/Map");
var Response_1 = require("./Response");
var RetrievalResponse = /** @class */ (function (_super) {
__extends(RetrievalResponse, _super);
function RetrievalResponse(httpClientResponse, modelType, responseBody) {
var _this = _super.call(this, httpClientResponse) || this;
_this.modelType = modelType;
_this.docIndex = new Map_1.Map();
_this.modelIndex = new Map_1.Map();
// Index the JsonApiDocs
_this.indexIncludedDocs(responseBody.included);
_this.indexRequestedDocs(responseBody.data);
// Build Models from the JsonApiDocs, for which the previously built indexes come in handy
_this.makeModelIndex(responseBody.data);
// Prepare arrays for immediate access through this.getData() and this.getIncluded()
_this.makeDataArray(responseBody.data);
_this.makeIncludedArray(responseBody.included);
return _this;
}
RetrievalResponse.prototype.getIncluded = function () {
return this.included;
};
RetrievalResponse.prototype.indexIncludedDocs = function (includedDocs) {
if (includedDocs === void 0) { includedDocs = []; }
for (var _i = 0, includedDocs_1 = includedDocs; _i < includedDocs_1.length; _i++) {
var doc = includedDocs_1[_i];
this.indexDoc(doc);
}
};
RetrievalResponse.prototype.indexDoc = function (doc) {
var type = doc.type;
var id = doc.id;
if (!this.docIndex.get(type)) {
this.docIndex.set(type, new Map_1.Map());
}
this.docIndex.get(type).set(id, doc);
};
RetrievalResponse.prototype.indexAsModel = function (doc, modelType) {
var type = doc.type;
var id = doc.id;
if (!this.modelIndex.get(type)) {
this.modelIndex.set(type, new Map_1.Map());
}
var model = new modelType();
if (!this.modelIndex.get(type).get(id)) { // visit every doc only once
model.populateFromJsonApiDoc(doc);
this.modelIndex.get(type).set(id, model);
for (var relationName in doc.relationships) {
var relation = model[relationName]();
if (relation instanceof ToManyRelation_1.ToManyRelation) {
var relatedStubs = doc.relationships[relationName].data;
if (relatedStubs) {
var r = [];
for (var _i = 0, relatedStubs_1 = relatedStubs; _i < relatedStubs_1.length; _i++) {
var stub = relatedStubs_1[_i];
var relatedDoc = this.docIndex.get(stub.type).get(stub.id);
r.push(this.indexAsModel(relatedDoc, relation.getType()));
}
model.setRelation(relationName, r);
}
}
else if (relation instanceof ToOneRelation_1.ToOneRelation) {
var stub = doc.relationships[relationName].data;
var relatedDoc = this.docIndex.get(stub.type).get(stub.id);
var m = this.indexAsModel(relatedDoc, relation.getType());
model.setRelation(relationName, m);
}
else {
throw new Error('Unknown type of Relation encountered: ' + typeof relation);
}
}
}
return model;
};
RetrievalResponse.prototype.makeIncludedArray = function (includedDocs) {
if (includedDocs === void 0) { includedDocs = []; }
this.included = [];
for (var _i = 0, includedDocs_2 = includedDocs; _i < includedDocs_2.length; _i++) {
var doc = includedDocs_2[_i];
this.included.push(this.modelIndex.get(doc.type).get(doc.id));
}
};
return RetrievalResponse;
}(Response_1.Response));
exports.RetrievalResponse = RetrievalResponse;
//# sourceMappingURL=RetrievalResponse.js.map