baqend
Version:
Baqend JavaScript SDK
149 lines • 12.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ModelBuilder = void 0;
var BasicType_1 = require("./BasicType");
var EntityType_1 = require("./EntityType");
var EmbeddableType_1 = require("./EmbeddableType");
var ListAttribute_1 = require("./ListAttribute");
var MapAttribute_1 = require("./MapAttribute");
var SetAttribute_1 = require("./SetAttribute");
var SingularAttribute_1 = require("./SingularAttribute");
var error_1 = require("../error");
var intersection_1 = require("../intersection");
var ModelBuilder = /** @class */ (function () {
function ModelBuilder() {
var _this = this;
this.models = {};
this.modelDescriptors = null;
Object.keys(BasicType_1.BasicType).forEach(function (typeName) {
var basicType = BasicType_1.BasicType[typeName];
if (basicType instanceof BasicType_1.BasicType) {
_this.models[basicType.ref] = basicType;
}
});
}
/**
* @param ref
* @return
*/
ModelBuilder.prototype.getModel = function (ref) {
if (ref in this.models) {
return this.models[ref];
}
var model = this.buildModel(ref);
this.models[ref] = model;
return model;
};
/**
* @param modelDescriptors
* @return
*/
ModelBuilder.prototype.buildModels = function (modelDescriptors) {
var _this = this;
this.modelDescriptors = {};
modelDescriptors.forEach(function (modelDescriptor) {
_this.modelDescriptors[modelDescriptor.class] = modelDescriptor;
});
Object.keys(this.modelDescriptors).forEach(function (ref) {
try {
var model = _this.getModel(ref);
_this.buildAttributes(model);
}
catch (e) {
throw new error_1.PersistentError("Can't create model for entity class ".concat(ref), e);
}
});
// ensure at least an object entity
this.getModel(EntityType_1.EntityType.Object.ref);
return this.models;
};
/**
* @param ref
* @return
*/
ModelBuilder.prototype.buildModel = function (ref) {
var modelDescriptor = this.modelDescriptors[ref];
var type;
if (ref === EntityType_1.EntityType.Object.ref) {
type = new EntityType_1.EntityType.Object();
}
else if (modelDescriptor) {
if (modelDescriptor.embedded) {
type = new EmbeddableType_1.EmbeddableType(ref);
}
else {
var superTypeIdentifier = modelDescriptor.superClass || EntityType_1.EntityType.Object.ref;
type = new EntityType_1.EntityType(ref, this.getModel(superTypeIdentifier));
}
}
else {
throw new TypeError("No model available for ".concat(ref));
}
type.metadata = {};
if (modelDescriptor) {
type.metadata = modelDescriptor.metadata || {};
var permissions_1 = modelDescriptor.acl || {};
Object.keys(permissions_1).forEach(function (permission) {
var permissionProperty = "".concat(permission, "Permission");
type[permissionProperty].fromJSON(permissions_1[permission]);
});
}
return type;
};
/**
* @param model
* @return
*/
ModelBuilder.prototype.buildAttributes = function (model) {
var _this = this;
var modelDescriptor = this.modelDescriptors[model.ref];
var fields = modelDescriptor.fields;
Object.keys(fields).forEach(function (name) {
var field = fields[name];
if (!model.getAttribute(name)) { // skip predefined attributes
model.addAttribute(_this.buildAttribute(field), field.order);
}
});
if (typeof modelDescriptor.validationCode === 'string') {
// eslint-disable-next-line no-param-reassign
model.validationCode = intersection_1.Validator.compile(model, modelDescriptor.validationCode);
}
};
/**
* @param field The field metadata
* @param field.name The name of zhe field
* @param field.type The type reference of the field
* @param field.order The order number of the field
* @param field.metadata Additional metadata of the field
* @return
*/
ModelBuilder.prototype.buildAttribute = function (field) {
// TODO: remove readonly if createdAt and updatedAt becomes real metadata fields in the schema
var isMetadata = field.flags && (field.flags.indexOf('METADATA') !== -1 || field.flags.indexOf('READONLY') !== -1);
var name = field.name;
var ref = field.type;
if (ref.indexOf('/db/collection.') !== 0) {
var singularAttribute = new SingularAttribute_1.SingularAttribute(name, this.getModel(ref), isMetadata);
singularAttribute.metadata = field.metadata;
return singularAttribute;
}
var collectionType = ref.substring(0, ref.indexOf('['));
var elementType = ref.substring(ref.indexOf('[') + 1, ref.indexOf(']')).trim();
switch (collectionType) {
case ListAttribute_1.ListAttribute.ref:
return new ListAttribute_1.ListAttribute(name, this.getModel(elementType));
case SetAttribute_1.SetAttribute.ref:
return new SetAttribute_1.SetAttribute(name, this.getModel(elementType));
case MapAttribute_1.MapAttribute.ref: {
var keyType = elementType.substring(0, elementType.indexOf(',')).trim();
var valueType = elementType.substring(elementType.indexOf(',') + 1).trim();
return new MapAttribute_1.MapAttribute(name, this.getModel(keyType), this.getModel(valueType));
}
default:
throw new TypeError("No collection available for ".concat(ref));
}
};
return ModelBuilder;
}());
exports.ModelBuilder = ModelBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kZWxCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL21ldGFtb2RlbC9Nb2RlbEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXdDO0FBQ3hDLDJDQUEwQztBQUMxQyxtREFBa0Q7QUFDbEQsaURBQWdEO0FBQ2hELCtDQUE4QztBQUM5QywrQ0FBOEM7QUFDOUMseURBQXdEO0FBQ3hELGtDQUEyQztBQUszQyxnREFBd0Q7QUFFeEQ7SUFLRTtRQUFBLGlCQU9DO1FBWE8sV0FBTSxHQUFrQyxFQUFFLENBQUM7UUFFM0MscUJBQWdCLEdBQXVDLElBQUksQ0FBQztRQUdqRSxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFTLENBQWdDLENBQUMsT0FBTyxDQUFDLFVBQUMsUUFBUTtZQUN0RSxJQUFNLFNBQVMsR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RDLElBQUksU0FBUyxZQUFZLHFCQUFTLEVBQUU7Z0JBQ2xDLEtBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQzthQUN4QztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILCtCQUFRLEdBQVIsVUFBUyxHQUFXO1FBQ2xCLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDdEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBcUIsQ0FBQztTQUM3QztRQUVELElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0NBQVcsR0FBWCxVQUFZLGdCQUEyQjtRQUF2QyxpQkFvQkM7UUFuQkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUUzQixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsVUFBQyxlQUF3QjtZQUNoRCxLQUFJLENBQUMsZ0JBQWlCLENBQUMsZUFBZSxDQUFDLEtBQWUsQ0FBQyxHQUFHLGVBQWUsQ0FBQztRQUM1RSxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsR0FBRztZQUM3QyxJQUFJO2dCQUNGLElBQU0sS0FBSyxHQUFHLEtBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pDLEtBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDN0I7WUFBQyxPQUFPLENBQU0sRUFBRTtnQkFDZixNQUFNLElBQUksdUJBQWUsQ0FBQyw4Q0FBdUMsR0FBRyxDQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDNUU7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILG1DQUFtQztRQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXJDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsaUNBQVUsR0FBVixVQUFXLEdBQVc7UUFDcEIsSUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELElBQUksSUFBc0IsQ0FBQztRQUMzQixJQUFJLEdBQUcsS0FBSyx1QkFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDakMsSUFBSSxHQUFHLElBQUksdUJBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNoQzthQUFNLElBQUksZUFBZSxFQUFFO1lBQzFCLElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRTtnQkFDNUIsSUFBSSxHQUFHLElBQUksK0JBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNoQztpQkFBTTtnQkFDTCxJQUFNLG1CQUFtQixHQUFHLGVBQWUsQ0FBQyxVQUFvQixJQUFJLHVCQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztnQkFDMUYsSUFBSSxHQUFHLElBQUksdUJBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBb0IsQ0FBQyxDQUFDO2FBQ25GO1NBQ0Y7YUFBTTtZQUNMLE1BQU0sSUFBSSxTQUFTLENBQUMsaUNBQTBCLEdBQUcsQ0FBRSxDQUFDLENBQUM7U0FDdEQ7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUVuQixJQUFJLGVBQWUsRUFBRTtZQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxRQUFxQyxJQUFJLEVBQUUsQ0FBQztZQUM1RSxJQUFNLGFBQVcsR0FBRyxlQUFlLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUM3QyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQVcsQ0FBcUMsQ0FBQyxPQUFPLENBQUMsVUFBQyxVQUFVO2dCQUMvRSxJQUFNLGtCQUFrQixHQUFHLFVBQUcsVUFBVSxlQUFZLENBQUM7Z0JBQ25ELElBQVksQ0FBQyxrQkFBa0IsQ0FBZ0IsQ0FBQyxRQUFRLENBQUMsYUFBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDdEYsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILHNDQUFlLEdBQWYsVUFBZ0IsS0FBdUI7UUFBdkMsaUJBZUM7UUFkQyxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFELElBQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxNQUFpQixDQUFDO1FBRWpELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsSUFBSTtZQUMvQixJQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFZLENBQUM7WUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSw2QkFBNkI7Z0JBQzVELEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSSxDQUFDLGNBQWMsQ0FBQyxLQUFZLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBZSxDQUFDLENBQUM7YUFDOUU7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxlQUFlLENBQUMsY0FBYyxLQUFLLFFBQVEsRUFBRTtZQUN0RCw2Q0FBNkM7WUFDNUMsS0FBeUIsQ0FBQyxjQUFjLEdBQUcsd0JBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN0RztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gscUNBQWMsR0FBZCxVQUFlLEtBQ0k7UUFDakIsOEZBQThGO1FBQzlGLElBQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdHLElBQUEsSUFBSSxHQUFLLEtBQUssS0FBVixDQUFXO1FBQ3ZCLElBQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3hDLElBQU0saUJBQWlCLEdBQUcsSUFBSSxxQ0FBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN0RixpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUM1QyxPQUFPLGlCQUFpQixDQUFDO1NBQzFCO1FBQ0QsSUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRWpGLFFBQVEsY0FBYyxFQUFFO1lBQ3RCLEtBQUssNkJBQWEsQ0FBQyxHQUFHO2dCQUNwQixPQUFPLElBQUksNkJBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzdELEtBQUssMkJBQVksQ0FBQyxHQUFHO2dCQUNuQixPQUFPLElBQUksMkJBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzVELEtBQUssMkJBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDckIsSUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMxRSxJQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBRTdFLE9BQU8sSUFBSSwyQkFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUNqRjtZQUNEO2dCQUNFLE1BQU0sSUFBSSxTQUFTLENBQUMsc0NBQStCLEdBQUcsQ0FBRSxDQUFDLENBQUM7U0FDN0Q7SUFDSCxDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLEFBbEpELElBa0pDO0FBbEpZLG9DQUFZIn0=