feat: server hooks afterDestroyCollection && afterCreateSelf

This commit is contained in:
Chareice 2022-02-08 21:43:30 +08:00 committed by chenos
parent 3e1cad643b
commit 41456b562e
3 changed files with 108 additions and 7 deletions

View File

@ -18,7 +18,7 @@ describe('server hooks', () => {
'x-component': 'Table',
'x-collection': 'posts',
'x-server-hooks': {
afterDestroyCollection: ['aaa'],
afterDestroyCollection: ['onCollectionDestroy'],
},
properties: {
col1: {
@ -85,7 +85,7 @@ describe('server hooks', () => {
expect(nodeFieldAttr.get('collectionPath')).toEqual('posts.title');
});
it('should call server hooks', async () => {
it('should call server hooks afterFieldDestroy', async () => {
const PostModel = await db.getRepository('collections').create({
values: {
name: 'posts',
@ -118,4 +118,61 @@ describe('server hooks', () => {
expect(hookFn).toHaveBeenCalled();
});
it('should call server hooks afterCollectionDestroy', async () => {
const PostModel = await db.getRepository('collections').create({
values: {
name: 'posts',
},
});
const fieldModel = await db.getRepository('fields').create({
values: {
name: 'title',
type: 'string',
collectionName: 'posts',
},
});
// @ts-ignore
await PostModel.migrate();
const serverHooks = uiSchemaPlugin.serverHooks;
const hookFn = jest.fn();
serverHooks.register('afterDestroyCollection', 'onCollectionDestroy', hookFn);
// destroy a field
await db.getRepository('collections').destroy({
filter: {
name: 'posts',
},
individualHooks: true,
});
expect(hookFn).toHaveBeenCalled();
});
it('should call server hooks afterUiSchemaCreated', async () => {
const menuSchema = {
'x-uid': 'menu',
'x-server-hooks': {
afterCreateSelf: ['afterCreateMenu'],
},
};
const serverHooks = uiSchemaPlugin.serverHooks;
const hookFn = jest.fn();
serverHooks.register('afterCreateSelf', 'afterCreateMenu', hookFn);
await uiSchemaRepository.create({
values: {
schema: menuSchema,
},
});
expect(hookFn).toHaveBeenCalled();
});
});

View File

@ -1,7 +1,7 @@
import { Database } from '@nocobase/database';
import { UiSchemaModel } from '../model';
export type HookType = 'afterDestroyField';
export type HookType = 'afterDestroyField' | 'afterDestroyCollection' | 'afterCreateSelf';
export class ServerHooks {
hooks = new Map<HookType, Map<string, any>>();
@ -14,6 +14,53 @@ export class ServerHooks {
this.db.on('fields.afterDestroy', async (model, options) => {
await this.afterFieldDestroy(model, options);
});
this.db.on('collections.afterDestroy', async (model, options) => {
await this.afterCollectionDestroy(model, options);
});
this.db.on('ui_schemas.afterCreate', async (model, options) => {
await this.afterUiSchemaCreated(model, options);
});
}
protected async afterUiSchemaCreated(uiSchemaModel, options) {
const { transaction } = options;
const listenHooksName = uiSchemaModel.getListenServerHooks('afterCreateSelf');
for (const listenHookName of listenHooksName) {
const hookFunc = this.hooks.get('afterCreateSelf')?.get(listenHookName);
await hookFunc({
model: uiSchemaModel,
transaction,
});
}
}
protected async afterCollectionDestroy(collectionModel, options) {
const { transaction } = options;
const collectionPath = collectionModel.get('name');
const listenSchemas = (await this.db.getRepository('ui_schemas').find({
filter: {
'attrs.collectionPath': collectionPath,
},
transaction,
})) as UiSchemaModel[];
for (const listenSchema of listenSchemas) {
const listenHooksName = listenSchema.getListenServerHooks('afterDestroyCollection');
for (const listenHookName of listenHooksName) {
const hookFunc = this.hooks.get('afterDestroyCollection')?.get(listenHookName);
await hookFunc({
model: listenSchema,
transaction,
});
}
}
}
protected async afterFieldDestroy(fieldModel, options) {
@ -32,6 +79,7 @@ export class ServerHooks {
const listenHooksName = listenSchema.getListenServerHooks('afterDestroyField');
for (const listenHookName of listenHooksName) {
const hookFunc = this.hooks.get('afterDestroyField')?.get(listenHookName);
await hookFunc({
model: listenSchema,
transaction,

View File

@ -24,10 +24,6 @@ export default class PluginUiSchema extends Plugin {
this.registerRepository();
db.on('ui_schemas.afterDefine', (model) => {
model.primaryKeyAttribute = 'uid';
});
db.on('ui_schemas.beforeCreate', function setUid(model) {
model.set('uid', model.get('x-uid'));
});