feat: server hooks afterDestroyCollection && afterCreateSelf
This commit is contained in:
parent
3e1cad643b
commit
41456b562e
@ -18,7 +18,7 @@ describe('server hooks', () => {
|
|||||||
'x-component': 'Table',
|
'x-component': 'Table',
|
||||||
'x-collection': 'posts',
|
'x-collection': 'posts',
|
||||||
'x-server-hooks': {
|
'x-server-hooks': {
|
||||||
afterDestroyCollection: ['aaa'],
|
afterDestroyCollection: ['onCollectionDestroy'],
|
||||||
},
|
},
|
||||||
properties: {
|
properties: {
|
||||||
col1: {
|
col1: {
|
||||||
@ -85,7 +85,7 @@ describe('server hooks', () => {
|
|||||||
expect(nodeFieldAttr.get('collectionPath')).toEqual('posts.title');
|
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({
|
const PostModel = await db.getRepository('collections').create({
|
||||||
values: {
|
values: {
|
||||||
name: 'posts',
|
name: 'posts',
|
||||||
@ -118,4 +118,61 @@ describe('server hooks', () => {
|
|||||||
|
|
||||||
expect(hookFn).toHaveBeenCalled();
|
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();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Database } from '@nocobase/database';
|
import { Database } from '@nocobase/database';
|
||||||
import { UiSchemaModel } from '../model';
|
import { UiSchemaModel } from '../model';
|
||||||
|
|
||||||
export type HookType = 'afterDestroyField';
|
export type HookType = 'afterDestroyField' | 'afterDestroyCollection' | 'afterCreateSelf';
|
||||||
|
|
||||||
export class ServerHooks {
|
export class ServerHooks {
|
||||||
hooks = new Map<HookType, Map<string, any>>();
|
hooks = new Map<HookType, Map<string, any>>();
|
||||||
@ -14,6 +14,53 @@ export class ServerHooks {
|
|||||||
this.db.on('fields.afterDestroy', async (model, options) => {
|
this.db.on('fields.afterDestroy', async (model, options) => {
|
||||||
await this.afterFieldDestroy(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) {
|
protected async afterFieldDestroy(fieldModel, options) {
|
||||||
@ -32,6 +79,7 @@ export class ServerHooks {
|
|||||||
const listenHooksName = listenSchema.getListenServerHooks('afterDestroyField');
|
const listenHooksName = listenSchema.getListenServerHooks('afterDestroyField');
|
||||||
for (const listenHookName of listenHooksName) {
|
for (const listenHookName of listenHooksName) {
|
||||||
const hookFunc = this.hooks.get('afterDestroyField')?.get(listenHookName);
|
const hookFunc = this.hooks.get('afterDestroyField')?.get(listenHookName);
|
||||||
|
|
||||||
await hookFunc({
|
await hookFunc({
|
||||||
model: listenSchema,
|
model: listenSchema,
|
||||||
transaction,
|
transaction,
|
||||||
|
@ -24,10 +24,6 @@ export default class PluginUiSchema extends Plugin {
|
|||||||
|
|
||||||
this.registerRepository();
|
this.registerRepository();
|
||||||
|
|
||||||
db.on('ui_schemas.afterDefine', (model) => {
|
|
||||||
model.primaryKeyAttribute = 'uid';
|
|
||||||
});
|
|
||||||
|
|
||||||
db.on('ui_schemas.beforeCreate', function setUid(model) {
|
db.on('ui_schemas.beforeCreate', function setUid(model) {
|
||||||
model.set('uid', model.get('x-uid'));
|
model.set('uid', model.get('x-uid'));
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user