n8n 1.80.4 → 1.81.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/active-executions.d.ts +1 -0
  2. package/dist/active-executions.js +9 -0
  3. package/dist/active-executions.js.map +1 -1
  4. package/dist/build.tsbuildinfo +1 -1
  5. package/dist/commands/base-command.d.ts +1 -2
  6. package/dist/commands/base-command.js +9 -21
  7. package/dist/commands/base-command.js.map +1 -1
  8. package/dist/config/index.d.ts +3 -0
  9. package/dist/config/schema.d.ts +8 -0
  10. package/dist/config/schema.js +8 -0
  11. package/dist/config/schema.js.map +1 -1
  12. package/dist/controllers/ai.controller.js +1 -2
  13. package/dist/controllers/ai.controller.js.map +1 -1
  14. package/dist/credentials/credentials.controller.d.ts +4 -4
  15. package/dist/credentials/credentials.controller.js +16 -8
  16. package/dist/credentials/credentials.controller.js.map +1 -1
  17. package/dist/credentials/credentials.service.d.ts +19 -3
  18. package/dist/credentials/credentials.service.ee.d.ts +1 -2
  19. package/dist/credentials/credentials.service.ee.js +5 -3
  20. package/dist/credentials/credentials.service.ee.js.map +1 -1
  21. package/dist/credentials/credentials.service.js +21 -13
  22. package/dist/credentials/credentials.service.js.map +1 -1
  23. package/dist/credentials-helper.d.ts +2 -2
  24. package/dist/credentials-helper.js.map +1 -1
  25. package/dist/credentials-overwrites.d.ts +1 -1
  26. package/dist/credentials-overwrites.js.map +1 -1
  27. package/dist/databases/entities/folder-tag-mapping.d.ts +8 -0
  28. package/dist/databases/entities/folder-tag-mapping.js +38 -0
  29. package/dist/databases/entities/folder-tag-mapping.js.map +1 -0
  30. package/dist/databases/entities/folder.d.ts +4 -1
  31. package/dist/databases/entities/folder.js +1 -1
  32. package/dist/databases/entities/folder.js.map +1 -1
  33. package/dist/databases/entities/index.d.ts +2 -0
  34. package/dist/databases/entities/index.js +2 -0
  35. package/dist/databases/entities/index.js.map +1 -1
  36. package/dist/databases/entities/tag-entity.d.ts +2 -0
  37. package/dist/databases/entities/tag-entity.js +4 -0
  38. package/dist/databases/entities/tag-entity.js.map +1 -1
  39. package/dist/databases/migrations/mysqldb/1731582748663-MigrateTestDefinitionKeyToString.js +4 -0
  40. package/dist/databases/migrations/mysqldb/1731582748663-MigrateTestDefinitionKeyToString.js.map +1 -1
  41. package/dist/databases/migrations/mysqldb/1732271325258-CreateTestMetricTable.d.ts +5 -0
  42. package/dist/databases/migrations/mysqldb/1732271325258-CreateTestMetricTable.js +34 -0
  43. package/dist/databases/migrations/mysqldb/1732271325258-CreateTestMetricTable.js.map +1 -0
  44. package/dist/databases/migrations/mysqldb/1736172058779-AddStatsColumnsToTestRun.d.ts +5 -0
  45. package/dist/databases/migrations/mysqldb/1736172058779-AddStatsColumnsToTestRun.js +22 -0
  46. package/dist/databases/migrations/mysqldb/1736172058779-AddStatsColumnsToTestRun.js.map +1 -0
  47. package/dist/databases/migrations/mysqldb/1739873751194-FixTestDefinitionPrimaryKey.d.ts +4 -0
  48. package/dist/databases/migrations/mysqldb/1739873751194-FixTestDefinitionPrimaryKey.js +22 -0
  49. package/dist/databases/migrations/mysqldb/1739873751194-FixTestDefinitionPrimaryKey.js.map +1 -0
  50. package/dist/databases/migrations/mysqldb/index.js +4 -2
  51. package/dist/databases/migrations/mysqldb/index.js.map +1 -1
  52. package/dist/databases/repositories/folder.repository.d.ts +23 -2
  53. package/dist/databases/repositories/folder.repository.js +154 -0
  54. package/dist/databases/repositories/folder.repository.js.map +1 -1
  55. package/dist/databases/repositories/shared-credentials.repository.d.ts +12 -1
  56. package/dist/databases/repositories/shared-credentials.repository.js +29 -2
  57. package/dist/databases/repositories/shared-credentials.repository.js.map +1 -1
  58. package/dist/databases/repositories/workflow.repository.d.ts +33 -5
  59. package/dist/databases/repositories/workflow.repository.js +168 -20
  60. package/dist/databases/repositories/workflow.repository.js.map +1 -1
  61. package/dist/deprecation/deprecation.service.d.ts +0 -1
  62. package/dist/deprecation/deprecation.service.js +18 -15
  63. package/dist/deprecation/deprecation.service.js.map +1 -1
  64. package/dist/evaluation.ee/metrics.controller.d.ts +3 -1
  65. package/dist/evaluation.ee/metrics.controller.js +13 -3
  66. package/dist/evaluation.ee/metrics.controller.js.map +1 -1
  67. package/dist/evaluation.ee/test-definition.service.ee.d.ts +3 -1
  68. package/dist/evaluation.ee/test-definition.service.ee.js +25 -8
  69. package/dist/evaluation.ee/test-definition.service.ee.js.map +1 -1
  70. package/dist/evaluation.ee/test-runner/test-runner.service.ee.js +13 -2
  71. package/dist/evaluation.ee/test-runner/test-runner.service.ee.js.map +1 -1
  72. package/dist/evaluation.ee/test-runs.controller.ee.d.ts +3 -1
  73. package/dist/evaluation.ee/test-runs.controller.ee.js +7 -3
  74. package/dist/evaluation.ee/test-runs.controller.ee.js.map +1 -1
  75. package/dist/external-hooks.js +1 -1
  76. package/dist/external-hooks.js.map +1 -1
  77. package/dist/interfaces.d.ts +2 -0
  78. package/dist/interfaces.js.map +1 -1
  79. package/dist/license.d.ts +1 -0
  80. package/dist/license.js +21 -21
  81. package/dist/license.js.map +1 -1
  82. package/dist/metrics/prometheus-metrics.service.js +18 -8
  83. package/dist/metrics/prometheus-metrics.service.js.map +1 -1
  84. package/dist/middlewares/list-query/dtos/workflow.filter.dto.d.ts +1 -0
  85. package/dist/middlewares/list-query/dtos/workflow.filter.dto.js +6 -0
  86. package/dist/middlewares/list-query/dtos/workflow.filter.dto.js.map +1 -1
  87. package/dist/middlewares/list-query/dtos/workflow.select.dto.js +1 -0
  88. package/dist/middlewares/list-query/dtos/workflow.select.dto.js.map +1 -1
  89. package/dist/requests.d.ts +1 -4
  90. package/dist/services/frontend.service.d.ts +2 -3
  91. package/dist/services/frontend.service.js +6 -5
  92. package/dist/services/frontend.service.js.map +1 -1
  93. package/dist/webhooks/waiting-forms.d.ts +0 -1
  94. package/dist/webhooks/waiting-forms.js +2 -25
  95. package/dist/webhooks/waiting-forms.js.map +1 -1
  96. package/dist/webhooks/webhook-helpers.d.ts +2 -0
  97. package/dist/webhooks/webhook-helpers.js +46 -37
  98. package/dist/webhooks/webhook-helpers.js.map +1 -1
  99. package/dist/workflow-runner.js +1 -0
  100. package/dist/workflow-runner.js.map +1 -1
  101. package/dist/workflows/workflow.request.d.ts +1 -5
  102. package/dist/workflows/workflow.service.d.ts +11 -2
  103. package/dist/workflows/workflow.service.ee.d.ts +6 -2
  104. package/dist/workflows/workflow.service.ee.js +19 -4
  105. package/dist/workflows/workflow.service.ee.js.map +1 -1
  106. package/dist/workflows/workflow.service.js +48 -14
  107. package/dist/workflows/workflow.service.js.map +1 -1
  108. package/dist/workflows/workflows.controller.d.ts +6 -6
  109. package/dist/workflows/workflows.controller.js +7 -8
  110. package/dist/workflows/workflows.controller.js.map +1 -1
  111. package/package.json +12 -11
  112. package/templates/form-trigger-completion.handlebars +36 -3
  113. package/templates/form-trigger.handlebars +9 -15
