From 20a4e14d4bc1bae318a02b231374d6fad8054344 Mon Sep 17 00:00:00 2001 From: ChengLei Shao Date: Sun, 29 Dec 2024 08:29:41 +0800 Subject: [PATCH] fix: prevent creation of collection with existing name (#5962) * Fix: prevent creation of collection with existing name * fix: test * fix: test --- .../__tests__/collections.repository.test.ts | 34 +++++++++++++++++++ .../src/server/server.ts | 6 ++++ 2 files changed, 40 insertions(+) diff --git a/packages/plugins/@nocobase/plugin-data-source-main/src/server/__tests__/collections.repository.test.ts b/packages/plugins/@nocobase/plugin-data-source-main/src/server/__tests__/collections.repository.test.ts index 1650391393..d3438dd40c 100644 --- a/packages/plugins/@nocobase/plugin-data-source-main/src/server/__tests__/collections.repository.test.ts +++ b/packages/plugins/@nocobase/plugin-data-source-main/src/server/__tests__/collections.repository.test.ts @@ -31,6 +31,40 @@ describe('collections repository', () => { await app.destroy(); }); + it('should not create collection already exists', async () => { + db.collection({ + name: 'jobs', + fields: [ + { + type: 'string', + name: 'title', + }, + ], + }); + + await db.sync(); + + let err; + + try { + await Collection.repository.create({ + values: { + name: 'jobs', + fields: [ + { + type: 'string', + name: 'title', + }, + ], + }, + }); + } catch (e) { + err = e; + } + + expect(err).toBeTruthy(); + }); + it('should load through table with foreignKey', async () => { await Collection.repository.create({ values: { diff --git a/packages/plugins/@nocobase/plugin-data-source-main/src/server/server.ts b/packages/plugins/@nocobase/plugin-data-source-main/src/server/server.ts index c6e1e41c9a..b256d5a78e 100644 --- a/packages/plugins/@nocobase/plugin-data-source-main/src/server/server.ts +++ b/packages/plugins/@nocobase/plugin-data-source-main/src/server/server.ts @@ -71,6 +71,12 @@ export class PluginDataSourceMainServer extends Plugin { this.app.db.on('collections.beforeCreate', beforeCreateForViewCollection(this.db)); + this.app.db.on('collections.beforeCreate', async (model: CollectionModel, options) => { + if (this.app.db.getCollection(model.get('name')) && model.get('from') !== 'db2cm' && !model.get('isThrough')) { + throw new Error(`Collection named ${model.get('name')} already exists`); + } + }); + this.app.db.on( 'collections.afterSaveWithAssociations', async (model: CollectionModel, { context, transaction }) => {