baqend
Version:
Baqend JavaScript SDK
323 lines • 20.6 kB
JavaScript
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Metamodel = void 0;
var ManagedType_1 = require("./ManagedType");
var EntityType_1 = require("./EntityType");
var binding_1 = require("../binding");
var ModelBuilder_1 = require("./ModelBuilder");
var DbIndex_1 = require("./DbIndex");
var util_1 = require("../util");
var connector_1 = require("../connector");
var message = __importStar(require("../message"));
var Metamodel = /** @class */ (function (_super) {
__extends(Metamodel, _super);
/**
* Constructs a new metamodel instance which represents the complete schema of one baqend app
* @param entityManagerFactory
*/
function Metamodel(entityManagerFactory) {
var _this = _super.call(this) || this;
/**
* Defines if the Metamodel has been finalized
*/
_this.isInitialized = false;
_this.entities = {};
_this.embeddables = {};
_this.baseTypes = {};
_this.enhancer = new binding_1.Enhancer();
_this.entityManagerFactory = entityManagerFactory;
return _this;
}
/**
* Prepare the Metamodel for custom schema creation
* @param jsonMetamodel initialize the metamodel with the serialized json schema
* @return
*/
Metamodel.prototype.init = function (jsonMetamodel) {
if (this.isInitialized) {
throw new Error('Metamodel is already initialized.');
}
this.fromJSON(jsonMetamodel || []);
this.isInitialized = true;
};
/**
* @param arg
* @return
*/
Metamodel.prototype.getRef = function (arg) {
var ref;
if (typeof arg === 'string') {
ref = arg;
if (ref.indexOf('/db/') !== 0) {
ref = "/db/".concat(arg);
}
}
else {
ref = binding_1.Enhancer.getIdentifier(arg);
}
return ref;
};
/**
* Return the metamodel entity type representing the entity.
*
* @param typeConstructor - the type of the represented entity
* @return the metamodel entity type or null if the class is not a managed entity
*/
Metamodel.prototype.entity = function (typeConstructor) {
var ref = this.getRef(typeConstructor);
return ref ? this.entities[ref] : null;
};
/**
* Return the metamodel basic type representing the native class.
* @param typeConstructor - the type of the represented native class
* @return the metamodel basic type
*/
Metamodel.prototype.baseType = function (typeConstructor) {
var ref = null;
if (typeof typeConstructor === 'string') {
ref = this.getRef(typeConstructor);
}
else {
var baseTypesNames = Object.keys(this.baseTypes);
for (var i = 0, len = baseTypesNames.length; i < len; i += 1) {
var name_1 = baseTypesNames[i];
var type = this.baseTypes[name_1];
if (!type.noResolving && type.typeConstructor === typeConstructor) {
ref = name_1;
break;
}
}
}
return ref ? this.baseTypes[ref] : null;
};
/**
* Return the metamodel embeddable type representing the embeddable class.
* @param typeConstructor - the type of the represented embeddable class
* @return the metamodel embeddable type or null if the class is not a managed embeddable
*/
Metamodel.prototype.embeddable = function (typeConstructor) {
var ref = this.getRef(typeConstructor);
return ref ? this.embeddables[ref] : null;
};
/**
* Return the metamodel managed type representing the entity, mapped superclass, or embeddable class.
*
* @param typeConstructor - the type of the represented managed class
* @return the metamodel managed type
*/
Metamodel.prototype.managedType = function (typeConstructor) {
return this.entity(typeConstructor) || this.embeddable(typeConstructor);
};
/**
* @param type
* @return the added type
*/
Metamodel.prototype.addType = function (type) {
var types = {};
if (type.isBasic) {
types = this.baseTypes;
}
else if (type.isEmbeddable) {
type.init(this.enhancer);
types = this.embeddables;
}
else if (type.isEntity) {
var entityType = type;
entityType.init(this.enhancer);
types = this.entities;
if (entityType.superType === null && entityType.ref !== EntityType_1.EntityType.Object.ref) {
entityType.superType = this.entity(EntityType_1.EntityType.Object.ref);
}
}
if (types[type.ref]) {
throw new Error("The type ".concat(type.ref, " is already declared."));
}
types[type.ref] = type;
return type;
};
/**
* Load all schema data from the server
* @return
*/
Metamodel.prototype.load = function () {
var _this = this;
if (!this.isInitialized) {
return this.withLock(function () {
var msg = new message.GetAllSchemas();
return _this.entityManagerFactory.send(msg).then(function (response) {
_this.init(response.entity);
return _this;
});
});
}
throw new Error('Metamodel is already initialized.');
};
/**
* Store all local schema data on the server, or the provided one
*
* Note: The schema must be initialized, by init or load
*
* @param managedType The specific type to persist, if omitted the complete schema
* will be updated
* @return
*/
Metamodel.prototype.save = function (managedType) {
var _this = this;
return this.sendUpdate(managedType || this.toJSON()).then(function () { return _this; });
};
/**
* Update the metamodel with the schema
*
* The provided data object will be forwarded to the UpdateAllSchemas resource.
* The underlying schema of this Metamodel object will be replaced by the result.
*
* @param data The JSON which will be send to the UpdateAllSchemas resource.
* @return
*/
Metamodel.prototype.update = function (data) {
var _this = this;
return this.sendUpdate(data).then(function (response) {
_this.fromJSON(response.entity);
return _this;
});
};
Metamodel.prototype.sendUpdate = function (data) {
var _this = this;
return this.withLock(function () {
var msg;
if (data instanceof ManagedType_1.ManagedType) {
msg = new message.UpdateSchema(data.name, data.toJSON());
}
else {
msg = new message.UpdateAllSchemas(data);
}
return _this.entityManagerFactory.send(msg);
});
};
/**
* Get the current schema types as json
* @return the json data
*/
Metamodel.prototype.toJSON = function () {
var _this = this;
if (!this.isInitialized) {
throw new Error('Metamodel is not initialized.');
}
return [].concat(Object.keys(this.entities).map(function (ref) { return _this.entities[ref].toJSON(); }), Object.keys(this.embeddables).map(function (ref) { return _this.embeddables[ref].toJSON(); }));
};
/**
* Replace the current schema by the provided one in json
* @param json The json schema data
* @return
*/
Metamodel.prototype.fromJSON = function (json) {
var _this = this;
var builder = new ModelBuilder_1.ModelBuilder();
var models = builder.buildModels(json);
this.baseTypes = {};
this.embeddables = {};
this.entities = {};
Object.keys(models).forEach(function (ref) { return _this.addType(models[ref]); });
};
/**
* Creates an index
*
* @param bucket Name of the Bucket
* @param index Will be applied for the given bucket
* @return
*/
Metamodel.prototype.createIndex = function (bucket, index) {
var msg = new message.CreateDropIndex(bucket, __assign(__assign({}, index.toJSON()), { drop: false }));
return this.entityManagerFactory.send(msg);
};
/**
* Drops an index
*
* @param bucket Name of the Bucket
* @param index Will be dropped for the given bucket
* @return
*/
Metamodel.prototype.dropIndex = function (bucket, index) {
var msg = new message.CreateDropIndex(bucket, __assign(__assign({}, index.toJSON()), { drop: true }));
return this.entityManagerFactory.send(msg);
};
/**
* Drops all indexes
*
* @param bucket Indexes will be dropped for the given bucket
* @return
*/
Metamodel.prototype.dropAllIndexes = function (bucket) {
var msg = new message.DropAllIndexes(bucket);
return this.entityManagerFactory.send(msg);
};
/**
* Loads all indexes for the given bucket
*
* @param bucket Current indexes will be loaded for the given bucket
* @return
*/
Metamodel.prototype.getIndexes = function (bucket) {
var msg = new message.ListIndexes(bucket);
return this.entityManagerFactory.send(msg)
.then(function (response) { return response.entity.map(function (el) { return new DbIndex_1.DbIndex(el.keys, el.unique); }); })
.catch(function (e) {
if (e.status === connector_1.StatusCode.BUCKET_NOT_FOUND || e.status === connector_1.StatusCode.OBJECT_NOT_FOUND) {
return null;
}
throw e;
});
};
return Metamodel;
}(util_1.Lockable));
exports.Metamodel = Metamodel;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWV0YW1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL21ldGFtb2RlbC9NZXRhbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUE0QztBQUM1QywyQ0FBMEM7QUFDMUMsc0NBQStDO0FBQy9DLCtDQUE4QztBQUM5QyxxQ0FBb0M7QUFDcEMsZ0NBRWlCO0FBQ2pCLDBDQUEwQztBQUMxQyxrREFBc0M7QUFNdEM7SUFBK0IsNkJBQVE7SUFnQnJDOzs7T0FHRztJQUNILG1CQUFZLG9CQUEwQztRQUF0RCxZQUNFLGlCQUFPLFNBRVI7UUF0QkQ7O1dBRUc7UUFDSSxtQkFBYSxHQUFZLEtBQUssQ0FBQztRQUkvQixjQUFRLEdBQXdDLEVBQUUsQ0FBQztRQUVuRCxpQkFBVyxHQUE0QyxFQUFFLENBQUM7UUFFMUQsZUFBUyxHQUF1QyxFQUFFLENBQUM7UUFFbkQsY0FBUSxHQUFhLElBQUksa0JBQVEsRUFBRSxDQUFDO1FBUXpDLEtBQUksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQzs7SUFDbkQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx3QkFBSSxHQUFKLFVBQUssYUFBdUI7UUFDMUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztTQUN0RDtRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7O09BR0c7SUFDSCwwQkFBTSxHQUFOLFVBQU8sR0FBdUM7UUFDNUMsSUFBSSxHQUFHLENBQUM7UUFDUixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtZQUMzQixHQUFHLEdBQUcsR0FBRyxDQUFDO1lB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