UNPKG

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
"use strict"; 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