gypsum
Version:
Simple and easy lightweight typescript server side framework on Node.js.
190 lines • 8.46 kB
JavaScript
"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