From bc12f662e76c435bf385c62823259c626bcafe79 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Wed, 16 Apr 2025 08:12:39 -0400 Subject: [PATCH] feat: Resolve `parentFolder` when retrieving workflow (#14656) --- packages/cli/src/databases/entities/folder.ts | 2 +- .../cli/src/workflows/workflows.controller.ts | 2 +- .../workflows/workflows.controller.test.ts | 49 +++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/databases/entities/folder.ts b/packages/cli/src/databases/entities/folder.ts index a5db09ff28..eaa4aae774 100644 --- a/packages/cli/src/databases/entities/folder.ts +++ b/packages/cli/src/databases/entities/folder.ts @@ -23,7 +23,7 @@ export class Folder extends WithTimestampsAndStringId { @Column() name: string; - @Column({ nullable: true, select: false }) + @Column({ nullable: true }) parentFolderId: string | null; @ManyToOne(() => Folder, { nullable: true, onDelete: 'CASCADE' }) diff --git a/packages/cli/src/workflows/workflows.controller.ts b/packages/cli/src/workflows/workflows.controller.ts index 538a6c253a..5a6eb9cc9f 100644 --- a/packages/cli/src/workflows/workflows.controller.ts +++ b/packages/cli/src/workflows/workflows.controller.ts @@ -296,7 +296,7 @@ export class WorkflowsController { workflowId, req.user, ['workflow:read'], - { includeTags: !this.globalConfig.tags.disabled }, + { includeTags: !this.globalConfig.tags.disabled, includeParentFolder: true }, ); if (!workflow) { diff --git a/packages/cli/test/integration/workflows/workflows.controller.test.ts b/packages/cli/test/integration/workflows/workflows.controller.test.ts index ad14a40f49..ecaaf92553 100644 --- a/packages/cli/test/integration/workflows/workflows.controller.test.ts +++ b/packages/cli/test/integration/workflows/workflows.controller.test.ts @@ -513,6 +513,55 @@ describe('GET /workflows/:workflowId', () => { tags: [expect.objectContaining({ id: tag.id, name: tag.name })], }); }); + + test('should return parent folder', async () => { + const personalProject = await projectRepository.getPersonalProjectForUserOrFail(owner.id); + + const folder1 = await createFolder(personalProject, { name: 'Folder 1' }); + + const folder2 = await createFolder(personalProject, { + name: 'Folder 2', + parentFolder: folder1, + }); + + const workflow1 = await createWorkflow({ parentFolder: folder2 }, owner); + + const workflow2 = await createWorkflow({}, owner); + + const workflow3 = await createWorkflow({ parentFolder: folder1 }, owner); + + const workflowInNestedFolderWithGrantParent = await authOwnerAgent + .get(`/workflows/${workflow1.id}`) + .expect(200); + + expect(workflowInNestedFolderWithGrantParent.body.data).toMatchObject({ + parentFolder: expect.objectContaining({ + id: folder2.id, + name: folder2.name, + parentFolderId: folder1.id, + }), + }); + + const workflowInProjectRoot = await authOwnerAgent + .get(`/workflows/${workflow2.id}`) + .expect(200); + + expect(workflowInProjectRoot.body.data).toMatchObject({ + parentFolder: null, + }); + + const workflowInNestedFolder = await authOwnerAgent + .get(`/workflows/${workflow3.id}`) + .expect(200); + + expect(workflowInNestedFolder.body.data).toMatchObject({ + parentFolder: expect.objectContaining({ + id: folder1.id, + name: folder1.name, + parentFolderId: null, + }), + }); + }); }); describe('GET /workflows', () => {