diff --git a/apps/api/src/app/workflows-v2/usecases/get-workflow/get-workflow.command.ts b/apps/api/src/app/workflows-v2/usecases/get-workflow/get-workflow.command.ts index 04c0c222aef..fdb9e57c78f 100644 --- a/apps/api/src/app/workflows-v2/usecases/get-workflow/get-workflow.command.ts +++ b/apps/api/src/app/workflows-v2/usecases/get-workflow/get-workflow.command.ts @@ -1,8 +1,12 @@ import { EnvironmentWithUserObjectCommand } from '@novu/application-generic'; -import { IsDefined, IsString } from 'class-validator'; +import { IsDefined, IsOptional, IsString } from 'class-validator'; export class GetWorkflowCommand extends EnvironmentWithUserObjectCommand { @IsString() @IsDefined() workflowIdOrInternalId: string; + + @IsString() + @IsOptional() + environmentId?: string; } diff --git a/apps/api/src/app/workflows-v2/usecases/get-workflow/get-workflow.usecase.ts b/apps/api/src/app/workflows-v2/usecases/get-workflow/get-workflow.usecase.ts index 567601b3f0d..5f8b6525431 100644 --- a/apps/api/src/app/workflows-v2/usecases/get-workflow/get-workflow.usecase.ts +++ b/apps/api/src/app/workflows-v2/usecases/get-workflow/get-workflow.usecase.ts @@ -1,6 +1,7 @@ -import { Injectable, InternalServerErrorException } from '@nestjs/common'; +import { Injectable, InternalServerErrorException, NotFoundException } from '@nestjs/common'; import { Instrument, InstrumentUsecase, PinoLogger } from '@novu/application-generic'; import { + EnvironmentRepository, IntegrationEntity, IntegrationRepository, NotificationStepEntity, @@ -29,6 +30,7 @@ export class GetWorkflowUseCase { private getWorkflowWithPreferencesUseCase: GetWorkflowWithPreferencesUseCase, private buildStepDataUsecase: BuildStepDataUsecase, private integrationsRepository: IntegrationRepository, + private environmentRepository: EnvironmentRepository, private logger: PinoLogger ) { this.logger.setContext(this.constructor.name); @@ -39,11 +41,15 @@ export class GetWorkflowUseCase { command: GetWorkflowCommand, workflowDataContainer?: WorkflowDataContainer ): Promise { + const effectiveEnvironmentId = await this.resolveEnvironmentId(command); + + const user: UserSessionData = { + ...command.user, + environmentId: effectiveEnvironmentId, + }; + if (workflowDataContainer) { - const cachedDto = workflowDataContainer.getWorkflowDto( - command.workflowIdOrInternalId, - command.user.environmentId - ); + const cachedDto = workflowDataContainer.getWorkflowDto(command.workflowIdOrInternalId, effectiveEnvironmentId); if (cachedDto) { this.logger.debug(`Using cached workflow DTO for ${command.workflowIdOrInternalId}`); @@ -54,14 +60,14 @@ export class GetWorkflowUseCase { const workflowWithPreferences = await this.getWorkflowWithPreferencesUseCase.execute( GetWorkflowWithPreferencesCommand.create({ - environmentId: command.user.environmentId, + environmentId: effectiveEnvironmentId, organizationId: command.user.organizationId, workflowIdOrInternalId: command.workflowIdOrInternalId, userId: command.user._id, }) ); - const fullSteps = await this.getFullWorkflowSteps(workflowWithPreferences, command.user); + const fullSteps = await this.getFullWorkflowSteps(workflowWithPreferences, user); const payloadExample = await generatePayloadExample(workflowWithPreferences); const workflowDto = toResponseWorkflowDto(workflowWithPreferences, fullSteps, payloadExample); @@ -69,6 +75,25 @@ export class GetWorkflowUseCase { return workflowDto; } + private async resolveEnvironmentId(command: GetWorkflowCommand): Promise { + const { environmentId } = command; + + if (!environmentId || environmentId === command.user.environmentId) { + return command.user.environmentId; + } + + const environment = await this.environmentRepository.findByIdAndOrganization( + environmentId, + command.user.organizationId + ); + + if (!environment) { + throw new NotFoundException(`Environment ${environmentId} not found`); + } + + return environmentId; + } + private async getFullWorkflowSteps( workflowWithPreferences: NotificationTemplateEntity, user: UserSessionData diff --git a/apps/api/src/app/workflows-v2/workflow.controller.ts b/apps/api/src/app/workflows-v2/workflow.controller.ts index d436930282f..2f8ec759dde 100644 --- a/apps/api/src/app/workflows-v2/workflow.controller.ts +++ b/apps/api/src/app/workflows-v2/workflow.controller.ts @@ -197,10 +197,8 @@ export class WorkflowController { return this.getWorkflowUseCase.execute( GetWorkflowCommand.create({ workflowIdOrInternalId, - user: { - ...user, - environmentId: environmentId || user.environmentId, - }, + user, + environmentId, }) ); }