diff --git a/services/workflows-service/prisma/data-migrations b/services/workflows-service/prisma/data-migrations index fd8fd97169..79ee883a56 160000 --- a/services/workflows-service/prisma/data-migrations +++ b/services/workflows-service/prisma/data-migrations @@ -1 +1 @@ -Subproject commit fd8fd971694ef091eba2b3ca586441c98b7e13e7 +Subproject commit 79ee883a5606b2dc562ac8530bb493e2e23faadd diff --git a/services/workflows-service/scripts/workflows/ui-definition/kyb-parent-dynamic-example/pages/defintion-logic.ts b/services/workflows-service/scripts/workflows/ui-definition/kyb-parent-dynamic-example/pages/defintion-logic.ts index 6fd58cac81..1cfb482569 100644 --- a/services/workflows-service/scripts/workflows/ui-definition/kyb-parent-dynamic-example/pages/defintion-logic.ts +++ b/services/workflows-service/scripts/workflows/ui-definition/kyb-parent-dynamic-example/pages/defintion-logic.ts @@ -43,9 +43,9 @@ export const definition = { { name: 'update_end_user', pluginKind: 'api', - url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/end-user?token={metadata.token}`, + url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/end-user}`, method: 'POST', - headers: { Authorization: 'Bearer {metadata.token}' }, + headers: { Authorization: 'Bearer {query.token}' }, stateNames: [], request: { transform: [ @@ -65,7 +65,7 @@ export const definition = { { name: 'sync_workflow_runtime', pluginKind: 'api', - url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/sync/?token={metadata.token}`, + url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/sync}`, method: 'PUT', stateNames: [ 'personal_details', @@ -74,7 +74,7 @@ export const definition = { 'company_ownership', 'company_documents', ], - headers: { Authorization: 'Bearer {metadata.token}' }, + headers: { Authorization: 'Bearer {query.token}' }, request: { transform: [ { @@ -94,10 +94,10 @@ export const definition = { { name: 'finish_workflow', pluginKind: 'api', - url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/?token={metadata.token}`, + url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow}`, method: 'PUT', stateNames: ['finish'], - headers: { Authorization: 'Bearer {metadata.token}' }, + headers: { Authorization: 'Bearer {query.token}' }, request: { transform: [ { @@ -117,10 +117,10 @@ export const definition = { { name: 'send_collection_flow_finished', pluginKind: 'api', - url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/send-event/?token={metadata.token}`, + url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/send-event}`, method: 'POST', stateNames: ['finish'], - headers: { Authorization: 'Bearer {metadata.token}' }, + headers: { Authorization: 'Bearer {query.token}' }, request: { transform: [ { diff --git a/services/workflows-service/scripts/workflows/ui-definition/kyb-with-associated-companies/ui-definition/associated-company-ui-def/associated-ui-definition.ts b/services/workflows-service/scripts/workflows/ui-definition/kyb-with-associated-companies/ui-definition/associated-company-ui-def/associated-ui-definition.ts index e20c33f669..204f56b2ab 100644 --- a/services/workflows-service/scripts/workflows/ui-definition/kyb-with-associated-companies/ui-definition/associated-company-ui-def/associated-ui-definition.ts +++ b/services/workflows-service/scripts/workflows/ui-definition/kyb-with-associated-companies/ui-definition/associated-company-ui-def/associated-ui-definition.ts @@ -31,9 +31,9 @@ export const definition = { { name: 'update_end_user', pluginKind: 'api', - url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/end-user?token={metadata.token}`, + url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/end-user}`, method: 'POST', - headers: { Authorization: 'Bearer {metadata.token}' }, + headers: { Authorization: 'Bearer {query.token}' }, stateNames: [], request: { transform: [ @@ -53,7 +53,7 @@ export const definition = { { name: 'sync_workflow_runtime', pluginKind: 'api', - url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/sync/?token={metadata.token}`, + url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/sync}`, method: 'PUT', stateNames: [ 'personal_details', @@ -64,7 +64,7 @@ export const definition = { 'company_ownership', 'company_documents', ], - headers: { Authorization: 'Bearer {metadata.token}' }, + headers: { Authorization: 'Bearer {query.token}' }, request: { transform: [ { @@ -84,10 +84,10 @@ export const definition = { { name: 'finish_workflow', pluginKind: 'api', - url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/?token={metadata.token}`, + url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow}`, method: 'PUT', stateNames: ['finish'], - headers: { Authorization: 'Bearer {metadata.token}' }, + headers: { Authorization: 'Bearer {query.token}' }, request: { transform: [ { @@ -110,13 +110,12 @@ export const definition = { url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/business/business-information`, method: 'GET', stateNames: [], - headers: { Authorization: 'Bearer {metadata.token}' }, + headers: { Authorization: 'Bearer {query.token}' }, request: { transform: [ { transformer: 'jmespath', mapping: `{ - token: metadata.token, registrationNumber: entity.data.registrationNumber, countryCode: entity.data.country, state: entity.data.additionalInfo.state || '', @@ -146,10 +145,10 @@ export const definition = { { name: 'send_collection_flow_finished', pluginKind: 'api', - url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/send-event/?token={metadata.token}`, + url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/send-event}`, method: 'POST', stateNames: ['finish'], - headers: { Authorization: 'Bearer {metadata.token}' }, + headers: { Authorization: 'Bearer {query.token}' }, request: { transform: [ { diff --git a/services/workflows-service/scripts/workflows/ui-definition/kyb-with-associated-companies/ui-definition/kyb-with-associated-company-ui-def/defintion-logic.ts b/services/workflows-service/scripts/workflows/ui-definition/kyb-with-associated-companies/ui-definition/kyb-with-associated-company-ui-def/defintion-logic.ts index 01d892facd..c5fbf922f8 100644 --- a/services/workflows-service/scripts/workflows/ui-definition/kyb-with-associated-companies/ui-definition/kyb-with-associated-company-ui-def/defintion-logic.ts +++ b/services/workflows-service/scripts/workflows/ui-definition/kyb-with-associated-companies/ui-definition/kyb-with-associated-company-ui-def/defintion-logic.ts @@ -55,9 +55,9 @@ export const definition = { { name: 'update_end_user', pluginKind: 'api', - url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/end-user?token={metadata.token}`, + url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/end-user}`, method: 'POST', - headers: { Authorization: 'Bearer {metadata.token}' }, + headers: { Authorization: 'Bearer {query.token}' }, stateNames: [], request: { transform: [ @@ -77,7 +77,7 @@ export const definition = { { name: 'sync_workflow_runtime', pluginKind: 'api', - url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/sync/?token={metadata.token}`, + url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/sync}`, method: 'PUT', stateNames: [ 'personal_details', @@ -86,7 +86,7 @@ export const definition = { 'company_ownership', 'company_documents', ], - headers: { Authorization: 'Bearer {metadata.token}' }, + headers: { Authorization: 'Bearer {query.token}' }, request: { transform: [ { @@ -106,10 +106,10 @@ export const definition = { { name: 'finish_workflow', pluginKind: 'api', - url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/?token={metadata.token}`, + url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow}`, method: 'PUT', stateNames: ['finish'], - headers: { Authorization: 'Bearer {metadata.token}' }, + headers: { Authorization: 'Bearer {query.token}' }, request: { transform: [ { @@ -129,10 +129,10 @@ export const definition = { { name: 'send_collection_flow_finished', pluginKind: 'api', - url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/send-event/?token={metadata.token}`, + url: `{collectionFlow.config.apiUrl}/api/v1/collection-flow/send-event}`, method: 'POST', stateNames: ['finish'], - headers: { Authorization: 'Bearer {metadata.token}' }, + headers: { Authorization: 'Bearer {query.token}' }, request: { transform: [ { diff --git a/services/workflows-service/src/auth/workflow-token/workflow-token.repository.ts b/services/workflows-service/src/auth/workflow-token/workflow-token.repository.ts index 07a708a6ac..24122317ae 100644 --- a/services/workflows-service/src/auth/workflow-token/workflow-token.repository.ts +++ b/services/workflows-service/src/auth/workflow-token/workflow-token.repository.ts @@ -23,6 +23,13 @@ export class WorkflowTokenRepository { }); } + async count(args: Prisma.WorkflowRuntimeDataTokenCountArgs, projectId: TProjectId) { + return await this.prismaService.workflowRuntimeDataToken.count({ + ...args, + where: { ...args.where, projectId }, + }); + } + async findFirstByWorkflowruntimeDataIdUnscoped(workflowRuntimeDataId: string) { return await this.prismaService.workflowRuntimeDataToken.findFirst({ select: { diff --git a/services/workflows-service/src/auth/workflow-token/workflow-token.service.ts b/services/workflows-service/src/auth/workflow-token/workflow-token.service.ts index 4c07dd4ef9..bad936460e 100644 --- a/services/workflows-service/src/auth/workflow-token/workflow-token.service.ts +++ b/services/workflows-service/src/auth/workflow-token/workflow-token.service.ts @@ -1,17 +1,95 @@ import { Injectable } from '@nestjs/common'; + +import type { InputJsonValue, PrismaTransaction, TProjectId } from '@/types'; +import { CustomerService } from '@/customer/customer.service'; +import { UiDefinitionService } from '@/ui-definition/ui-definition.service'; import { WorkflowTokenRepository } from '@/auth/workflow-token/workflow-token.repository'; -import type { PrismaTransaction, TProjectId } from '@/types'; +import { WorkflowRuntimeDataRepository } from '@/workflow/workflow-runtime-data.repository'; +import { buildCollectionFlowState, getOrderedSteps } from '@ballerine/common'; +import { env } from '@/env'; +import { WORKFLOW_FINAL_STATES } from '@/workflow/consts'; +import { Prisma, UiDefinitionContext } from '@prisma/client'; @Injectable() export class WorkflowTokenService { - constructor(private readonly workflowTokenRepository: WorkflowTokenRepository) {} + constructor( + private readonly customerService: CustomerService, + private readonly uiDefinitionService: UiDefinitionService, + private readonly workflowTokenRepository: WorkflowTokenRepository, + private readonly workflowRuntimeDataRepository: WorkflowRuntimeDataRepository, + ) {} async create( projectId: TProjectId, data: Parameters[1], transaction?: PrismaTransaction, ) { - return await this.workflowTokenRepository.create(projectId, data, transaction); + const { workflowRuntimeDataId } = data; + + const existingTokensForWorkflowRuntime = await this.count( + { where: { workflowRuntimeDataId } }, + projectId, + ); + + const workflowToken = await this.workflowTokenRepository.create(projectId, data, transaction); + + if (existingTokensForWorkflowRuntime === 0) { + const { workflowDefinitionId, context } = await this.workflowRuntimeDataRepository.findById( + workflowRuntimeDataId, + { select: { workflowDefinitionId: true, context: true } }, + [projectId], + transaction, + ); + + const [uiDefinition, customer] = await Promise.all([ + this.uiDefinitionService.getByWorkflowDefinitionId( + workflowDefinitionId, + UiDefinitionContext.collection_flow, + [projectId], + ), + this.customerService.getByProjectId(projectId), + ]); + + const collectionFlow = buildCollectionFlowState({ + apiUrl: env.APP_API_URL, + steps: uiDefinition?.definition + ? getOrderedSteps( + (uiDefinition?.definition as Prisma.JsonObject)?.definition as Record< + string, + Record + >, + { finalStates: [...WORKFLOW_FINAL_STATES] }, + ).map(stepName => ({ + stateName: stepName, + })) + : [], + additionalInformation: { + customerCompany: customer.displayName, + }, + }); + + await this.workflowRuntimeDataRepository.updateStateById( + workflowRuntimeDataId, + { + data: { + context: { + ...context, + collectionFlow, + metadata: { + ...(context.metadata ?? {}), + token: workflowToken.token, + collectionFlowUrl: env.COLLECTION_FLOW_URL, + webUiSDKUrl: env.WEB_UI_SDK_URL, + }, + } as InputJsonValue, + projectId, + }, + }, + transaction, + ); + } + + return workflowToken; } async findByToken(token: string) { @@ -26,6 +104,13 @@ export class WorkflowTokenService { return await this.workflowTokenRepository.findByTokenWithExpiredUnscoped(token); } + async count( + args: Parameters[0], + projectId: TProjectId, + ) { + return await this.workflowTokenRepository.count(args, projectId); + } + async deleteByToken(token: string) { return await this.workflowTokenRepository.deleteByTokenUnscoped(token); } diff --git a/services/workflows-service/src/collection-flow/collection-flow.service.intg.test.ts b/services/workflows-service/src/collection-flow/collection-flow.service.intg.test.ts index d29e1e5148..9e66afda41 100644 --- a/services/workflows-service/src/collection-flow/collection-flow.service.intg.test.ts +++ b/services/workflows-service/src/collection-flow/collection-flow.service.intg.test.ts @@ -37,6 +37,7 @@ import { Customer, EndUser, PrismaClient, Project } from '@prisma/client'; import { noop } from 'lodash'; import { CollectionFlowService } from './collection-flow.service'; import { MerchantMonitoringClient } from '@/business-report/merchant-monitoring-client'; +import { env } from '@/env'; const deps: Provider[] = [ { @@ -121,6 +122,7 @@ describe('CollectionFlowService', () => { let workflowRuntimeDataRepository: WorkflowRuntimeDataRepository; let customerRepository: CustomerRepository; let endUserRepository: EndUserRepository; + let uiDefinitionRepository: UiDefinitionRepository; let customer: Customer; let project: Project; @@ -159,6 +161,7 @@ describe('CollectionFlowService', () => { ); customerRepository = module.get(CustomerRepository); endUserRepository = module.get(EndUserRepository); + uiDefinitionRepository = module.get(UiDefinitionRepository); }); beforeEach(async () => { @@ -202,6 +205,16 @@ describe('CollectionFlowService', () => { }, }); + await uiDefinitionRepository.create({ + data: { + uiSchema: {}, + projectId: project.id, + name: 'test-ui-definition', + uiContext: 'collection_flow', + workflowDefinitionId: workflowDefinition.id, + }, + }); + const workflowRuntimeData = await workflowRuntimeDataRepository.create({ data: { workflowDefinitionId: workflowDefinition.id, @@ -220,7 +233,28 @@ describe('CollectionFlowService', () => { const context = await collectionFlowService.getCollectionFlowContext(token); - expect(context.context).toEqual(workflowContext); + const expectedContext = { + metadata: { + token: token.token, + webUiSDKUrl: env.WEB_UI_SDK_URL, + collectionFlowUrl: env.COLLECTION_FLOW_URL, + }, + collectionFlow: { + state: { + steps: [], + status: 'pending', + currentStep: '', + }, + config: { + apiUrl: env.APP_API_URL, + }, + additionalInformation: { + customerCompany: customer.displayName, + }, + }, + }; + + expect(context.context).toEqual(expectedContext); expect(context.config).toEqual(workflowConfig); }); }); diff --git a/services/workflows-service/src/collection-flow/controllers/collection-flow.no-user.controller.intg.test.ts b/services/workflows-service/src/collection-flow/controllers/collection-flow.no-user.controller.intg.test.ts index 04e627d114..8ddf1c26a9 100644 --- a/services/workflows-service/src/collection-flow/controllers/collection-flow.no-user.controller.intg.test.ts +++ b/services/workflows-service/src/collection-flow/controllers/collection-flow.no-user.controller.intg.test.ts @@ -37,12 +37,16 @@ import { WorkflowEventEmitterService } from '@/workflow/workflow-event-emitter.s import { WorkflowRuntimeDataRepository } from '@/workflow/workflow-runtime-data.repository'; import { WorkflowService } from '@/workflow/workflow.service'; import { CollectionFlowNoUserController } from './collection-flow.no-user.controller'; +import { UiDefinitionRepository } from '@/ui-definition/ui-definition.repository'; +import { ApiKeyService } from '@/customer/api-key/api-key.service'; +import { ApiKeyRepository } from '@/customer/api-key/api-key.repository'; describe('CollectionFlowSignupController', () => { let app: INestApplication; let prismaClient: PrismaService; let workflowTokenService: WorkflowTokenService; let workflowDefinitionRepository: WorkflowDefinitionRepository; + let uiDefinitionRepository: UiDefinitionRepository; let workflowRuntimeDataRepository: WorkflowRuntimeDataRepository; let customerRepository: CustomerRepository; let endUserRepository: EndUserRepository; @@ -55,8 +59,6 @@ describe('CollectionFlowSignupController', () => { controllers: [CollectionFlowNoUserController], providers: [ { provide: BusinessService, useValue: noop }, - { provide: UiDefinitionService, useValue: noop }, - { provide: CustomerService, useValue: noop }, { provide: FileService, useValue: noop }, { provide: SalesforceService, useValue: noop }, { provide: RiskRuleService, useValue: noop }, @@ -72,6 +74,11 @@ describe('CollectionFlowSignupController', () => { { provide: WorkflowEventEmitterService, useValue: { emit: noop } }, WorkflowService, EndUserService, + UiDefinitionService, + UiDefinitionRepository, + CustomerService, + ApiKeyService, + ApiKeyRepository, BusinessReportService, BusinessRepository, EntityRepository, @@ -95,6 +102,7 @@ describe('CollectionFlowSignupController', () => { workflowDefinitionRepository = module.get( WorkflowDefinitionRepository, ); + uiDefinitionRepository = module.get(UiDefinitionRepository); workflowRuntimeDataRepository = module.get( WorkflowRuntimeDataRepository, ); @@ -124,6 +132,16 @@ describe('CollectionFlowSignupController', () => { }, }); + await uiDefinitionRepository.create({ + data: { + uiSchema: {}, + projectId: project.id, + uiContext: 'collection_flow', + name: 'signup-test-ui-definition', + workflowDefinitionId: workflowDefinition.id, + }, + }); + const { id: workflowRuntimeDataId } = await workflowRuntimeDataRepository.create({ data: { workflowDefinitionId: workflowDefinition.id, diff --git a/services/workflows-service/src/common/guards/token-guard/token-auth.module.ts b/services/workflows-service/src/common/guards/token-guard/token-auth.module.ts index 3cbe3caa13..d2b48889d8 100644 --- a/services/workflows-service/src/common/guards/token-guard/token-auth.module.ts +++ b/services/workflows-service/src/common/guards/token-guard/token-auth.module.ts @@ -2,9 +2,29 @@ import { WorkflowTokenRepository } from '@/auth/workflow-token/workflow-token.re import { WorkflowTokenService } from '@/auth/workflow-token/workflow-token.service'; import { TokenAuthGuard } from '@/common/guards/token-guard/token-auth.guard'; import { Module } from '@nestjs/common'; +import { CustomerService } from '@/customer/customer.service'; +import { UiDefinitionService } from '@/ui-definition/ui-definition.service'; +import { CustomerRepository } from '@/customer/customer.repository'; +import { ProjectScopeService } from '@/project/project-scope.service'; +import { UiDefinitionRepository } from '@/ui-definition/ui-definition.repository'; +import { WorkflowRuntimeDataRepository } from '@/workflow/workflow-runtime-data.repository'; +import { ApiKeyService } from '@/customer/api-key/api-key.service'; +import { ApiKeyRepository } from '@/customer/api-key/api-key.repository'; @Module({ - providers: [WorkflowTokenRepository, WorkflowTokenService, TokenAuthGuard], + providers: [ + WorkflowTokenRepository, + WorkflowTokenService, + TokenAuthGuard, + CustomerService, + CustomerRepository, + UiDefinitionService, + ProjectScopeService, + UiDefinitionRepository, + WorkflowRuntimeDataRepository, + ApiKeyService, + ApiKeyRepository, + ], exports: [WorkflowTokenRepository, WorkflowTokenService, TokenAuthGuard], }) export class TokenAuthModule {} diff --git a/services/workflows-service/src/workflow/workflow-runtime-data.repository.ts b/services/workflows-service/src/workflow/workflow-runtime-data.repository.ts index 2c6915a4b0..e4b3d83ee1 100644 --- a/services/workflows-service/src/workflow/workflow-runtime-data.repository.ts +++ b/services/workflows-service/src/workflow/workflow-runtime-data.repository.ts @@ -23,14 +23,13 @@ type StateRelatedColumns = 'state' | 'status' | 'context' | 'tags'; @Injectable() export class WorkflowRuntimeDataRepository { constructor( - protected readonly prisma: PrismaService, - protected readonly projectScopeService: ProjectScopeService, + protected readonly prismaService: PrismaService, protected readonly scopeService: ProjectScopeService, ) {} async create( args: Prisma.SelectSubset, - transaction: PrismaTransaction | PrismaClient = this.prisma, + transaction: PrismaTransaction | PrismaClient = this.prismaService, ): Promise { return await transaction.workflowRuntimeData.create({ ...args, @@ -48,7 +47,7 @@ export class WorkflowRuntimeDataRepository { args: Prisma.SelectSubset, projectIds: TProjectIds, ) { - return await this.prisma.workflowRuntimeData.findMany( + return await this.prismaService.workflowRuntimeData.findMany( this.scopeService.scopeFindMany(args, projectIds), ); } @@ -56,13 +55,13 @@ export class WorkflowRuntimeDataRepository { async findManyUnscoped( args: Prisma.SelectSubset, ) { - return await this.prisma.workflowRuntimeData.findMany(args); + return await this.prismaService.workflowRuntimeData.findMany(args); } async findOne( args: Prisma.SelectSubset, projectIds: TProjectIds, - transaction: PrismaTransaction | PrismaClient = this.prisma, + transaction: PrismaTransaction | PrismaClient = this.prismaService, ): Promise { return await transaction.workflowRuntimeData.findFirst( this.scopeService.scopeFindOne(args, projectIds), @@ -86,7 +85,7 @@ export class WorkflowRuntimeDataRepository { id: string, args: Prisma.SelectSubset>, projectIds: TProjectIds, - transaction: PrismaTransaction | PrismaClient = this.prisma, + transaction: PrismaTransaction | PrismaClient = this.prismaService, ): Promise { return await transaction.workflowRuntimeData.findFirstOrThrow( this.scopeService.scopeFindOne(merge(args, { where: { id } }), projectIds), @@ -134,7 +133,7 @@ export class WorkflowRuntimeDataRepository { async findByIdAndLockUnscoped({ id, - transaction = this.prisma, + transaction = this.prismaService, }: { id: string; transaction: PrismaTransaction | PrismaClient; @@ -149,7 +148,7 @@ export class WorkflowRuntimeDataRepository { args: { data: Omit; }, - transaction: PrismaTransaction | PrismaService = this.prisma, + transaction: PrismaTransaction | PrismaService = this.prismaService, ): Promise { return await transaction.workflowRuntimeData.update({ where: { id }, @@ -166,7 +165,7 @@ export class WorkflowRuntimeDataRepository { data: Prisma.WorkflowRuntimeDataUncheckedUpdateInput; include?: Prisma.WorkflowRuntimeDataInclude; }, - transaction: PrismaTransaction, + transaction: PrismaTransaction = this.prismaService, ) { return await transaction.workflowRuntimeData.update({ where: { id }, @@ -182,7 +181,7 @@ export class WorkflowRuntimeDataRepository { projectIds: TProjectIds, ): Promise { const stringifiedConfig = JSON.stringify(newConfig); - const affectedRows = await this.prisma + const affectedRows = await this.prismaService .$executeRaw`UPDATE "WorkflowRuntimeData" SET "config" = jsonb_deep_merge_with_options("config", ${stringifiedConfig}::jsonb, ${arrayMergeOption}) WHERE "id" = ${id} AND "projectId" in (${projectIds?.join( ',', )})`; @@ -200,7 +199,7 @@ export class WorkflowRuntimeDataRepository { args: Prisma.SelectSubset>, projectIds: TProjectIds, ): Promise { - return await this.prisma.workflowRuntimeData.delete( + return await this.prismaService.workflowRuntimeData.delete( this.scopeService.scopeDelete( { where: { id }, @@ -259,7 +258,7 @@ export class WorkflowRuntimeDataRepository { async findContext(id: string, projectIds: TProjectIds) { return ( - await this.prisma.workflowRuntimeData.findFirstOrThrow( + await this.prismaService.workflowRuntimeData.findFirstOrThrow( this.scopeService.scopeFindOne( { where: { id }, @@ -277,7 +276,7 @@ export class WorkflowRuntimeDataRepository { args: Prisma.SelectSubset, projectIds: TProjectIds, ): Promise { - return await this.prisma.workflowRuntimeData.count( + return await this.prismaService.workflowRuntimeData.count( this.scopeService.scopeFindMany(args, projectIds) as any, ); } @@ -286,7 +285,7 @@ export class WorkflowRuntimeDataRepository { args: Prisma.SubsetIntersection, projectIds: TProjectIds, ) { - return await this.prisma.workflowRuntimeData.groupBy( + return await this.prismaService.workflowRuntimeData.groupBy( this.scopeService.scopeGroupBy(args, projectIds), ); } @@ -396,6 +395,6 @@ export class WorkflowRuntimeDataRepository { LIMIT ${take} OFFSET ${skip} `; - return (await this.prisma.$queryRaw(sql)) as WorkflowRuntimeData[]; + return (await this.prismaService.$queryRaw(sql)) as WorkflowRuntimeData[]; } } diff --git a/services/workflows-service/src/workflow/workflow.controller.external.ts b/services/workflows-service/src/workflow/workflow.controller.external.ts index 313e3ba4ec..c132fa1c1b 100644 --- a/services/workflows-service/src/workflow/workflow.controller.external.ts +++ b/services/workflows-service/src/workflow/workflow.controller.external.ts @@ -52,7 +52,7 @@ export const WORKFLOW_TAG = 'Workflows'; @common.Controller('external/workflows') export class WorkflowControllerExternal { constructor( - protected readonly service: WorkflowService, + protected readonly workflowService: WorkflowService, protected readonly normalizeService: HookCallbackHandlerService, private readonly workflowTokenService: WorkflowTokenService, private readonly workflowDefinitionService: WorkflowDefinitionService, @@ -68,7 +68,7 @@ export class WorkflowControllerExternal { @Query() query: GetWorkflowsRuntimeInputDto, @ProjectIds() projectIds: TProjectIds, ): Promise { - const results = await this.service.listRuntimeData( + const results = await this.workflowService.listRuntimeData( { page: query.page, size: query.limit, @@ -89,7 +89,7 @@ export class WorkflowControllerExternal { @common.Param() params: WorkflowDefinitionWhereUniqueInput, @ProjectIds() projectIds: TProjectIds, ) { - return await this.service.getWorkflowDefinitionById( + return await this.workflowService.getWorkflowDefinitionById( params.id, { include: { @@ -186,7 +186,7 @@ export class WorkflowControllerExternal { @common.Param() params: WorkflowDefinitionWhereUniqueInput, @ProjectIds() projectIds: TProjectIds, ): Promise { - const workflowRuntimeData = await this.service.getWorkflowRuntimeDataById( + const workflowRuntimeData = await this.workflowService.getWorkflowRuntimeDataById( params.id, {}, projectIds, @@ -210,7 +210,11 @@ export class WorkflowControllerExternal { @CurrentProject() currentProjectId: TProjectId, ): Promise { try { - return await this.service.updateWorkflowRuntimeData(params.id, data, currentProjectId); + return await this.workflowService.updateWorkflowRuntimeData( + params.id, + data, + currentProjectId, + ); } catch (error) { if (isRecordNotFoundError(error)) { throw new errors.NotFoundException(`No resource was found for ${JSON.stringify(params)}`); @@ -352,7 +356,7 @@ export class WorkflowControllerExternal { projectIds, ); - const actionResult = await this.service.createOrUpdateWorkflowRuntime({ + const actionResult = await this.workflowService.createOrUpdateWorkflowRuntime({ workflowDefinitionId: latestDefinitionVersion.id, context, config, @@ -429,7 +433,7 @@ export class WorkflowControllerExternal { @ProjectIds() projectIds: TProjectIds, @CurrentProject() currentProjectId: TProjectId, ): Promise { - return await this.service.event( + return await this.workflowService.event( { ...data, id, @@ -451,7 +455,7 @@ export class WorkflowControllerExternal { @ProjectIds() projectIds: TProjectIds, @CurrentProject() currentProjectId: TProjectId, ) { - return await this.service.event( + return await this.workflowService.event( { ...data, id, @@ -479,7 +483,7 @@ export class WorkflowControllerExternal { @ProjectIds() projectIds: TProjectIds, ) { try { - const context = await this.service.getWorkflowRuntimeDataContext(id, projectIds); + const context = await this.workflowService.getWorkflowRuntimeDataContext(id, projectIds); return { context }; } catch (err) { @@ -504,10 +508,11 @@ export class WorkflowControllerExternal { ): Promise { try { await this.prismaService.$transaction(async transaction => { - const workflowRuntime = await this.service.getWorkflowRuntimeDataByIdAndLockUnscoped({ - id: params.id, - transaction, - }); + const workflowRuntime = + await this.workflowService.getWorkflowRuntimeDataByIdAndLockUnscoped({ + id: params.id, + transaction, + }); const context = await this.normalizeService.handleHookResponse({ workflowRuntime, @@ -518,7 +523,7 @@ export class WorkflowControllerExternal { currentProjectId: workflowRuntime.projectId, }); - await this.service.event( + await this.workflowService.event( { id: params.id, name: BUILT_IN_EVENT.DEEP_MERGE_CONTEXT, @@ -532,7 +537,7 @@ export class WorkflowControllerExternal { transaction, ); - await this.service.event( + await this.workflowService.event( { id: params.id, name: params.event,