1
1
import { Injectable , InternalServerErrorException } from '@nestjs/common' ;
2
2
import { workflow } from '@novu/framework/express' ;
3
- import { ActionStep , ChannelStep , JsonSchema , Step , StepOptions , StepOutput , Workflow } from '@novu/framework/internal' ;
3
+ import { ActionStep , ChannelStep , Schema , Step , StepOutput , Workflow } from '@novu/framework/internal' ;
4
4
import { NotificationStepEntity , NotificationTemplateEntity , NotificationTemplateRepository } from '@novu/dal' ;
5
- import { JSONSchemaDefinition , StepTypeEnum } from '@novu/shared' ;
5
+ import { StepTypeEnum } from '@novu/shared' ;
6
6
import { Instrument , InstrumentUsecase , PinoLogger } from '@novu/application-generic' ;
7
7
import { AdditionalOperation , RulesLogic } from 'json-logic-js' ;
8
8
import _ from 'lodash' ;
9
9
import { ConstructFrameworkWorkflowCommand } from './construct-framework-workflow.command' ;
10
10
import {
11
11
ChatOutputRendererUsecase ,
12
+ EmailOutputRendererUsecase ,
12
13
FullPayloadForRender ,
13
14
InAppOutputRendererUsecase ,
14
15
PushOutputRendererUsecase ,
15
- EmailOutputRendererUsecase ,
16
16
SmsOutputRendererUsecase ,
17
17
} from '../output-renderers' ;
18
18
import { DelayOutputRendererUsecase } from '../output-renderers/delay-output-renderer.usecase' ;
@@ -54,7 +54,7 @@ export class ConstructFrameworkWorkflow {
54
54
dbWorkflow . triggers [ 0 ] . identifier ,
55
55
async ( { step, payload, subscriber } ) => {
56
56
const fullPayloadForRender : FullPayloadForRender = { payload, subscriber, steps : { } } ;
57
- for await ( const staticStep of dbWorkflow . steps ) {
57
+ for ( const staticStep of dbWorkflow . steps ) {
58
58
fullPayloadForRender . steps [ staticStep . stepId || staticStep . _templateId ] = await this . constructStep (
59
59
step ,
60
60
staticStep ,
@@ -176,8 +176,12 @@ export class ConstructFrameworkWorkflow {
176
176
staticStep : NotificationStepEntity ,
177
177
fullPayloadForRender : FullPayloadForRender
178
178
) : Required < Parameters < ChannelStep > [ 2 ] > {
179
+ const skipFunction = ( controlValues : Record < string , unknown > ) =>
180
+ this . processSkipOption ( controlValues , fullPayloadForRender ) ;
181
+
179
182
return {
180
- ...this . constructCommonStepOptions ( staticStep , fullPayloadForRender ) ,
183
+ skip : skipFunction ,
184
+ controlSchema : staticStep . template ! . controls ! . schema as unknown as Schema ,
181
185
disableOutputSanitization : true ,
182
186
providers : { } ,
183
187
} ;
@@ -188,10 +192,17 @@ export class ConstructFrameworkWorkflow {
188
192
staticStep : NotificationStepEntity ,
189
193
fullPayloadForRender : FullPayloadForRender
190
194
) : Required < Parameters < ActionStep > [ 2 ] > {
191
- const stepOptions = this . constructCommonStepOptions ( staticStep , fullPayloadForRender ) ;
192
-
193
- let controlSchema = stepOptions . controlSchema as JSONSchemaDefinition ;
194
195
const stepType = staticStep . template ! . type ;
196
+ const controlSchema = this . optionalAugmentControlSchemaDueToAjvBug ( staticStep , stepType ) ;
197
+
198
+ return {
199
+ controlSchema : controlSchema as unknown as Schema ,
200
+ skip : ( controlValues : Record < string , unknown > ) => this . processSkipOption ( controlValues , fullPayloadForRender ) ,
201
+ } ;
202
+ }
203
+
204
+ private optionalAugmentControlSchemaDueToAjvBug ( staticStep : NotificationStepEntity , stepType : StepTypeEnum ) {
205
+ let controlSchema = staticStep . template ! . controls ! . schema ;
195
206
196
207
/*
197
208
* because of the known AJV issue with anyOf, we need to find the first schema that matches the control values
@@ -204,22 +215,7 @@ export class ConstructFrameworkWorkflow {
204
215
controlSchema = fistSchemaMatch ?? controlSchema . anyOf [ 0 ] ;
205
216
}
206
217
207
- return {
208
- ...stepOptions ,
209
- controlSchema : controlSchema as JsonSchema ,
210
- } ;
211
- }
212
-
213
- @Instrument ( )
214
- private constructCommonStepOptions (
215
- staticStep : NotificationStepEntity ,
216
- fullPayloadForRender : FullPayloadForRender
217
- ) : Required < StepOptions > {
218
- return {
219
- // TODO: fix the `JSONSchemaDto` type to enforce a non-primitive schema type.
220
- controlSchema : staticStep . template ! . controls ! . schema as JsonSchema ,
221
- skip : ( controlValues : Record < string , unknown > ) => this . processSkipOption ( controlValues , fullPayloadForRender ) ,
222
- } ;
218
+ return controlSchema ;
223
219
}
224
220
225
221
@Instrument ( )
0 commit comments