loopback/lib/models/metadata.js

77 lines
2.3 KiB
JavaScript

module.exports = function (app) {
var ModelSchema = {
name: {type: String, required: true, id: true},
properties: Object,
settings: Object
};
var DataSourceSchema = {
name: {type: String, required: true, id: true},
connector: {type: String, default: 'memory'}
};
var loopback = require('../loopback');
var ds = loopback.createDataSource({connector: loopback.Memory});
var ModelMetaData = ds.createModel('ModelMetaData', ModelSchema, {strict: false, plural: 'metadata/models'});
ModelMetaData.prototype.build = function() {
if(this.modelClass) {
return this.modelClass;
}
this.modelClass = loopback.createModel(this.name, this.properties, this.settings);
};
ModelMetaData.prototype.automigrate = function (callback) {
this.build();
this.dataSource.automigrate(this.name, callback);
};
ModelMetaData.prototype.autoupdate = function (callback) {
this.build();
this.dataSource.autoupdate(this.name, callback);
};
ModelMetaData.prototype.attachTo = function (dataSourceName, callback) {
this.build();
var self = this;
DataSourceMetaData.findById(dataSourceName, function (err, dataSource) {
if (err) {
callback && callback(err);
} else {
self.modelClass.attachTo(dataSource);
callback && callback(err, dataSource);
}
});
};
ModelMetaData.prototype.expose = function (callback) {
this.build();
app.model(this.modelClass);
};
ModelMetaData.introspect = function (name, object, callback) {
var model = ModelMetaData.dataSource.buildModelFromInstance(name, object, {});
ModelMetaData.create(model.toJSON(), callback);
};
loopback.remoteMethod(
ModelMetaData.introspect,
{
accepts: [
{arg: 'name', type: 'string', required: true, source: 'query'},
{arg: 'data', type: 'object', required: true, source: 'body'}
],
http: {verb: 'post', path: '/introspect'}
}
);
var DataSourceMetaData = ds.createModel('DataSourceMetaData', DataSourceSchema, {strict: false, plural: 'metadata/data-sources'});
app.model(ModelMetaData);
app.model(DataSourceMetaData);
};