UNPKG

gypsum

Version:

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

190 lines 8.46 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const logger_1 = require("../misc/logger"); const types_1 = require("../types"); const url_1 = require("tools-box/url"); const emitter_1 = require("../emitter"); const jobs_manager_1 = require("../jobs-manager"); class Model { constructor(app) { this.name = this.constructor.name.toLowerCase(); this.emitter = new emitter_1.GypsumEmitter(); this.app = app; emitter_1.gypsumEmitter.on(`${this.app.name} ready`, () => this._init()); } _mArrangeServices() { this._servicesData = {}; if (this.$get('internal')) return {}; for (let prop in this) { let service = this[prop]; let isService = service && service.isService; if (service && isService) { let servicesOptions = this.$get('servicesOptions'); if (servicesOptions[prop] === false) { delete this[prop]; continue; } let serviceName = prop.toLowerCase(); if (servicesOptions[prop] && servicesOptions[prop].authorize !== undefined) { service.authorize = servicesOptions[prop].authorize; } else { service.authorize = service.authorize === false ? false : service.authorize || this.$get('authorize'); } if (service.authorize) { service.secure = true; } else if (servicesOptions[prop] && servicesOptions[prop].secure !== undefined) { service.secure = servicesOptions[prop].secure; } else { service.secure = service.secure === false ? false : service.secure || this.$get('secure'); } this._servicesData[serviceName] = { __name: service.__name, isService: isService, args: [], secure: service.secure, authorize: service.authorize, apiType: this.$get('apiType') === types_1.API_TYPES.ALL ? service.apiType : this.$get('apiType'), name: service.__name, event: `${this.name} ${service.__name.toLowerCase()}`, method: service.method, crud: service.crud, path: createPath(service, this), params: service.params, domain: (!this.$get('domain') || this.$get('domain') > service.domain) ? service.domain : this.$get('domain'), before: [], after: [], validate: service.validate || null, cors: service.cors }; if (this.$get('before') && this.$get('before').length) this._servicesData[serviceName].before = [...this.$get('before')]; let serviceBeforeHooks; if (servicesOptions[prop] && servicesOptions[prop].before && servicesOptions[prop].before.length) serviceBeforeHooks = servicesOptions[prop].before; else if (service.before && service.before.length) { serviceBeforeHooks = service.before; } if (serviceBeforeHooks && serviceBeforeHooks.length) { if (serviceBeforeHooks[0] === "~") { this._servicesData[serviceName].before = [...(serviceBeforeHooks.slice(1))]; } else { this._servicesData[serviceName].before.push(...serviceBeforeHooks); cleanHooks(this._servicesData[serviceName].before); } } if (this.$get('after') && this.$get('after').length) this._servicesData[serviceName].after = [...this.$get('after')]; let serviceAfterHooks; if (servicesOptions[prop] && servicesOptions[prop].after && servicesOptions[prop].after.length) serviceAfterHooks = servicesOptions[prop].after; else if (service.after && service.after.length) { serviceAfterHooks = service.after; } if (serviceAfterHooks && serviceAfterHooks.length) { if (service.after[0] === "~") { this._servicesData[serviceName].after = [...(serviceAfterHooks.slice(1))]; } else { this._servicesData[serviceName].after.push('|', ...serviceAfterHooks); cleanHooks(this._servicesData[serviceName].after); let splitterIndex = this._servicesData[serviceName].after.indexOf('|'); this._servicesData[serviceName].after = [ ...this._servicesData[serviceName].after.slice(splitterIndex + 1), ...this._servicesData[serviceName].after.slice(0, splitterIndex) ]; } } } } return this._servicesData; } _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]); } _init() { let modelName = this.name; this.$logger = new logger_1.Logger(modelName); this._mArrangeServices(); this._mArrangeHooks(); this._mArrangeJobs(); } $get(prop) { return this[`__${prop}`] === undefined ? null : this[`__${prop}`]; } $getServices() { return this._servicesData || this._mArrangeServices(); } $getService(name) { return this._servicesData[name.toLowerCase()]; } $getHooks() { return this._hooksData || this._mArrangeHooks(); } $getHook(name) { return this._hooksData[name.toLowerCase()]; } $hasService(name) { return this._servicesData[name.toLowerCase()].isService; } $hasHook(name) { return this._hooksData.hasOwnProperty(name.toLowerCase()) && this._hooksData[name.toLowerCase()].isHook; } } exports.Model = Model; function cleanHooks(hooks) { for (let i = 0; i < hooks.length; i++) { let hook = hooks[i]; let hookName = typeof hook === 'string' ? hook.split(':')[0] : hook.name; let modifier = hookName.charAt(0); if (modifier === '-') { hookName = hookName.slice(1); hooks.splice(i--, 1); for (let j = 0; j <= i; j++) { let currentHookName = typeof hooks[j] === 'string' ? hooks[j].split(':')[0] : hooks[j].name; if (currentHookName === hookName) { hooks.splice(j--, 1); i--; } } } else if (modifier === '=') { hookName = hookName.slice(1); if (typeof hook === 'string') hooks[i] = hooks[i].slice(1); else hook.name = hookName; for (let j = 0; j < i; j++) { let currentHookName = typeof hooks[j] === 'string' ? hooks[j].split(':')[0] : hooks[j].name; if (currentHookName === hookName) { hooks.splice(j--, 1); i--; } } } } } function createPath(service, model) { let path = `/${model.name}/${service.__name.toLowerCase()}`; if (service.params && service.params.length) path += '/' + service.params.map(param => `:${param}`).join('/'); return '/' + url_1.URL.Clean(path); } //# sourceMappingURL=model.js.map