71 lines
2.0 KiB
TypeScript
71 lines
2.0 KiB
TypeScript
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),
|
|
);
|
|
}
|
|
};
|
|
}
|