From 524103f6b3a220a1aece96dde0920206f8e55ffb Mon Sep 17 00:00:00 2001 From: chenos Date: Tue, 8 Dec 2020 09:01:15 +0800 Subject: [PATCH] fix: field migrate bug when import collection options --- .../base.test.ts} | 6 +- .../src/__tests__/models/collection.test.ts | 60 +++++++++++++++++++ .../src/hooks/fields-after-bulk-update.ts | 20 +++++++ .../plugin-collections/src/hooks/index.ts | 4 +- .../plugin-collections/src/models/field.ts | 3 + packages/plugin-collections/src/server.ts | 2 +- 6 files changed, 90 insertions(+), 5 deletions(-) rename packages/plugin-collections/src/__tests__/{base-model.test.ts => models/base.test.ts} (98%) create mode 100644 packages/plugin-collections/src/__tests__/models/collection.test.ts create mode 100644 packages/plugin-collections/src/hooks/fields-after-bulk-update.ts diff --git a/packages/plugin-collections/src/__tests__/base-model.test.ts b/packages/plugin-collections/src/__tests__/models/base.test.ts similarity index 98% rename from packages/plugin-collections/src/__tests__/base-model.test.ts rename to packages/plugin-collections/src/__tests__/models/base.test.ts index abb7662ee..e9870cdfc 100644 --- a/packages/plugin-collections/src/__tests__/base-model.test.ts +++ b/packages/plugin-collections/src/__tests__/models/base.test.ts @@ -1,9 +1,9 @@ import Database, { ModelCtor } from '@nocobase/database'; -import { getDatabase } from '.'; -import BaseModel from '../models/base'; +import { getDatabase } from '../'; +import BaseModel from '../../models/base'; import _ from 'lodash'; -describe('base model', () => { +describe('models.base', () => { let database: Database; let TestModel: ModelCtor; let test: BaseModel; diff --git a/packages/plugin-collections/src/__tests__/models/collection.test.ts b/packages/plugin-collections/src/__tests__/models/collection.test.ts new file mode 100644 index 000000000..598e23c72 --- /dev/null +++ b/packages/plugin-collections/src/__tests__/models/collection.test.ts @@ -0,0 +1,60 @@ +import { Agent, getAgent, getApp } from '../'; +import { Application } from '@nocobase/server'; +import * as types from '../../interfaces/types'; +jest.setTimeout(30000); +describe('models.collection', () => { + let app: Application; + let agent: Agent; + + beforeEach(async () => { + app = await getApp(); + agent = getAgent(app); + }); + + afterEach(() => app.database.close()); + + it.only('import', async () => { + await app.database.getModel('collections').import({ + title: '示例', + name: 'examples', + showInDataMenu: true, + fields: [ + { + interface: 'string', + title: '单行文本', + name: 'string', + component: { + showInTable: true, + showInDetail: true, + showInForm: true, + }, + }, + { + interface: 'textarea', + title: '多行文本', + name: 'textarea', + component: { + showInTable: true, + showInDetail: true, + showInForm: true, + }, + }, + ], + }, { + // migrate: false, + }); + const table = app.database.getTable('examples'); + expect(table).toBeDefined(); + expect(table.getFields().size).toBe(2); + await table.sync(); + const Example = app.database.getModel('examples'); + const example = await Example.create({ + string: 'string1', + textarea: 'textarea1', + }); + expect(example.toJSON()).toMatchObject({ + string: 'string1', + textarea: 'textarea1', + }); + }); +}); diff --git a/packages/plugin-collections/src/hooks/fields-after-bulk-update.ts b/packages/plugin-collections/src/hooks/fields-after-bulk-update.ts new file mode 100644 index 000000000..1af384d6d --- /dev/null +++ b/packages/plugin-collections/src/hooks/fields-after-bulk-update.ts @@ -0,0 +1,20 @@ +import { Model, ModelCtor } from '@nocobase/database'; + +/** + * 字段导入是先 create 再 bulk update 处理 fk 的 + * + * @param options + */ +export default async function (options: any = {}) { + const { migrate = true, where = {}, attributes: { collection_name }, transaction } = options; + if (migrate && collection_name) { + const Field = this.database.getModel('fields') as ModelCtor; + const fields = await Field.findAll({ + where, + transaction, + }); + for (const field of fields) { + await field.migrate(); + } + } +} diff --git a/packages/plugin-collections/src/hooks/index.ts b/packages/plugin-collections/src/hooks/index.ts index bbb882a22..b2d3e5acd 100644 --- a/packages/plugin-collections/src/hooks/index.ts +++ b/packages/plugin-collections/src/hooks/index.ts @@ -4,6 +4,7 @@ import collectionsAfterCreate from './collections-after-create'; import fieldsBeforeValidate from './fields-before-validate'; import fieldsAfterCreate from './fields-after-create'; import generateName from './generateName'; +import fieldsAfterBulkUpdate from './fields-after-bulk-update'; export default { collections: { @@ -12,7 +13,8 @@ export default { }, fields: { beforeValidate: fieldsBeforeValidate, - afterCreate: fieldsAfterCreate + afterCreate: fieldsAfterCreate, + afterBulkUpdate: fieldsAfterBulkUpdate, }, actions: { beforeValidate: generateName diff --git a/packages/plugin-collections/src/models/field.ts b/packages/plugin-collections/src/models/field.ts index 9cb7ecab2..3e8270146 100644 --- a/packages/plugin-collections/src/models/field.ts +++ b/packages/plugin-collections/src/models/field.ts @@ -36,6 +36,9 @@ export class FieldModel extends BaseModel { } async migrate() { + if (!this.get('collection_name')) { + return false; + } const table = this.database.getTable(this.get('collection_name')); table.addField(await this.getOptions()); await table.sync({ diff --git a/packages/plugin-collections/src/server.ts b/packages/plugin-collections/src/server.ts index 90383299e..ab66b4d54 100644 --- a/packages/plugin-collections/src/server.ts +++ b/packages/plugin-collections/src/server.ts @@ -26,7 +26,7 @@ export default async function (this: Application, options = {}) { // 加载数据库表 collections 中已经保存的表配置 // 如果未 sync 可能报错 // TODO collections sync - await database.getModel('collections').load(); + // await database.getModel('collections').load(); } catch (error) { } }