From 258f4e980d2e5ce4622b7ace7b0278134df1fa60 Mon Sep 17 00:00:00 2001 From: ChengLei Shao Date: Sat, 6 May 2023 14:28:13 +0800 Subject: [PATCH] fix: list trees (#1810) * fix: list trees * fix: test --- .../adjacency-list-repository.ts | 8 +++ .../src/__tests__/http-api/tree.test.ts | 72 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 packages/plugins/collection-manager/src/__tests__/http-api/tree.test.ts diff --git a/packages/core/database/src/tree-repository/adjacency-list-repository.ts b/packages/core/database/src/tree-repository/adjacency-list-repository.ts index 5681f35fb..7762ce394 100644 --- a/packages/core/database/src/tree-repository/adjacency-list-repository.ts +++ b/packages/core/database/src/tree-repository/adjacency-list-repository.ts @@ -52,6 +52,7 @@ export class AdjacencyListRepository extends Repository { if (!nodeMap[`${node[foreignKey]}`]) { nodeMap[`${node[foreignKey]}`] = []; } + nodeMap[`${node[foreignKey]}`].push(node); }); @@ -90,8 +91,15 @@ export class AdjacencyListRepository extends Repository { delete node[childrenKey]; } } else { + // patch for sequelize toJSON + if (node._options.includeNames && !node._options.includeNames.includes(childrenKey)) { + node._options.includeNames.push(childrenKey); + } + node.setDataValue('__index', `${index}`); + children = node.getDataValue(childrenKey); + if (children.length === 0) { node.setDataValue(childrenKey, undefined); } diff --git a/packages/plugins/collection-manager/src/__tests__/http-api/tree.test.ts b/packages/plugins/collection-manager/src/__tests__/http-api/tree.test.ts new file mode 100644 index 000000000..ed5ddb4af --- /dev/null +++ b/packages/plugins/collection-manager/src/__tests__/http-api/tree.test.ts @@ -0,0 +1,72 @@ +import { MockServer } from '@nocobase/test'; +import { Database } from '@nocobase/database'; +import { createApp } from '../index'; +import lodash from 'lodash'; + +describe('tree', () => { + let app: MockServer; + let agent; + + let db: Database; + beforeEach(async () => { + app = await createApp(); + + agent = app.agent(); + db = app.db; + }); + + afterEach(async () => { + await app.destroy(); + }); + + it('should list tree', async () => { + await db.getRepository('collections').create({ + values: { + name: 'categories', + tree: 'adjacency-list', + fields: [ + { type: 'string', name: 'name' }, + { + type: 'belongsTo', + name: 'parent', + foreignKey: 'parent_id', + treeParent: true, + target: 'categories', + }, + { + type: 'hasMany', + name: 'children', + foreignKey: 'parent_id', + treeChildren: true, + target: 'categories', + }, + ], + }, + context: {}, + }); + + const c1 = await db.getRepository('categories').create({ + values: { name: 'c1' }, + }); + + await db.getRepository('categories').create({ + values: [ + { + name: 'c2', + parent: { + name: 'c1', + id: c1.get('id'), + }, + }, + ], + }); + + const listResponse = await agent.resource('categories').list({ + appends: ['parent'], + }); + + expect(listResponse.statusCode).toBe(200); + + console.log(listResponse.body); + }); +});