gypsum
Version:
Simple and easy lightweight typescript server side framework on Node.js.
119 lines • 4.39 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const url_1 = require("tools-box/url");
const types_1 = require("./types");
const state_1 = require("./state");
const emitter_1 = require("./emitter");
const logger_1 = require("./misc/logger");
const jobs_manager_1 = require("./jobs-manager");
class App {
constructor() {
this._models = [];
this.emitter = new emitter_1.GypsumEmitter();
this.name = this.constructor.name.toLowerCase();
this.$logger = new logger_1.Logger(this.name);
emitter_1.gypsumEmitter.on('initialize apps', () => this._init());
}
_init() {
let models = this.$get('models');
for (let i = 0; i < models.length; i++) {
this._models.push(new models[i](this));
}
this._mArrangeHooks();
this._mArrangeJobs();
emitter_1.gypsumEmitter.emit(`${this.name} ready`);
}
_mArrangeHooks() {
this._hooksData = {};
for (let prop in this) {
if (this[prop] && this[prop].isHook) {
this._hooksData[prop.toLowerCase()] = {};
for (let key in this[prop])
this._hooksData[prop.toLowerCase()][key] = this[prop][key];
}
}
return this._hooksData;
}
_mArrangeJobs() {
for (let prop in this)
if (this[prop] && this[prop].isJob)
jobs_manager_1.JobsManger.registerJob(this, this[prop]);
}
get publicModels() {
return this._models.filter(model => !model.$get('internal'));
}
$get(prop) {
return this[`__${prop}`];
}
$getModel(name) {
let model = this._models.find(model => model.name === name.toLowerCase());
if (!model || model.$get('private'))
return null;
return model;
}
$hasModel(name) {
return this._models.findIndex(model => model.name === name.toLowerCase()) > -1;
}
$getHooks() {
return this._hooksData || this._mArrangeHooks();
}
$getHook(name) {
return this._hooksData[name.toLowerCase()];
}
$getApis() {
let models = [];
for (let i = 0; i < this._models.length; i++) {
let model = this._models[i];
let modelServices = model.$getServices();
let services = {};
for (let prop in modelServices) {
let service = modelServices[prop];
let path = null;
let crud = null;
if (service.apiType !== types_1.API_TYPES.SOCKET) {
path = 'http' + (state_1.State.config.secure ? 's' : '') + '://';
path += this.name.toLowerCase() + '.' + state_1.State.config.domain;
path += '/' + service.path;
path = url_1.URL.Clean(path);
}
if (service.apiType !== types_1.API_TYPES.REST)
crud = service.crud;
services[service.__name.toLowerCase()] = {
name: service.__name.toLowerCase(),
crud: crud,
method: service.method,
path: path
};
}
let modelSchema = model.$get('schema');
models.push({
name: model.name.toLowerCase(),
schema: modelSchema ? modelSchema.schema : null,
services: services
});
}
return {
name: this.name,
apiType: this.$get('apiType'),
namespaces: this.$get('namespaces'),
models: models
};
}
$getMap() {
let map = [];
if (this._models && this._models.length) {
for (let i = 0; i < this._models.length; i++) {
let modelName = this._models[i].name;
let services = this._models[i].$getServices();
let serviceNames = Object.keys(services);
if (serviceNames.length) {
for (let name in serviceNames)
map.push(`${this.name}.${modelName}.${name}`);
}
}
}
return map;
}
}
exports.App = App;
//# sourceMappingURL=app.js.map