feat: removeSchema Hook with params

This commit is contained in:
Chareice 2022-02-10 20:28:27 +08:00 committed by chenos
parent 6013b4d274
commit 34f33844d5
6 changed files with 73 additions and 70 deletions

View File

@ -92,7 +92,7 @@ describe('server hooks', () => {
type: 'onCollectionFieldDestroy', type: 'onCollectionFieldDestroy',
collection: 'posts', collection: 'posts',
field: 'name', field: 'name',
method: 'removeEmptyParents', method: 'removeSchema',
}, },
], ],
}, },
@ -108,7 +108,11 @@ describe('server hooks', () => {
type: 'onCollectionFieldDestroy', type: 'onCollectionFieldDestroy',
collection: 'posts', collection: 'posts',
field: 'title', field: 'title',
method: 'removeEmptyParents', method: 'removeSchema',
params: {
breakComponent: 'Grid',
removeEmptyParents: true,
},
}, },
], ],
}, },
@ -130,7 +134,11 @@ describe('server hooks', () => {
type: 'onCollectionFieldDestroy', type: 'onCollectionFieldDestroy',
collection: 'posts', collection: 'posts',
field: 'intro', field: 'intro',
method: 'removeEmptyParents', method: 'removeSchema',
params: {
breakComponent: 'Grid',
removeEmptyParents: true,
},
}, },
], ],
}, },
@ -184,7 +192,7 @@ describe('server hooks', () => {
{ {
type: 'onCollectionDestroy', type: 'onCollectionDestroy',
collection: 'posts', collection: 'posts',
method: 'remove', method: 'removeSchema',
}, },
], ],
}, },

View File

@ -227,6 +227,54 @@ export default class UiSchemaRepository extends Repository {
); );
} }
protected async isSingleChild(uid, transaction) {
const db = this.database;
const parent = await db.getRepository('ui_schema_tree_path').findOne({
filter: {
descendant: uid,
depth: 1,
},
});
const countResult = await db.sequelize.query(
`SELECT COUNT(*) FROM ${
db.getCollection('ui_schema_tree_path').model.tableName
} where ancestor = :ancestor and depth = 1`,
{
replacements: {
ancestor: parent.get('ancestor'),
},
type: 'SELECT',
transaction,
},
);
const parentChildrenCount = countResult[0]['count'];
if (parentChildrenCount == 1) {
return parent.get('ancestor') as string;
}
return null;
}
async removeEmptyParents(options: TransactionAble & { uid: string; breakComponent?: string }) {
const { transaction, uid, breakComponent } = options;
const removeParent = async (nodeUid: string) => {
const parentUid = await this.isSingleChild(nodeUid, transaction);
if (parentUid) {
await removeParent(parentUid);
} else {
await this.remove(nodeUid, { transaction });
}
};
await removeParent(uid);
}
async remove(uid: string, options?: TransactionAble) { async remove(uid: string, options?: TransactionAble) {
let handleTransaction: boolean = true; let handleTransaction: boolean = true;
let transaction; let transaction;

View File

@ -1,3 +1,9 @@
const hooks = [require('./removeEmptyParents').default, require('./remove').default]; import { hookFactory } from './factory';
import { removeSchema } from './removeSchema';
const hooks = [
hookFactory('onCollectionDestroy', 'removeSchema', removeSchema),
hookFactory('onCollectionFieldDestroy', 'removeSchema', removeSchema),
];
export { hooks }; export { hooks };

View File

@ -1,9 +0,0 @@
import { hookFactory } from './factory';
import { UiSchemaRepository } from '@nocobase/plugin-ui-schema-storage';
async function remove({ schemaInstance, options, db }) {
const uiSchemaRepository: UiSchemaRepository = db.getRepository('ui_schemas');
await uiSchemaRepository.remove(schemaInstance.get('uid'));
}
export default hookFactory('onCollectionDestroy', 'remove', remove);

View File

@ -1,55 +0,0 @@
import { UiSchemaRepository } from '@nocobase/plugin-ui-schema-storage';
import { hookFactory } from './factory';
// given a child uid, if it is a single child ,return its parent
async function isSingleChild(uid, db, transaction) {
const parent = await db.getRepository('ui_schema_tree_path').findOne({
filter: {
descendant: uid,
depth: 1,
},
});
const countResult = await db.sequelize.query(
`SELECT COUNT(*) FROM ${
db.getCollection('ui_schema_tree_path').model.tableName
} where ancestor = :ancestor and depth = 1`,
{
replacements: {
ancestor: parent.get('ancestor'),
},
type: 'SELECT',
transaction,
},
);
const parentChildrenCount = countResult[0]['count'];
if (parentChildrenCount == 1) {
return parent.get('ancestor');
}
return null;
}
async function removeEmptyParents({ schemaInstance, options, db }) {
const { transaction } = options;
const uiSchemaRepository: UiSchemaRepository = db.getRepository('ui_schemas');
const uid = schemaInstance.get('uid');
// find parent uid
const parentUid = await isSingleChild(uid, db, transaction);
if (parentUid) {
const rowUid = await isSingleChild(parentUid, db, transaction);
if (rowUid) {
await uiSchemaRepository.remove(rowUid, { transaction });
} else {
await uiSchemaRepository.remove(parentUid, { transaction });
}
} else {
await uiSchemaRepository.remove(uid, { transaction });
}
}
export default hookFactory('onCollectionFieldDestroy', 'removeEmptyParents', removeEmptyParents);

View File

@ -116,7 +116,12 @@ export class ServerHooks {
const hookFunc = this.hooks.get(hookRecord.get('type') as HookType)?.get(hoodMethodName); const hookFunc = this.hooks.get(hookRecord.get('type') as HookType)?.get(hoodMethodName);
if (hookFunc) { if (hookFunc) {
await hookFunc({ ...hooksArgs, schemaInstance: (<any>hookRecord).uiSchema, db: this.db }); await hookFunc({
...hooksArgs,
schemaInstance: (<any>hookRecord).uiSchema,
db: this.db,
params: hookRecord.get('params'),
});
} }
} }
} }