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 , WorkflowOriginEnum } 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 ,
@@ -170,8 +170,12 @@ export class ConstructFrameworkWorkflow {
170
170
staticStep : NotificationStepEntity ,
171
171
fullPayloadForRender : FullPayloadForRender
172
172
) : Required < Parameters < ChannelStep > [ 2 ] > {
173
+ const skipFunction = ( controlValues : Record < string , unknown > ) =>
174
+ this . processSkipOption ( controlValues , fullPayloadForRender ) ;
175
+
173
176
return {
174
- ...this . constructCommonStepOptions ( staticStep , fullPayloadForRender ) ,
177
+ skip : skipFunction ,
178
+ controlSchema : staticStep . template ! . controls ! . schema as unknown as Schema ,
175
179
disableOutputSanitization : true ,
176
180
providers : { } ,
177
181
} ;
@@ -182,10 +186,17 @@ export class ConstructFrameworkWorkflow {
182
186
staticStep : NotificationStepEntity ,
183
187
fullPayloadForRender : FullPayloadForRender
184
188
) : Required < Parameters < ActionStep > [ 2 ] > {
185
- const stepOptions = this . constructCommonStepOptions ( staticStep , fullPayloadForRender ) ;
186
-
187
- let controlSchema = stepOptions . controlSchema as JSONSchemaDefinition ;
188
189
const stepType = staticStep . template ! . type ;
190
+ const controlSchema = this . optionalAugmentControlSchemaDueToAjvBug ( staticStep , stepType ) ;
191
+
192
+ return {
193
+ controlSchema : controlSchema as unknown as Schema ,
194
+ skip : ( controlValues : Record < string , unknown > ) => this . processSkipOption ( controlValues , fullPayloadForRender ) ,
195
+ } ;
196
+ }
197
+
198
+ private optionalAugmentControlSchemaDueToAjvBug ( staticStep : NotificationStepEntity , stepType : StepTypeEnum ) {
199
+ let controlSchema = staticStep . template ! . controls ! . schema ;
189
200
190
201
/*
191
202
* because of the known AJV issue with anyOf, we need to find the first schema that matches the control values
@@ -198,22 +209,7 @@ export class ConstructFrameworkWorkflow {
198
209
controlSchema = fistSchemaMatch ?? controlSchema . anyOf [ 0 ] ;
199
210
}
200
211
201
- return {
202
- ...stepOptions ,
203
- controlSchema : controlSchema as JsonSchema ,
204
- } ;
205
- }
206
-
207
- @Instrument ( )
208
- private constructCommonStepOptions (
209
- staticStep : NotificationStepEntity ,
210
- fullPayloadForRender : FullPayloadForRender
211
- ) : Required < StepOptions > {
212
- return {
213
- // TODO: fix the `JSONSchemaDto` type to enforce a non-primitive schema type.
214
- controlSchema : staticStep . template ! . controls ! . schema as JsonSchema ,
215
- skip : ( controlValues : Record < string , unknown > ) => this . processSkipOption ( controlValues , fullPayloadForRender ) ,
216
- } ;
212
+ return controlSchema ;
217
213
}
218
214
219
215
@Instrument ( )
0 commit comments