UNPKG

gypsum

Version:

Simple and easy lightweight typescript server side framework on Node.js.

119 lines 4.39 kB
"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