@@ -13,10 +13,164 @@ exports.FolderRepository = void 0;
13
13
  const di_1 = require("@n8n/di");
14
14
  const typeorm_1 = require("@n8n/typeorm");
15
15
  const folder_1 = require("../entities/folder");
16
+ const folder_tag_mapping_1 = require("../entities/folder-tag-mapping");
17
+ const tag_entity_1 = require("../entities/tag-entity");
16
18
  let FolderRepository = class FolderRepository extends typeorm_1.Repository {
17
19
  constructor(dataSource) {
18
20
  super(folder_1.Folder, dataSource.manager);
19
21
  }
22
+ async getManyAndCount(options = {}) {
23
+ const query = this.getManyQuery(options);
24
+ return await query.getManyAndCount();
25
+ }
26
+ async getMany(options = {}) {
27
+ const query = this.getManyQuery(options);
28
+ return await query.getMany();
29
+ }
30
+ getManyQuery(options = {}) {
31
+ const query = this.createQueryBuilder('folder');
32
+ this.applySelections(query, options.select);
33
+ this.applyFilters(query, options.filter);
34
+ this.applySorting(query, options.sortBy);
35
+ this.applyPagination(query, options);
36
+ return query;
37
+ }
38
+ applySelections(query, select) {
39
+ if (select) {
40
+ this.applyCustomSelect(query, select);
41
+ }
42
+ else {
43
+ this.applyDefaultSelect(query);
44
+ }
45
+ }
46
+ applyDefaultSelect(query) {
47
+ query
48
+ .leftJoinAndSelect('folder.homeProject', 'homeProject')
49
+ .leftJoinAndSelect('folder.parentFolder', 'parentFolder')
50
+ .leftJoinAndSelect('folder.tags', 'tags')
51
+ .loadRelationCountAndMap('folder.workflowsCount', 'folder.workflows')
52
+ .select([
53
+ 'folder',
54
+ ...this.getProjectFields('homeProject'),
55
+ ...this.getTagFields(),
56
+ ...this.getParentFolderFields('parentFolder'),
57
+ ]);
58
+ }
59
+ applyCustomSelect(query, select) {
60
+ const selections = ['folder.id'];
61
+ this.addBasicFields(selections, select);
62
+ this.addRelationFields(query, selections, select);
63
+ query.select(selections);
64
+ }
65
+ addBasicFields(selections, select) {
66
+ if (select?.name)
67
+ selections.push('folder.name');
68
+ if (select?.createdAt)
69
+ selections.push('folder.createdAt');
70
+ if (select?.updatedAt)
71
+ selections.push('folder.updatedAt');
72
+ }
73
+ addRelationFields(query, selections, select) {
74
+ if (select?.project) {
75
+ query.leftJoin('folder.homeProject', 'homeProject');
76
+ selections.push(...this.getProjectFields('homeProject'));
77
+ }
78
+ if (select?.tags) {
79
+ query.leftJoin('folder.tags', 'tags').addOrderBy('tags.createdAt', 'ASC');
80
+ selections.push(...this.getTagFields());
81
+ }
82
+ if (select?.parentFolder) {
83
+ query.leftJoin('folder.parentFolder', 'parentFolder');
84
+ selections.push(...this.getParentFolderFields('parentFolder'));
85
+ }
86
+ if (select?.workflowsCount) {
87
+ query.loadRelationCountAndMap('folder.workflowsCount', 'folder.workflows');
88
+ }
89
+ }
90
+ getProjectFields(alias) {
91
+ return [`${alias}.id`, `${alias}.name`, `${alias}.type`, `${alias}.icon`];
92
+ }
93
+ getTagFields() {
94
+ return ['tags.id', 'tags.name'];
95
+ }
96
+ getParentFolderFields(alias) {
97
+ return [`${alias}.id`, `${alias}.name`];
98
+ }
99
+ applyFilters(query, filter) {
100
+ if (!filter)
101
+ return;
102
+ this.applyBasicFilters(query, filter);
103
+ this.applyTagsFilter(query, Array.isArray(filter?.tags) ? filter.tags : undefined);
104
+ }
105
+ applyBasicFilters(query, filter) {
106
+ if (filter?.folderIds && Array.isArray(filter.folderIds)) {
107
+ query.andWhere('folder.id IN (:...folderIds)', {
108
+ folderIds: !filter?.folderIds.length ? [''] : filter?.folderIds,
109
+ });
110
+ }
111
+ if (filter?.projectId) {
112
+ query.andWhere('folder.projectId = :projectId', { projectId: filter.projectId });
113
+ }
114
+ if (filter?.name && typeof filter.name === 'string') {
115
+ query.andWhere('LOWER(folder.name) LIKE LOWER(:name)', {
116
+ name: `%${filter.name}%`,
117
+ });
118
+ }
119
+ if (filter?.parentFolderId === '0') {
120
+ query.andWhere('folder.parentFolderId IS NULL');
121
+ }
122
+ else if (filter?.parentFolderId) {
123
+ query.andWhere('folder.parentFolderId = :parentFolderId', {
124
+ parentFolderId: filter.parentFolderId,
125
+ });
126
+ }
127
+ }
128
+ applyTagsFilter(query, tags) {
129
+ if (!Array.isArray(tags) || tags.length === 0)
130
+ return;
131
+ const subQuery = this.createTagsSubQuery(query, tags);
132
+ query.andWhere(`folder.id IN (${subQuery.getQuery()})`).setParameters({
133
+ tagNames: tags,
134
+ tagCount: tags.length,
135
+ });
136
+ }
137
+ createTagsSubQuery(query, tags) {
138
+ return query
139
+ .subQuery()
140
+ .select('ft.folderId')
141
+ .from(folder_tag_mapping_1.FolderTagMapping, 'ft')
142
+ .innerJoin(tag_entity_1.TagEntity, 'filter_tags', 'filter_tags.id = ft.tagId')
143
+ .where('filter_tags.name IN (:...tagNames)', { tagNames: tags })
144
+ .groupBy('ft.folderId')
145
+ .having('COUNT(DISTINCT filter_tags.name) = :tagCount', {
146
+ tagCount: tags.length,
147
+ });
148
+ }
149
+ applySorting(query, sortBy) {
150
+ if (!sortBy) {
151
+ query.orderBy('folder.updatedAt', 'DESC');
152
+ return;
153
+ }
154
+ const [field, order] = this.parseSortingParams(sortBy);
155
+ this.applySortingByField(query, field, order);
156
+ }
157
+ parseSortingParams(sortBy) {
158
+ const [field, order] = sortBy.split(':');
159
+ return [field, order?.toLowerCase() === 'desc' ? 'DESC' : 'ASC'];
160
+ }
161
+ applySortingByField(query, field, direction) {
162
+ if (field === 'name') {
163
+ query.orderBy('LOWER(folder.name)', direction);
164
+ }
165
+ else if (['createdAt', 'updatedAt'].includes(field)) {
166
+ query.orderBy(`folder.${field}`, direction);
167
+ }
168
+ }
169
+ applyPagination(query, options) {
170
+ if (options?.take) {
171
+ query.skip(options.skip ?? 0).take(options.take);
172
+ }
173
+ }
20
174
  };
