Commit d2c85b55 authored by lyf-coder's avatar lyf-coder
Browse files

fix(collection-manager): when del foreign key field, relate fields will be del too

parent 33f0df50
Showing with 83 additions and 1 deletion
+83 -1
import Database from '@nocobase/database';
import Database, { UpdateOptions } from '@nocobase/database';
export function afterCreateForForeignKeyField(db: Database) {
function generateFkOptions(collectionName: string, foreignKey: string) {
......@@ -104,6 +104,15 @@ export function afterCreateForForeignKeyField(db: Database) {
},
transaction,
});
} else {
const options = instance.get('options');
if (!options?.isThrough) {
options.isThrough = true;
instance.set('options', options);
await instance.save({
transaction,
});
}
}
const opts1 = generateFkOptions(through, foreignKey);
const opts2 = generateFkOptions(through, otherKey);
......
import Database, { FindOneOptions, FindOptions, Model } from '@nocobase/database';
import { Transaction } from 'sequelize';
async function destroyFields(db: Database, transaction: Transaction, fieldRecords: Model[]) {
const fieldsRepo = db.getRepository('fields');
for (const fieldRecord of fieldRecords) {
await fieldsRepo.destroy({
filter: {
name: fieldRecord.get('name'),
collectionName: fieldRecord.get('collectionName'),
},
transaction,
});
}
}
export function afterDestroyForForeignKeyField(db: Database) {
return async (model, opts) => {
const { transaction } = opts;
const options = model.get('options');
if (!options?.isForeignKey) {
return;
}
const collectionRepo = db.getRepository('collections');
const foreignKey = model.get('name');
const foreignKeyCollectionName = model.get('collectionName');
const collectionRecord = await collectionRepo.findOne({
filter: {
name: foreignKeyCollectionName,
},
transaction,
} as FindOneOptions);
const collectionOptions = collectionRecord.get('options');
const fieldsRepo = db.getRepository('fields');
if (collectionOptions?.isThrough) {
// through collection
const fieldRecords = await fieldsRepo.find({
filter: {
options: { through: foreignKeyCollectionName, foreignKey: foreignKey },
},
transaction,
} as FindOptions);
await destroyFields(db, transaction, fieldRecords);
} else {
await destroyFields(
db,
transaction,
await fieldsRepo.find({
filter: {
collectionName: foreignKeyCollectionName,
options: { foreignKey: foreignKey },
},
transaction,
} as FindOptions),
);
await destroyFields(
db,
transaction,
await fieldsRepo.find({
filter: {
options: { foreignKey: foreignKey, target: foreignKeyCollectionName },
},
transaction,
} as FindOptions),
);
}
};
}
......@@ -15,6 +15,7 @@ import {
beforeInitOptions
} from './hooks';
import { CollectionModel, FieldModel } from './models';
import {afterDestroyForForeignKeyField} from "./hooks/afterDestroyForForeignKeyField";
export class CollectionManagerPlugin extends Plugin {
......@@ -115,6 +116,7 @@ export class CollectionManagerPlugin extends Plugin {
this.app.db.on('fields.beforeDestroy', async (model, options) => {
await model.remove(options);
});
this.app.db.on('fields.afterDestroy',afterDestroyForForeignKeyField(this.app.db));
this.app.db.on('collections.beforeDestroy', async (model, options) => {
await model.remove(options);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment