1 |
|
2 |
|
3 |
|
4 |
|
5 | import * as models from '@conversationlearner/models'
|
6 | import { CallbackMap } from './CLRunner'
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 | export default function (appDefinition: models.AppDefinition, callbackMap: CallbackMap): models.AppDefinitionChange {
|
13 | let isChanged = false
|
14 | const appDefinitionChanges: models.AppDefinitionChanges = {
|
15 | actions: appDefinition.actions.map<models.IChangeResult<models.ActionBase>>(a => getActionChangeResult(a, callbackMap)),
|
16 | entities: appDefinition.entities.map(getDefaultChangeResult),
|
17 | trainDialogs: appDefinition.trainDialogs.map(getDefaultChangeResult)
|
18 | }
|
19 |
|
20 | const actionsChanged = appDefinitionChanges.actions.some(cr => cr.isChanged)
|
21 | isChanged = isChanged || actionsChanged
|
22 |
|
23 | return isChanged
|
24 | ? {
|
25 | isChanged: true,
|
26 | currentAppDefinition: appDefinition,
|
27 | updatedAppDefinition: {
|
28 | actions: appDefinitionChanges.actions.map(cr => cr.value),
|
29 | entities: appDefinitionChanges.entities.map(cr => cr.value),
|
30 | trainDialogs: appDefinitionChanges.trainDialogs.map(cr => cr.value)
|
31 | },
|
32 | appDefinitionChanges
|
33 | }
|
34 | : {
|
35 | isChanged: false,
|
36 | currentAppDefinition: appDefinition
|
37 | }
|
38 | }
|
39 |
|
40 | export function getDefaultChangeResult<T> (value: T): models.IChangeResult<T> {
|
41 | return {
|
42 | isChanged: false,
|
43 | value,
|
44 | changes: []
|
45 | }
|
46 | }
|
47 |
|
48 | export function getActionChangeResult (action: models.ActionBase, callbackMap: CallbackMap): models.IChangeResult<models.ActionBase> {
|
49 |
|
50 | const changeResult: models.IChangeResult<models.ActionBase> = {
|
51 | isChanged: false,
|
52 | value: action,
|
53 | changes: []
|
54 | }
|
55 |
|
56 | if (action.actionType === models.ActionTypes.API_LOCAL) {
|
57 | const untypedActionPayload: any = JSON.parse(action.payload)
|
58 | if (Array.isArray(untypedActionPayload.arguments)) {
|
59 | const legacyActionPayload: models.ActionPayloadSingleArguments = untypedActionPayload
|
60 | const callback = callbackMap[legacyActionPayload.payload]
|
61 |
|
62 | const actionPayload: models.ActionPayload = callback
|
63 | ? getActionPayload(legacyActionPayload, callback)
|
64 | : {
|
65 | payload: legacyActionPayload.payload,
|
66 | logicArguments: legacyActionPayload.arguments,
|
67 | renderArguments: []
|
68 | }
|
69 |
|
70 | const updatedAction = {
|
71 | ...action,
|
72 | payload: JSON.stringify(actionPayload)
|
73 | }
|
74 |
|
75 | changeResult.isChanged = true
|
76 | changeResult.value = updatedAction
|
77 | changeResult.changes.push(`Payload with old format using single array of arguments was updated to use the new form with separate logic and render arguments.`)
|
78 | }
|
79 | }
|
80 |
|
81 | return changeResult
|
82 | }
|
83 |
|
84 | export function getActionPayload(legacyActionPayload: models.ActionPayloadSingleArguments, callback: models.Callback): models.ActionPayload {
|
85 | return legacyActionPayload.arguments.reduce<models.ActionPayload>((actionPayload, argument) => {
|
86 | const isMovedToLogicArgument = callback.logicArguments.some(la => la === argument.parameter)
|
87 | if (isMovedToLogicArgument) {
|
88 | actionPayload.logicArguments.push(argument)
|
89 | }
|
90 |
|
91 | const isMovedToRenderArgument = callback.renderArguments.some(la => la === argument.parameter)
|
92 | if (isMovedToRenderArgument) {
|
93 | actionPayload.renderArguments.push(argument)
|
94 | }
|
95 |
|
96 | return actionPayload
|
97 | }, {
|
98 | payload: legacyActionPayload.payload,
|
99 | logicArguments: [],
|
100 | renderArguments: []
|
101 | })
|
102 | }
|
103 |
|
\ | No newline at end of file |