21
175
  exports.FolderRepository = FolderRepository;
22
176
  exports.FolderRepository = FolderRepository = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"folder.repository.js","sourceRoot":"","sources":["../../../src/databases/repositories/folder.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAAkC;AAClC,0CAAsD;AAEtD,+CAA4C;AAGrC,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,oBAAkB;IACvD,YAAY,UAAsB;QACjC,KAAK,CAAC,eAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;CACD,CAAA;AAJY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,YAAO,GAAE;qCAEe,oBAAU;GADtB,gBAAgB,CAI5B"}
1
+ {"version":3,"file":"folder.repository.js","sourceRoot":"","sources":["../../../src/databases/repositories/folder.repository.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,17 @@ export declare class SharedCredentialsRepository extends Repository<SharedCreden
10
10
  private readonly roleService;
11
11
  constructor(dataSource: DataSource, roleService: RoleService);
12
12
  findCredentialForUser(credentialsId: string, user: User, scopes: Scope[], _relations?: FindOptionsRelations<SharedCredentials>): Promise<import("../entities/credentials-entity").CredentialsEntity | null>;
13
+ findAllCredentialsForUser(user: User, scopes: Scope[], trx?: EntityManager): Promise<{
14
+ projectId: string;
15
+ name: string;
16
+ data: string;
17
+ type: string;
18
+ shared: SharedCredentials[];
19
+ isManaged: boolean;
20
+ id: string;
21
+ createdAt: Date;
22
+ updatedAt: Date;
23
+ }[]>;
13
24
  findByCredentialIds(credentialIds: string[], role: CredentialSharingRole): Promise<SharedCredentials[]>;
14
25
  makeOwnerOfAllCredentials(project: Project): Promise<import("@n8n/typeorm").UpdateResult>;
15
26
  makeOwner(credentialIds: string[], projectId: string, trx?: EntityManager): Promise<import("@n8n/typeorm").InsertResult>;
@@ -18,7 +29,7 @@ export declare class SharedCredentialsRepository extends Repository<SharedCreden
18
29
  } | {
19
30
  projectRoles: ProjectRole[];
20
31
  credentialRoles: CredentialSharingRole[];
21
- }): Promise<string[]>;
32
+ }, trx?: EntityManager): Promise<string[]>;
22
33
  deleteByIds(sharedCredentialsIds: string[], projectId: string, trx?: EntityManager): Promise<import("@n8n/typeorm").DeleteResult>;
23
34
  getFilteredAccessibleCredentials(projectIds: string[], credentialsIds: string[]): Promise<string[]>;
24
35
  findCredentialOwningProject(credentialsId: string): Promise<Project | undefined>;
@@ -47,6 +47,32 @@ let SharedCredentialsRepository = class SharedCredentialsRepository extends type
47
47
  return null;
48
48
  return sharedCredential.credentials;
49
49
  }
50
+ async findAllCredentialsForUser(user, scopes, trx) {
51
+ trx = trx ?? this.manager;
52
+ let where = {};
53
+ if (!user.hasGlobalScope(scopes, { mode: 'allOf' })) {
54
+ const projectRoles = this.roleService.rolesWithScope('project', scopes);
55
+ const credentialRoles = this.roleService.rolesWithScope('credential', scopes);
56
+ where = {
57
+ role: (0, typeorm_1.In)(credentialRoles),
58
+ project: {
59
+ projectRelations: {
60
+ role: (0, typeorm_1.In)(projectRoles),
61
+ userId: user.id,
62
+ },
63
+ },
64
+ };
65
+ }
66
+ const sharedCredential = await trx.find(shared_credentials_1.SharedCredentials, {
67
+ where,
68
+ relations: {
69
+ credentials: {
70
+ shared: { project: { projectRelations: { user: true } } },
71
+ },
72
+ },
73
+ });
74
+ return sharedCredential.map((sc) => ({ ...sc.credentials, projectId: sc.projectId }));
75
+ }
50
76
  async findByCredentialIds(credentialIds, role) {
51
77
  return await this.find({
52
78
  relations: { credentials: true, project: { projectRelations: { user: true } } },
@@ -70,14 +96,15 @@ let SharedCredentialsRepository = class SharedCredentialsRepository extends type
70
96
  role: 'credential:owner',
71
97
  })), ['projectId', 'credentialsId']);
72
98
  }
