* create-nocobase-app template from [develop] * change create-nocobase-app package.json config * feat: load configuration from directory * feat: configuration repository toObject * feat: create application from configuration dir * feat: application factory with plugins options * export type * feat: read application config & application with plugins options * feat: release command * fix: database release * chore: workflow package.json * feat: nocobase cli package * feat: console command * chore: load application in command * fix: load packages from process.cwd * feat: cli load env file * feat: create-nocobase-app * fix: gitignore create-nocobase-app lib * fix: sqlite path * feat: create plugin * chore: plugin files template * chore: move cli into application * chore: create-nocobase-app * fix: create plugin * chore: app-client && app-server * chore: package.json * feat: create-nocobase-app download template from npm * chore: create-nocobase-app template * fix: config of plugin-users * fix: yarn.lock * fix: database build error * fix: yarn.lock * fix: resourcer config * chore: cross-env * chore: app-client dependents * fix: env * chore: v0.6.0-alpha.1 * chore: verdaccio * chore(versions): 😊 publish v0.6.0 * chore(versions): 😊 publish v0.6.1-alpha.0 * chore(versions): 😊 publish v0.6.2-alpha.0 * chore(versions): 😊 publish v0.6.2-alpha.1 * chore: 0.6.2-alpha.2 * feat: workspaces * chore(versions): 😊 publish v0.6.2-alpha.3 * chore(versions): 😊 publish v0.6.2-alpha.4 * chore: create-nocobase-app * chore: create-nocobase-app lib * fix: update tsconfig.jest.json * chore: .env * chore(versions): 😊 publish v0.6.2-alpha.5 * chore(versions): 😊 publish v0.6.2-alpha.6 * feat: improve code * chore(versions): 😊 publish v0.6.2-alpha.7 * fix: cleanup * chore(versions): 😊 publish v0.6.2-alpha.8 * chore: tsconfig for app server package * fix: move files * fix: move files Co-authored-by: chenos <chenlinxh@gmail.com>
70 lines
1.5 KiB
TypeScript
70 lines
1.5 KiB
TypeScript
import lodash from 'lodash';
|
|
import type { SequelizeHooks } from 'sequelize/types/lib/hooks';
|
|
import Database from './database';
|
|
import { Model } from './model';
|
|
|
|
const { hooks } = require('sequelize/lib/hooks');
|
|
|
|
export class ModelHook {
|
|
database: Database;
|
|
boundEvent = new Set<string>();
|
|
|
|
constructor(database: Database) {
|
|
this.database = database;
|
|
}
|
|
|
|
isModelHook(eventName: string | symbol): keyof SequelizeHooks | false {
|
|
if (lodash.isString(eventName)) {
|
|
const hookType = eventName.split('.').pop();
|
|
|
|
if (hooks[hookType]) {
|
|
return <keyof SequelizeHooks>hookType;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
findModelName(hookArgs) {
|
|
for (const arg of hookArgs) {
|
|
if (arg instanceof Model) {
|
|
return (<Model>arg).constructor.name;
|
|
}
|
|
|
|
if (lodash.isPlainObject(arg)) {
|
|
if (arg['model']) {
|
|
return arg['model'].name;
|
|
}
|
|
|
|
if (lodash.get(arg, 'name.plural')) {
|
|
return lodash.get(arg, 'name.plural');
|
|
}
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
bindEvent(eventName) {
|
|
this.boundEvent.add(eventName);
|
|
}
|
|
|
|
hasBindEvent(eventName) {
|
|
return this.boundEvent.has(eventName);
|
|
}
|
|
|
|
sequelizeHookBuilder(eventName) {
|
|
return async (...args: any[]) => {
|
|
const modelName = this.findModelName(args);
|
|
|
|
if (modelName) {
|
|
// emit model event
|
|
await this.database.emitAsync(`${modelName}.${eventName}`, ...args);
|
|
}
|
|
|
|
// emit sequelize global event
|
|
await this.database.emitAsync(eventName, ...args);
|
|
};
|
|
}
|
|
}
|