fix: use database hook to trigger add createdBy/updatedBy fields

This commit is contained in:
chenos 2020-12-18 15:50:03 +08:00
parent 272b64b81b
commit 184adb924d
3 changed files with 35 additions and 20 deletions

View File

@ -62,7 +62,7 @@ describe('user fields', () => {
});
// TODO(bug): 重复添加字段不能与 fields 表同步,应做到同步
it.only('add model and then add createdBy/updatedBy field', async () => {
it('add model and then add createdBy/updatedBy field', async () => {
const Collection = db.getModel('collections');
const collection = await Collection.import({
name: 'posts',

View File

@ -1,4 +1,4 @@
function makeOptions(type: string, options: any) {
export function makeOptions(type: string, options: any) {
if (!options) {
return;
}
@ -21,22 +21,30 @@ function makeOptions(type: string, options: any) {
};
}
export default async function(model, options) {
const { database } = model;
const tableName = model.get('name') as string;
const table = database.getTable(tableName);
export default async function(table) {
const { createdBy, updatedBy } = table.getOptions();
const fieldsToMake = { createdBy, updatedBy };
const addedFields = Object.keys(fieldsToMake)
Object.keys(fieldsToMake)
.filter(type => Boolean(fieldsToMake[type]))
.map(type => table.addField(makeOptions(type, fieldsToMake[type])));
if (addedFields.length) {
await table.sync({
force: false,
alter: {
drop: false,
}
});
}
}
// export default async function(model, options) {
// const { database } = model;
// const tableName = model.get('name') as string;
// const table = database.getTable(tableName);
// const { createdBy, updatedBy } = table.getOptions();
// const fieldsToMake = { createdBy, updatedBy };
// const addedFields = Object.keys(fieldsToMake)
// .filter(type => Boolean(fieldsToMake[type]))
// .map(type => table.addField(makeOptions(type, fieldsToMake[type])));
// if (addedFields.length) {
// await table.sync({
// force: false,
// alter: {
// drop: false,
// }
// });
// }
// }

View File

@ -4,13 +4,12 @@ import Database, { registerFields } from '@nocobase/database';
import Resourcer from '@nocobase/resourcer';
import * as fields from './fields';
import hooks from './hooks';
// import hooks from './hooks';
import login from './actions/login';
import register from './actions/register';
import logout from './actions/logout';
import check from './actions/check';
import { makeOptions } from './hooks/collection-after-create';
export default async function (options = {}) {
const database: Database = this.database;
@ -22,7 +21,15 @@ export default async function (options = {}) {
directory: path.resolve(__dirname, 'collections'),
});
hooks.call(this);
database.addHook('afterTableInit', (table) => {
const { createdBy, updatedBy } = table.getOptions();
const fieldsToMake = { createdBy, updatedBy };
Object.keys(fieldsToMake)
.filter(type => Boolean(fieldsToMake[type]))
.map(type => table.addField(makeOptions(type, fieldsToMake[type])));
});
// hooks.call(this);
resourcer.registerActionHandlers({
'users:login': login,