73
- async getCredentialIdsByUserAndRole(userIds, options) {
99
+ async getCredentialIdsByUserAndRole(userIds, options, trx) {
100
+ trx = trx ?? this.manager;
74
101
  const projectRoles = 'scopes' in options
75
102
  ? this.roleService.rolesWithScope('project', options.scopes)
76
103
  : options.projectRoles;
77
104
  const credentialRoles = 'scopes' in options
78
105
  ? this.roleService.rolesWithScope('credential', options.scopes)
79
106
  : options.credentialRoles;
80
- const sharings = await this.find({
107
+ const sharings = await trx.find(shared_credentials_1.SharedCredentials, {
81
108
  where: {
82
109
  role: (0, typeorm_1.In)(credentialRoles),
83
110
  project: {
@@ -1 +1 @@
1
- {"version":3,"file":"shared-credentials.repository.js","sourceRoot":"","sources":["../../../src/databases/repositories/shared-credentials.repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared-credentials.repository.js","sourceRoot":"","sources":["../../../src/databases/repositories/shared-credentials.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,gCAAkC;AAGlC,0CAA+D;AAE/D,0DAAsD;AAGtD,uEAA+F;AAIxF,IAAM,2BAA2B,GAAjC,MAAM,2BAA4B,SAAQ,oBAA6B;IAC7E,YACC,UAAsB,EACL,WAAwB;QAEzC,KAAK,CAAC,sCAAiB,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QAF5B,gBAAW,GAAX,WAAW,CAAa;IAG1C,CAAC;IAGD,KAAK,CAAC,qBAAqB,CAC1B,aAAqB,EACrB,IAAU,EACV,MAAe,EACf,UAAoD;QAEpD,IAAI,KAAK,GAAwC,EAAE,aAAa,EAAE,CAAC;QAEnE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YACrD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACxE,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAC9E,KAAK,GAAG;gBACP,GAAG,KAAK;gBACR,IAAI,EAAE,IAAA,YAAE,EAAC,eAAe,CAAC;gBACzB,OAAO,EAAE;oBACR,gBAAgB,EAAE;wBACjB,IAAI,EAAE,IAAA,YAAE,EAAC,YAAY,CAAC;wBACtB,MAAM,EAAE,IAAI,CAAC,EAAE;qBACf;iBACD;aACD,CAAC;QACH,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;YAC3C,KAAK;YAEL,SAAS,EAAE;gBACV,WAAW,EAAE;oBACZ,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;iBACzD;aACD;SACD,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,gBAAgB,CAAC,WAAW,CAAC;IACrC,CAAC;IAGD,KAAK,CAAC,yBAAyB,CAAC,IAAU,EAAE,MAAe,EAAE,GAAmB;QAC/E,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;QAE1B,IAAI,KAAK,GAAwC,EAAE,CAAC;QAEpD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YACrD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACxE,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAC9E,KAAK,GAAG;gBACP,IAAI,EAAE,IAAA,YAAE,EAAC,eAAe,CAAC;gBACzB,OAAO,EAAE;oBACR,gBAAgB,EAAE;wBACjB,IAAI,EAAE,IAAA,YAAE,EAAC,YAAY,CAAC;wBACtB,MAAM,EAAE,IAAI,CAAC,EAAE;qBACf;iBACD;aACD,CAAC;QACH,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,sCAAiB,EAAE;YAC1D,KAAK;YAEL,SAAS,EAAE;gBACV,WAAW,EAAE;oBACZ,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;iBACzD;aACD;SACD,CAAC,CAAC;QAEH,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,aAAuB,EAAE,IAA2B;QAC7E,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC;YACtB,SAAS,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;YAC/E,KAAK,EAAE;gBACN,aAAa,EAAE,IAAA,YAAE,EAAC,aAAa,CAAC;gBAChC,IAAI;aACJ;SACD,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,OAAgB;QAC/C,OAAO,MAAM,IAAI,CAAC,MAAM,CACvB;YACC,SAAS,EAAE,IAAA,aAAG,EAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,IAAI,EAAE,kBAAkB;SACxB,EACD,EAAE,OAAO,EAAE,CACX,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,aAAuB,EAAE,SAAiB,EAAE,GAAmB;QAC9E,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;QAC1B,OAAO,MAAM,GAAG,CAAC,MAAM,CACtB,sCAAiB,EACjB,aAAa,CAAC,GAAG,CAChB,CAAC,aAAa,EAAE,EAAE,CACjB,CAAC;YACA,SAAS;YACT,aAAa;YACb,IAAI,EAAE,kBAAkB;SACxB,CAAU,CACZ,EACD,CAAC,WAAW,EAAE,eAAe,CAAC,CAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,6BAA6B,CAClC,OAAiB,EACjB,OAE4E,EAC5E,GAAmB;QAEnB,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;QAE1B,MAAM,YAAY,GACjB,QAAQ,IAAI,OAAO;YAClB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC;YAC5D,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;QACzB,MAAM,eAAe,GACpB,QAAQ,IAAI,OAAO;YAClB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC;YAC/D,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;QAE5B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,sCAAiB,EAAE;YAClD,KAAK,EAAE;gBACN,IAAI,EAAE,IAAA,YAAE,EAAC,eAAe,CAAC;gBACzB,OAAO,EAAE;oBACR,gBAAgB,EAAE;wBACjB,MAAM,EAAE,IAAA,YAAE,EAAC,OAAO,CAAC;wBACnB,IAAI,EAAE,IAAA,YAAE,EAAC,YAAY,CAAC;qBACtB;iBACD;aACD;SACD,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,oBAA8B,EAAE,SAAiB,EAAE,GAAmB;QACvF,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;QAE1B,OAAO,MAAM,GAAG,CAAC,MAAM,CAAC,sCAAiB,EAAE;YAC1C,SAAS;YACT,aAAa,EAAE,IAAA,YAAE,EAAC,oBAAoB,CAAC;SACvC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gCAAgC,CACrC,UAAoB,EACpB,cAAwB;QAExB,OAAO,CACN,MAAM,IAAI,CAAC,IAAI,CAAC;YACf,KAAK,EAAE;gBACN,SAAS,EAAE,IAAA,YAAE,EAAC,UAAU,CAAC;gBACzB,aAAa,EAAE,IAAA,YAAE,EAAC,cAAc,CAAC;aACjC;YACD,MAAM,EAAE,CAAC,eAAe,CAAC;SACzB,CAAC,CACF,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,2BAA2B,CAAC,aAAqB;QACtD,OAAO,CACN,MAAM,IAAI,CAAC,OAAO,CAAC;YAClB,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,kBAAkB,EAAE;YAClD,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;SAC5B,CAAC,CACF,EAAE,OAAO,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,6BAA6B,CAAC,aAAuB;QAC1D,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC;YACtB,KAAK,EAAE;gBACN,aAAa,EAAE,IAAA,YAAE,EAAC,aAAa,CAAC;aAChC;YACD,SAAS,EAAE,CAAC,SAAS,CAAC;SACtB,CAAC,CAAC;IACJ,CAAC;CACD,CAAA;AA5LY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,YAAO,GAAE;qCAGI,oBAAU;QACQ,0BAAW;GAH9B,2BAA2B,CA4LvC"}
@@ -1,11 +1,18 @@
1
1
  import { GlobalConfig } from '@n8n/config';
2
2
  import { DataSource, Repository } from '@n8n/typeorm';
3
- import type { UpdateResult, FindOptionsWhere, FindOptionsRelations } from '@n8n/typeorm';
3
+ import type { SelectQueryBuilder, UpdateResult, FindOptionsWhere, FindOptionsRelations } from '@n8n/typeorm';
4
4
  import type { ListQuery } from '../../requests';
5
+ import { FolderRepository } from './folder.repository';
6
+ import type { FolderWithWorkflowsCount } from '../entities/folder';
5
7
  import { WorkflowEntity } from '../entities/workflow-entity';
8
+ type ResourceType = 'folder' | 'workflow';
9
+ export type WorkflowFolderUnionFull = (ListQuery.Workflow.Plain | ListQuery.Workflow.WithSharing | FolderWithWorkflowsCount) & {
10
+ resource: ResourceType;
11
+ };
6
12
  export declare class WorkflowRepository extends Repository<WorkflowEntity> {
7
13
  private readonly globalConfig;
8
- constructor(dataSource: DataSource, globalConfig: GlobalConfig);
14
+ private readonly folderRepository;
15
+ constructor(dataSource: DataSource, globalConfig: GlobalConfig, folderRepository: FolderRepository);
9
16
  get(where: FindOptionsWhere<WorkflowEntity>, options?: {
10
17
  relations: string[] | FindOptionsRelations<WorkflowEntity>;
11
18
  }): Promise<WorkflowEntity | null>;
@@ -19,13 +26,34 @@ export declare class WorkflowRepository extends Repository<WorkflowEntity> {
19
26
  }): Promise<WorkflowEntity[]>;
20
27
  getActiveTriggerCount(): Promise<number>;
21
28
  updateWorkflowTriggerCount(id: string, triggerCount: number): Promise<UpdateResult>;
22
- getMany(sharedWorkflowIds: string[], options?: ListQuery.Options): Promise<{
23
- workflows: (Pick<WorkflowEntity, "id"> & Partial<Pick<WorkflowEntity, "tags" | "createdAt" | "updatedAt" | "name" | "versionId" | "active">>)[] | ListQuery.Workflow.WithSharing[];
29
+ private buildBaseUnionQuery;
30
+ getWorkflowsAndFoldersUnion(workflowIds: string[], options?: ListQuery.Options): Promise<{
31
+ id: string;
32
+ name: string;
33
+ resource: ResourceType;
34
+ createdAt: Date;
35
+ updatedAt: Date;
36
+ }[]>;
37
+ private buildUnionQuery;
38
+ private applySortingToUnionQuery;
39
+ private applyPaginationToUnionQuery;
40
+ private removeNameLowerFromResults;
41
+ getWorkflowsAndFoldersCount(workflowIds: string[], options?: ListQuery.Options): Promise<number>;
42
+ getWorkflowsAndFoldersWithCount(workflowIds: string[], options?: ListQuery.Options): Promise<readonly [WorkflowFolderUnionFull[], number]>;
43
+ private getFolderIds;
44
+ private getWorkflowsIds;
45
+ private fetchExtraData;
46
+ private enrichDataWithExtras;
47
+ getMany(workflowIds: string[], options?: ListQuery.Options): Promise<(Pick<WorkflowEntity, "id"> & Partial<Pick<WorkflowEntity, "createdAt" | "updatedAt" | "name" | "versionId" | "tags" | "active">>)[]>;
48
+ getManyAndCount(sharedWorkflowIds: string[], options?: ListQuery.Options): Promise<{
49
+ workflows: (Pick<WorkflowEntity, "id"> & Partial<Pick<WorkflowEntity, "createdAt" | "updatedAt" | "name" | "versionId" | "tags" | "active">>)[] | ListQuery.Workflow.WithSharing[];
24
50
  count: number;
25
51
  }>;
52
+ getManyQuery(workflowIds: string[], options?: ListQuery.Options): SelectQueryBuilder<WorkflowEntity>;
26
53
  private createBaseQuery;
27
54
  private applyFilters;
28
55
  private applyNameFilter;
56
+ private applyParentFolderFilter;
29
57
  private applyActiveFilter;
30
58
  private applyTagsFilter;
31
59
  private applyProjectFilter;
@@ -35,7 +63,6 @@ export declare class WorkflowRepository extends Repository<WorkflowEntity> {
35
63
  private applyTagsRelation;
36
64
  private applySorting;
37
65
  private parseSortingParams;
38
- private applyDefaultSorting;
39
66
  private applySortingByColumn;
40
67
  private applyPagination;
41
68
  findStartingWith(workflowName: string): Promise<Array<{
@@ -51,3 +78,4 @@ export declare class WorkflowRepository extends Repository<WorkflowEntity> {
51
78
  activateAll(): Promise<UpdateResult>;
52
79
  findByActiveState(activeState: boolean): Promise<WorkflowEntity[]>;
53
80
  }
81
+ export {};
@@ -14,14 +14,16 @@ const config_1 = require("@n8n/config");
14
14
  const di_1 = require("@n8n/di");
15
15
  const typeorm_1 = require("@n8n/typeorm");
16
16
  const utils_1 = require("../../utils");
17
+ const folder_repository_1 = require("./folder.repository");
17
18
  const tag_entity_1 = require("../entities/tag-entity");
18
19
  const webhook_entity_1 = require("../entities/webhook-entity");
19
20
  const workflow_entity_1 = require("../entities/workflow-entity");
20
21
  const workflow_tag_mapping_1 = require("../entities/workflow-tag-mapping");
21
22
  let WorkflowRepository = class WorkflowRepository extends typeorm_1.Repository {
22
- constructor(dataSource, globalConfig) {
23
+ constructor(dataSource, globalConfig, folderRepository) {
23
24
  super(workflow_entity_1.WorkflowEntity, dataSource.manager);
24
25
  this.globalConfig = globalConfig;
26
+ this.folderRepository = folderRepository;
25
27
  }
26
28
  async get(where, options) {
27
29
  return await this.findOne({
@@ -82,31 +84,163 @@ let WorkflowRepository = class WorkflowRepository extends typeorm_1.Repository {
82
84
  .where('id = :id', { id })
83
85
  .execute();
84
86
  }
85
- async getMany(sharedWorkflowIds, options = {}) {
87
+ buildBaseUnionQuery(workflowIds, options = {}) {
88
+ const subQueryParameters = {
89
+ select: {
90
+ createdAt: true,
91
+ updatedAt: true,
92
+ id: true,
93
+ name: true,
94
+ },
95
+ filter: options.filter,
96
+ };
97
+ const columnNames = [...Object.keys(subQueryParameters.select ?? {}), 'resource'];
98
+ const [sortByColumn, sortByDirection] = this.parseSortingParams(options.sortBy ?? 'updatedAt:asc');
99
+ const foldersQuery = this.folderRepository
100
+ .getManyQuery(subQueryParameters)
101
+ .addSelect("'folder'", 'resource');
102
+ const workflowsQuery = this.getManyQuery(workflowIds, subQueryParameters).addSelect("'workflow'", 'resource');
103
+ const qb = this.manager.createQueryBuilder();
104
+ return {
105
+ baseQuery: qb
106
+ .createQueryBuilder()
107
+ .addCommonTableExpression(foldersQuery, 'FOLDERS_QUERY', { columnNames })
108
+ .addCommonTableExpression(workflowsQuery, 'WORKFLOWS_QUERY', { columnNames })
109
+ .addCommonTableExpression(`SELECT * FROM ${qb.escape('FOLDERS_QUERY')} UNION ALL SELECT * FROM ${qb.escape('WORKFLOWS_QUERY')}`, 'RESULT_QUERY'),
110
+ sortByColumn,
111
+ sortByDirection,
112
+ };
113
+ }
114
+ async getWorkflowsAndFoldersUnion(workflowIds, options = {}) {
115
+ const { baseQuery, sortByColumn, sortByDirection } = this.buildBaseUnionQuery(workflowIds, options);
116
+ const query = this.buildUnionQuery(baseQuery, {
117
+ sortByColumn,
118
+ sortByDirection,
119
+ pagination: {
120
+ take: options.take,
121
+ skip: options.skip ?? 0,
122
+ },
123
+ });
124
+ const workflowsAndFolders = await query.getRawMany();
125
+ return this.removeNameLowerFromResults(workflowsAndFolders);
126
+ }
127
+ buildUnionQuery(baseQuery, options) {
128
+ const query = baseQuery
129
+ .select(`${baseQuery.escape('RESULT')}.*`)
130
+ .from('RESULT_QUERY', 'RESULT');
131
+ this.applySortingToUnionQuery(query, baseQuery, options);
132
+ this.applyPaginationToUnionQuery(query, options.pagination);
133
+ return query;
134
+ }
135
+ applySortingToUnionQuery(query, baseQuery, options) {
136
+ const { sortByColumn, sortByDirection } = options;
137
+ const resultTableEscaped = baseQuery.escape('RESULT');
138
+ const nameColumnEscaped = baseQuery.escape('name');
139
+ const resourceColumnEscaped = baseQuery.escape('resource');
140
+ const sortByColumnEscaped = baseQuery.escape(sortByColumn);
141
+ query.orderBy(`${resultTableEscaped}.${resourceColumnEscaped}`, 'ASC');
142
+ if (sortByColumn === 'name') {
143
+ query
144
+ .addSelect(`LOWER(${resultTableEscaped}.${nameColumnEscaped})`, 'name_lower')
145
+ .addOrderBy('name_lower', sortByDirection);
146
+ }
147
+ else {
148
+ query.addOrderBy(`${resultTableEscaped}.${sortByColumnEscaped}`, sortByDirection);
149
+ }
150
+ }
151
+ applyPaginationToUnionQuery(query, pagination) {
152
+ if (pagination.take) {
153
+ query.take(pagination.take);
154
+ }
155
+ query.skip(pagination.skip);
156
+ }
157
+ removeNameLowerFromResults(results) {
158
+ return results.map(({ name_lower, ...rest }) => rest);
159
+ }
160
+ async getWorkflowsAndFoldersCount(workflowIds, options = {}) {
161
+ const { skip, take, ...baseQueryParameters } = options;
162
+ const { baseQuery } = this.buildBaseUnionQuery(workflowIds, baseQueryParameters);
163
+ const response = await baseQuery
164
+ .select(`COUNT(DISTINCT ${baseQuery.escape('RESULT')}.${baseQuery.escape('id')})`, 'count')
165
+ .from('RESULT_QUERY', 'RESULT')
166
+ .select('COUNT(*)', 'count')
167
+ .getRawOne();
168
+ return Number(response?.count) || 0;
169
+ }
170
+ async getWorkflowsAndFoldersWithCount(workflowIds, options = {}) {
171
+ const [workflowsAndFolders, count] = await Promise.all([
172
+ this.getWorkflowsAndFoldersUnion(workflowIds, options),
173
+ this.getWorkflowsAndFoldersCount(workflowIds, options),
174
+ ]);
175
+ const { workflows, folders } = await this.fetchExtraData(workflowsAndFolders);
176
+ const enrichedWorkflowsAndFolders = this.enrichDataWithExtras(workflowsAndFolders, {
177
+ workflows,
178
+ folders,
179
+ });
180
+ return [enrichedWorkflowsAndFolders, count];
181
+ }
182
+ getFolderIds(workflowsAndFolders) {
183
+ return workflowsAndFolders.filter((item) => item.resource === 'folder').map((item) => item.id);
184
+ }
185
+ getWorkflowsIds(workflowsAndFolders) {
186
+ return workflowsAndFolders
187
+ .filter((item) => item.resource === 'workflow')
188
+ .map((item) => item.id);
189
+ }
190
+ async fetchExtraData(workflowsAndFolders) {
191
+ const workflowIds = this.getWorkflowsIds(workflowsAndFolders);
192
+ const folderIds = this.getFolderIds(workflowsAndFolders);
193
+ const [workflows, folders] = await Promise.all([
194
+ this.getMany(workflowIds),
195
+ this.folderRepository.getMany({ filter: { folderIds } }),
196
+ ]);
197
+ return { workflows, folders };
198
+ }
199
+ enrichDataWithExtras(baseData, extraData) {
200
+ const workflowsMap = new Map(extraData.workflows.map((workflow) => [workflow.id, workflow]));
201
+ const foldersMap = new Map(extraData.folders.map((folder) => [folder.id, folder]));
202
+ return baseData.map((item) => {
203
+ const lookupMap = item.resource === 'folder' ? foldersMap : workflowsMap;
204
+ const extraItem = lookupMap.get(item.id);
205
+ return extraItem ? { ...item, ...extraItem } : item;
206
+ });
207
+ }
208
+ async getMany(workflowIds, options = {}) {
209
+ if (workflowIds.length === 0) {
210
+ return [];
211
+ }
212
+ const query = this.getManyQuery(workflowIds, options);
213
+ const workflows = (await query.getMany());
214
+ return workflows;
215
+ }
216
+ async getManyAndCount(sharedWorkflowIds, options = {}) {
86
217
  if (sharedWorkflowIds.length === 0) {
87
218
  return { workflows: [], count: 0 };
88
219
  }
89
- const qb = this.createBaseQuery(sharedWorkflowIds);
220
+ const query = this.getManyQuery(sharedWorkflowIds, options);
221
+ const [workflows, count] = (await query.getManyAndCount());
222
+ return { workflows, count };
223
+ }
224
+ getManyQuery(workflowIds, options = {}) {
225
+ const qb = this.createBaseQuery(workflowIds);
90
226
  this.applyFilters(qb, options.filter);
91
227
  this.applySelect(qb, options.select);
92
228
  this.applyRelations(qb, options.select);
93
229
  this.applySorting(qb, options.sortBy);
94
230
  this.applyPagination(qb, options);
95
- const [workflows, count] = (await qb.getManyAndCount());
96
- return { workflows, count };
231
+ return qb;
97
232
  }
98
- createBaseQuery(sharedWorkflowIds) {
99
- return this.createQueryBuilder('workflow').where('workflow.id IN (:...sharedWorkflowIds)', {
100
- sharedWorkflowIds,
233
+ createBaseQuery(workflowIds) {
234
+ return this.createQueryBuilder('workflow').where('workflow.id IN (:...workflowIds)', {
235
+ workflowIds: !workflowIds.length ? [''] : workflowIds,
101
236
  });
102
237
  }
103
238
  applyFilters(qb, filter) {
104
- if (!filter)
105
- return;
106
239
  this.applyNameFilter(qb, filter);
107
240
  this.applyActiveFilter(qb, filter);
108
241
  this.applyTagsFilter(qb, filter);
109
242
  this.applyProjectFilter(qb, filter);
243
+ this.applyParentFolderFilter(qb, filter);
110
244
  }
111
245
  applyNameFilter(qb, filter) {
112
246
  if (typeof filter?.name === 'string' && filter.name !== '') {
@@ -115,6 +249,16 @@ let WorkflowRepository = class WorkflowRepository extends typeorm_1.Repository {
115
249
  });
116
250
  }
117
251
  }
252
+ applyParentFolderFilter(qb, filter) {
253
+ if (filter?.parentFolderId === '0') {
254
+ qb.andWhere('workflow.parentFolderId IS NULL');
255
+ }
256
+ else if (filter?.parentFolderId) {
257
+ qb.andWhere('workflow.parentFolderId = :parentFolderId', {
258
+ parentFolderId: filter.parentFolderId,
259
+ });
260
+ }
261
+ }
118
262
  applyActiveFilter(qb, filter) {
119
263
  if (typeof filter?.active === 'boolean') {
120
264
  qb.andWhere('workflow.active = :active', { active: filter.active });
@@ -165,9 +309,9 @@ let WorkflowRepository = class WorkflowRepository extends typeorm_1.Repository {
165
309
  ]);
166
310
  }
167
311
  applySelect(qb, select) {
168
- qb.select(['workflow.id']);
169
312
  if (!select) {
170
- qb.addSelect([
313
+ qb.select([
314
+ 'workflow.id',
171
315
  'workflow.name',
172
316
  'workflow.active',
173
317
  'workflow.createdAt',
@@ -176,18 +320,24 @@ let WorkflowRepository = class WorkflowRepository extends typeorm_1.Repository {
176
320
  ]);
177
321
  return;
178
322
  }
179
- const regularFields = Object.entries(select).filter(([field]) => !['ownedBy', 'tags'].includes(field));
323
+ const fieldsToSelect = ['workflow.id'];
324
+ const regularFields = Object.entries(select).filter(([field]) => !['ownedBy', 'tags', 'parentFolder'].includes(field));
180
325
  regularFields.forEach(([field, include]) => {
181
- if (include) {
182
- qb.addSelect(`workflow.${field}`);
326
+ if (include && field !== 'id') {
327
+ fieldsToSelect.push(`workflow.${field}`);
183
328
  }
184
329
  });
330
+ qb.select(fieldsToSelect);
185
331
  }
186
332
  applyRelations(qb, select) {
187
333
  const areTagsEnabled = !this.globalConfig.tags.disabled;
188
334
  const isDefaultSelect = select === undefined;
189
335
  const areTagsRequested = isDefaultSelect || select?.tags;
190
336
  const isOwnedByIncluded = isDefaultSelect || select?.ownedBy;
337
+ const isParentFolderIncluded = isDefaultSelect || select?.parentFolder;
338
+ if (isParentFolderIncluded) {
339
+ qb.leftJoinAndSelect('workflow.parentFolder', 'parentFolder');
340
+ }
191
341
  if (areTagsEnabled && areTagsRequested) {
192
342
  this.applyTagsRelation(qb);
193
343
  }
@@ -202,7 +352,7 @@ let WorkflowRepository = class WorkflowRepository extends typeorm_1.Repository {
202
352
  }
203
353
  applySorting(qb, sortBy) {
204
354
  if (!sortBy) {
205
- this.applyDefaultSorting(qb);
355
+ qb.orderBy('workflow.updatedAt', 'ASC');
206
356
  return;
207
357
  }
208
358
  const [column, direction] = this.parseSortingParams(sortBy);
@@ -212,9 +362,6 @@ let WorkflowRepository = class WorkflowRepository extends typeorm_1.Repository {
212
362
  const [column, order] = sortBy.split(':');
213
363
  return [column, order.toUpperCase()];
214
364
  }
215
- applyDefaultSorting(qb) {
216
- qb.orderBy('workflow.updatedAt', 'ASC');
217
- }
218
365
  applySortingByColumn(qb, column, direction) {
219
366
  if (column === 'name') {
220
367
  qb.addSelect('LOWER(workflow.name)', 'workflow_name_lower').orderBy('workflow_name_lower', direction);
@@ -262,6 +409,7 @@ exports.WorkflowRepository = WorkflowRepository;
262
409
  exports.WorkflowRepository = WorkflowRepository = __decorate([
263
410
  (0, di_1.Service)(),
264
411
  __metadata("design:paramtypes", [typeorm_1.DataSource,
265
- config_1.GlobalConfig])
412
+ config_1.GlobalConfig,
413
+ folder_repository_1.FolderRepository])
266
414
  ], WorkflowRepository);
267
415
  //# sourceMappingURL=workflow.repository.js.map