tachybase_todo/packages/plugins/collection-manager/src/hooks/beforeCreateForReverseField.ts
ChengLei Shao 83cc19a013
fix: reference options sync (#1061)
* fix: sync onDelete options between field and reverseField

* feat: reference compatibility
2022-11-10 21:28:33 +08:00

48 lines
1.5 KiB
TypeScript

import Database from '@nocobase/database';
export function beforeCreateForReverseField(db: Database) {
return async (model, { transaction }) => {
const Field = db.getCollection('fields');
const reverseKey = model.get('reverseKey');
if (!reverseKey) {
return;
}
const reverse = await Field.model.findByPk(reverseKey, { transaction });
model.set('collectionName', reverse.get('target'));
model.set('target', reverse.get('collectionName'));
if (reverse.get('onDelete')) {
model.set('onDelete', reverse.get('onDelete'));
}
const reverseType = reverse.get('type') as any;
if (['hasMany', 'hasOne'].includes(reverseType)) {
model.set('type', 'belongsTo');
model.set('targetKey', reverse.get('sourceKey'));
model.set('foreignKey', reverse.get('foreignKey'));
model.set('sourceKey', reverse.get('targetKey'));
}
if (['belongsTo'].includes(reverseType)) {
if (!model.get('type')) {
model.set('type', 'hasMany');
}
model.set('sourceKey', reverse.get('targetKey'));
model.set('foreignKey', reverse.get('foreignKey'));
model.set('targetKey', reverse.get('sourceKey'));
}
if (['belongsToMany'].includes(reverseType)) {
model.set('type', 'belongsToMany');
model.set('through', reverse.get('through'));
model.set('sourceKey', reverse.get('targetKey'));
model.set('foreignKey', reverse.get('otherKey'));
model.set('targetKey', reverse.get('sourceKey'));
model.set('otherKey', reverse.get('foreignKey'));
}
};
}