Skip to content

Commit 582b6bb

Browse files
committed
fix: fixed exceptions that were throws for cf on unsupported flows & cleaned code
1 parent 4b8d1a2 commit 582b6bb

File tree

8 files changed

+99
-46
lines changed

8 files changed

+99
-46
lines changed

services/workflows-service/src/collection-flow/collection-flow.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import { CollectionFlowStateService } from './services/collection-flow-state.ser
4949
import { CollectionFlowDocumentsController } from './controllers/collection-flow.documents.controller';
5050
import { CollectionFlowDocumentsService } from './services/collection-flow-documents.service';
5151
import { DocumentFileModule } from '@/document-file/document-file.module';
52+
import { CollectionFlowUtilityModule } from './services/сollection-flow-utility/collection-flow-utility.module';
5253

5354
@Module({
5455
imports: [
@@ -67,6 +68,7 @@ import { DocumentFileModule } from '@/document-file/document-file.module';
6768
forwardRef(() => WorkflowModule),
6869
DocumentModule,
6970
DocumentFileModule,
71+
CollectionFlowUtilityModule,
7072
],
7173
controllers: [
7274
CollectionFlowController,

services/workflows-service/src/collection-flow/services/collection-flow-state.service.ts

Lines changed: 11 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
DocumentStatus,
2121
EndUserVariant,
2222
UiDefinition,
23-
WorkflowRuntimeData,
2423
} from '@prisma/client';
2524
import { findEntityFieldsDefinition } from '../helpers/find-entity-fields-definition';
2625
import { findDocumentDefinitionByTypeAndCategory } from '../helpers/find-document-definition-by-type-and-category';
@@ -38,6 +37,7 @@ import {
3837
} from '@/prisma/prisma.util';
3938
import { PrismaService } from '@/prisma/prisma.service';
4039
import { assertIsValidProjectIds } from '@/project/project-scope.service';
40+
import { CollectionFlowUtilityService } from './сollection-flow-utility/collection-flow-utility.service';
4141

4242
@Injectable()
4343
export class CollectionFlowStateService {
@@ -49,6 +49,7 @@ export class CollectionFlowStateService {
4949
protected readonly workflowService: WorkflowService,
5050
protected readonly appLogger: AppLoggerService,
5151
protected readonly prismaService: PrismaService,
52+
protected readonly collectionFlowUtilityService: CollectionFlowUtilityService,
5253
) {}
5354

5455
async getCollectionFlowState(workflowId: string, projectIds: TProjectIds) {
@@ -60,6 +61,15 @@ export class CollectionFlowStateService {
6061
);
6162

6263
const collectionFlowState = getCollectionFlowState(workflowWithRelations.context);
64+
const isCollectionFlowStateSupported =
65+
await this.collectionFlowUtilityService.isCollectionFlowStateSupported(
66+
workflowId,
67+
projectIds,
68+
);
69+
70+
if (!isCollectionFlowStateSupported) {
71+
return null;
72+
}
6373

6474
if (!collectionFlowState) {
6575
throw new CollectionFlowMissingException();
@@ -281,41 +291,6 @@ export class CollectionFlowStateService {
281291
return collectionFlowState.status;
282292
}
283293

284-
private getEntityIdsFromWorkflow(
285-
workflow: WorkflowRuntimeData & {
286-
childWorkflowsRuntimeData: WorkflowRuntimeData[];
287-
},
288-
): Array<{ entityId: string; entityType: TEntityType }> {
289-
const entityIds: Array<{ entityId: string; entityType: TEntityType }> = [
290-
{
291-
entityId: workflow.context.entity.ballerineEntityId,
292-
entityType: EntityType.business,
293-
},
294-
];
295-
296-
workflow.childWorkflowsRuntimeData?.forEach(childWorkflow => {
297-
if (!childWorkflow.endUserId) {
298-
throw new Error('End user ID not found on child workflow.');
299-
}
300-
301-
entityIds.push({
302-
entityId: childWorkflow.endUserId,
303-
entityType: EntityType.ubo,
304-
});
305-
});
306-
307-
workflow.context?.entity?.data?.additionalInfo?.directors?.forEach(
308-
(director: { ballerineEntityId: string }) => {
309-
entityIds.push({
310-
entityId: director.ballerineEntityId,
311-
entityType: EntityType.director,
312-
});
313-
},
314-
);
315-
316-
return entityIds;
317-
}
318-
319294
async updateCollectionFlowState(
320295
workflowId: string,
321296
newState: UpdateCollectionFlowStateDto,
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// eslint-disable-next-line import/no-cycle
2+
import { WorkflowModule } from '@/workflow/workflow.module';
3+
import { forwardRef, Module } from '@nestjs/common';
4+
import { CollectionFlowUtilityService } from './collection-flow-utility.service';
5+
import { UiDefinitionModule } from '@/ui-definition/ui-definition.module';
6+
7+
@Module({
8+
imports: [
9+
// eslint-disable-next-line import/no-cycle
10+
forwardRef(() => WorkflowModule),
11+
UiDefinitionModule,
12+
],
13+
providers: [CollectionFlowUtilityService],
14+
exports: [CollectionFlowUtilityService],
15+
})
16+
export class CollectionFlowUtilityModule {}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { isPrismaException } from '@/common/is-prisma-exception/is-prisma-exception';
2+
import { TProjectIds } from '@/types';
3+
import { UiDefinitionService } from '@/ui-definition/ui-definition.service';
4+
import { WorkflowService } from '@/workflow/workflow.service';
5+
import { forwardRef, Inject, Injectable } from '@nestjs/common';
6+
7+
@Injectable()
8+
export class CollectionFlowUtilityService {
9+
constructor(
10+
@Inject(forwardRef(() => WorkflowService))
11+
protected readonly workflowService: WorkflowService,
12+
protected readonly uiDefinitionService: UiDefinitionService,
13+
) {}
14+
15+
async isCollectionFlowStateSupported(workflowId: string, projectIds: TProjectIds) {
16+
const workflowDefinition = await this.workflowService.getWorkflowByIdWithRelations(
17+
workflowId,
18+
projectIds,
19+
);
20+
21+
try {
22+
await this.uiDefinitionService.getByWorkflowDefinitionId(
23+
workflowDefinition.workflowDefinitionId,
24+
'collection_flow',
25+
projectIds,
26+
);
27+
28+
return true;
29+
} catch (error) {
30+
if (isPrismaException(error) && error.code === 'P2025') {
31+
return false;
32+
}
33+
34+
throw error;
35+
}
36+
}
37+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { isType } from '@ballerine/common';
2+
import { PrismaClientKnownRequestError } from '@prisma/client/runtime';
3+
import { z } from 'zod';
4+
5+
export const isPrismaException = (value: unknown): value is PrismaClientKnownRequestError =>
6+
isType(z.object({ code: z.string() }))(value);

services/workflows-service/src/document/document.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { WorkflowModule } from '@/workflow/workflow.module';
1010
import { UiDefinitionModule } from '@/ui-definition/ui-definition.module';
1111
import { WorkflowDefinitionModule } from '@/workflow-defintion/workflow-definition.module';
1212
import { ProjectScopeService } from '@/project/project-scope.service';
13+
import { CollectionFlowUtilityModule } from '@/collection-flow/services/сollection-flow-utility/collection-flow-utility.module';
1314

1415
@Module({
1516
imports: [
@@ -19,6 +20,7 @@ import { ProjectScopeService } from '@/project/project-scope.service';
1920
forwardRef(() => WorkflowModule),
2021
UiDefinitionModule,
2122
WorkflowDefinitionModule,
23+
CollectionFlowUtilityModule,
2224
],
2325
controllers: [DocumentControllerExternal],
2426
providers: [DocumentService, DocumentRepository, ProjectScopeService],

services/workflows-service/src/document/document.service.ts

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,13 @@ import {
4242
EntitySchema,
4343
TParsedDocuments,
4444
} from './types';
45-
import { defaultPrismaTransactionOptions } from '@/prisma/prisma.util';
46-
import { beginTransactionIfNotExistCurry } from '@/prisma/prisma.util';
45+
import {
46+
defaultPrismaTransactionOptions,
47+
beginTransactionIfNotExistCurry,
48+
} from '@/prisma/prisma.util';
4749
import { PrismaService } from '@/prisma/prisma.service';
4850
import { assertIsValidProjectIds } from '@/project/project-scope.service';
51+
import { CollectionFlowUtilityService } from '@/collection-flow/services/сollection-flow-utility/collection-flow-utility.service';
4952

5053
@Injectable()
5154
export class DocumentService {
@@ -58,6 +61,7 @@ export class DocumentService {
5861
protected readonly uiDefinitionService: UiDefinitionService,
5962
protected readonly workflowDefinitionService: WorkflowDefinitionService,
6063
protected readonly prismaService: PrismaService,
64+
protected readonly collectionFlowUtilityService: CollectionFlowUtilityService,
6165
) {}
6266

6367
async create(
@@ -806,6 +810,23 @@ export class DocumentService {
806810
}
807811

808812
async getDocumentTrackerByWorkflowId(projectId: TProjectId, workflowId: string) {
813+
const defaultTrackerItems = {
814+
business: [],
815+
individuals: {
816+
ubos: [],
817+
directors: [],
818+
},
819+
};
820+
821+
const isCollectionFlowStateSupported =
822+
await this.collectionFlowUtilityService.isCollectionFlowStateSupported(workflowId, [
823+
projectId,
824+
]);
825+
826+
if (!isCollectionFlowStateSupported) {
827+
return defaultTrackerItems;
828+
}
829+
809830
const uiDefinition = await this.uiDefinitionService.getByRuntimeId(
810831
workflowId,
811832
'collection_flow',
@@ -817,13 +838,7 @@ export class DocumentService {
817838
.safeParse(uiDefinition.uiSchema);
818839

819840
if (!uiSchemaValidation.success) {
820-
return {
821-
business: [],
822-
individuals: {
823-
ubos: [],
824-
directors: [],
825-
},
826-
};
841+
return defaultTrackerItems;
827842
}
828843

829844
const workflowDataWithEndUsers = await this.workflowService.getWorkflowByIdWithRelations(

0 commit comments

Comments
 (0)