From d777fede906e3ba782b94eaf486db57474434be4 Mon Sep 17 00:00:00 2001 From: ChengLei Shao Date: Thu, 13 Oct 2022 11:15:27 +0800 Subject: [PATCH] fix: single relation repository appends query issue (#901) (cherry picked from commit 20c147701571a14a8ac975287e761801789a8978) --- .../relation-repository/appends.test.ts | 64 +++++++++++++++++++ .../single-relation-repository.ts | 2 + packages/core/database/src/utils.ts | 8 +-- 3 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 packages/core/database/src/__tests__/relation-repository/appends.test.ts diff --git a/packages/core/database/src/__tests__/relation-repository/appends.test.ts b/packages/core/database/src/__tests__/relation-repository/appends.test.ts new file mode 100644 index 000000000..5d889b04e --- /dev/null +++ b/packages/core/database/src/__tests__/relation-repository/appends.test.ts @@ -0,0 +1,64 @@ +import Database, { BelongsToRepository, Collection, mockDatabase } from '@nocobase/database'; + +describe('appends', () => { + let db: Database; + + let User: Collection; + let Post: Collection; + + let A1: Collection; + let A2: Collection; + + afterEach(async () => { + await db.close(); + }); + + beforeEach(async () => { + db = mockDatabase(); + + User = db.collection({ + name: 'users', + fields: [ + { type: 'string', name: 'name' }, + { type: 'hasMany', name: 'posts' }, + ], + }); + + Post = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'title' }, + { + type: 'belongsTo', + name: 'user', + }, + ], + }); + + await db.sync(); + }); + + it('should find with appends', async () => { + await User.repository.create({ + values: { + name: 'u1', + posts: [ + { + title: 'p1', + }, + ], + }, + }); + + const p1 = await Post.repository.findOne({}); + + const repository = new BelongsToRepository(Post, 'user', p1['id']); + + const user = await repository.findOne({ + appends: ['posts'], + }); + + const data = user.toJSON(); + expect(data['posts'][0]['title']).toEqual('p1'); + }); +}); diff --git a/packages/core/database/src/relation-repository/single-relation-repository.ts b/packages/core/database/src/relation-repository/single-relation-repository.ts index a25057fed..bdd3a57c1 100644 --- a/packages/core/database/src/relation-repository/single-relation-repository.ts +++ b/packages/core/database/src/relation-repository/single-relation-repository.ts @@ -46,6 +46,7 @@ export abstract class SingleRelationRepository extends RelationRepository { async find(options?: SingleRelationFindOption): Promise | null> { const transaction = await this.getTransaction(options); + const findOptions = this.buildQueryOptions({ ...options, }); @@ -56,6 +57,7 @@ export abstract class SingleRelationRepository extends RelationRepository { if (findOptions?.include?.length > 0) { const templateModel = await sourceModel[getAccessor]({ ...findOptions, + includeIgnoreAttributes: false, transaction, attributes: [this.targetKey()], group: `${this.targetModel.name}.${this.targetKey()}`, diff --git a/packages/core/database/src/utils.ts b/packages/core/database/src/utils.ts index 627916f72..682514338 100644 --- a/packages/core/database/src/utils.ts +++ b/packages/core/database/src/utils.ts @@ -6,10 +6,6 @@ type HandleAppendsQueryOptions = { queryPromises: Array; }; -export function md5(value: string) { - return crypto.createHash('md5').update(value).digest('hex'); -} - export async function handleAppendsQuery(options: HandleAppendsQueryOptions) { const { templateModel, queryPromises } = options; @@ -47,3 +43,7 @@ export async function handleAppendsQuery(options: HandleAppendsQueryOptions) { return rows; } + +export function md5(value: string) { + return crypto.createHash('md5').update(value).digest('hex'); +}