Skip to content

Commit a0e8299

Browse files
authored
Merge pull request #385
refactor(20321): Refactoring the policy loading * fix(20360): fix the serialisation of multiple scripts * refactor(20360): export and refactor function name utilities * refactor(20321): refactor data policy loading * refactor(20321): refactor filter loading * refactor(20321): refactor validator loading * refactor(20321): refactor data policy pipelines * refactor(20321): refactor scripts * refactor(20321): refactor schemas * refactor(20321): refactor data policy * refactor(20321): refactor behaviour policy loading * refactor(20321): refactor behaviour policy node * refactor(20321): refactor client filter node * refactor(20321): refactor transition node * refactor(20321): refactor behaviour pipelines * fix(20321): fix bug with the dual iteration of transitions and pipelines * fix(20321): fix typos * fix(20321): fix condition for dry run status icon * refactor(21481): remove the unnecessary "as" casts * refactor(20321): refactor loops!
1 parent 0ffa1f6 commit a0e8299

File tree

14 files changed

+249
-190
lines changed

14 files changed

+249
-190
lines changed

hivemq-edge/src/frontend/src/extensions/datahub/components/nodes/NodeWrapper.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ export const NodeWrapper: FC<NodeWrapperProps> = ({ selected, children, route, w
3636
boxShadow: '0 0 10px 2px rgba(0,121,36, 0.75), 0 1px 1px rgb(0 0 0 / 15%)',
3737
}
3838

39+
const isDryRun = data.dryRunStatus !== undefined && data.dryRunStatus !== PolicyDryRunStatus.IDLE
40+
3941
return (
4042
<Card
4143
variant="elevated"
@@ -52,7 +54,7 @@ export const NodeWrapper: FC<NodeWrapperProps> = ({ selected, children, route, w
5254
setInternalSelection(true)
5355
}}
5456
>
55-
{data.dryRunStatus !== PolicyDryRunStatus.IDLE && (
57+
{isDryRun && (
5658
<Avatar
5759
position="absolute"
5860
left="-1rem"

hivemq-edge/src/frontend/src/extensions/datahub/components/pages/PolicyEditorLoader.tsx

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { FC, useEffect } from 'react'
22
import { useParams } from 'react-router-dom'
33
import { useTranslation } from 'react-i18next'
44
import { Spinner, useToast } from '@chakra-ui/react'
5+
import { Connection, NodeAddChange } from 'reactflow'
56

67
import ErrorMessage from '@/components/ErrorMessage.tsx'
78

@@ -44,12 +45,28 @@ export const DataPolicyLoader: FC<PolicyLoaderProps> = ({ policyId }) => {
4445
if (!dataPolicy || !schemas || !scripts) return
4546

4647
try {
47-
// TODO[19966] should be loaded in a temp var until whole graph is correct
4848
store.reset()
49-
loadDataPolicy(dataPolicy, store)
50-
loadTopicFilter(dataPolicy, store)
51-
loadValidators(dataPolicy, schemas.items || [], store)
52-
loadDataPolicyPipelines(dataPolicy, schemas.items || [], scripts.items || [], store)
49+
const policyNode = loadDataPolicy(dataPolicy)
50+
const filterNode = loadTopicFilter(dataPolicy, policyNode.item)
51+
const validatorNodes = loadValidators(dataPolicy, schemas.items || [], policyNode.item)
52+
const pipelines = loadDataPolicyPipelines(dataPolicy, schemas.items || [], scripts.items || [], policyNode.item)
53+
54+
const allArtefactsLoaded = [policyNode, ...filterNode, ...validatorNodes, ...pipelines]
55+
56+
const nodeChanges = allArtefactsLoaded.reduce<NodeAddChange[]>((acc, element) => {
57+
const allIds = acc.map((nodeAddChange) => nodeAddChange.item.id)
58+
const nodeChange = element as NodeAddChange
59+
if (nodeChange.item && !allIds.includes(nodeChange.item.id)) acc.push(nodeChange)
60+
return acc
61+
}, [])
62+
const edgeConnects = allArtefactsLoaded.filter(
63+
(element): element is Connection => !!(element as Connection).source
64+
)
65+
66+
store.onNodesChange(nodeChanges)
67+
for (const connection of edgeConnects) {
68+
store.onConnect(connection)
69+
}
5370
store.setStatus(DesignerStatus.LOADED, { name: dataPolicy.id })
5471
} catch (error) {
5572
let message
@@ -94,11 +111,31 @@ export const BehaviorPolicyLoader: FC<PolicyLoaderProps> = ({ policyId }) => {
94111
if (!behaviorPolicy || !schemas || !scripts) return
95112

96113
try {
97-
// TODO[19966] should be loaded in a temp var until whole graph is correct
98114
store.reset()
99-
loadBehaviorPolicy(behaviorPolicy, store)
100-
loadClientFilter(behaviorPolicy, store)
101-
loadTransitions(behaviorPolicy, schemas.items || [], scripts.items || [], store)
115+
const behaviorPolicyNode = loadBehaviorPolicy(behaviorPolicy)
116+
const filterNode = loadClientFilter(behaviorPolicy, behaviorPolicyNode.item)
117+
const pipelines = loadTransitions(
118+
behaviorPolicy,
119+
schemas.items || [],
120+
scripts.items || [],
121+
behaviorPolicyNode.item
122+
)
123+
124+
const allArtefactsLoaded = [behaviorPolicyNode, ...filterNode, ...pipelines]
125+
const nodeChanges = allArtefactsLoaded.reduce<NodeAddChange[]>((acc, element) => {
126+
const allIds = acc.map((nodeAddChange) => nodeAddChange.item.id)
127+
const nodeChange = element as NodeAddChange
128+
if (nodeChange.item && !allIds.includes(nodeChange.item.id)) acc.push(nodeChange)
129+
return acc
130+
}, [])
131+
const edgeConnects = allArtefactsLoaded.filter(
132+
(element): element is Connection => !!(element as Connection).source
133+
)
134+
135+
store.onNodesChange(nodeChanges)
136+
for (const connection of edgeConnects) {
137+
store.onConnect(connection)
138+
}
102139
store.setStatus(DesignerStatus.LOADED, { name: behaviorPolicy.id })
103140
} catch (error) {
104141
let message

hivemq-edge/src/frontend/src/extensions/datahub/designer/behavior_policy/BehaviorPolicyNode.utils.ts

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,7 @@ import { enumFromStringValue } from '@/utils/types.utils.ts'
55
import i18n from '@/config/i18n.config.ts'
66

77
import { PolicyCheckErrors } from '@datahub/designer/validation.errors.ts'
8-
import {
9-
BehaviorPolicyData,
10-
BehaviorPolicyType,
11-
DataHubNodeType,
12-
DryRunResults,
13-
WorkspaceAction,
14-
WorkspaceState,
15-
} from '@datahub/types.ts'
8+
import { BehaviorPolicyData, BehaviorPolicyType, DataHubNodeType, DryRunResults } from '@datahub/types.ts'
169

1710
export function checkValidityModel(behaviorPolicy: Node<BehaviorPolicyData>): DryRunResults<BehaviorPolicyBehavior> {
1811
if (!behaviorPolicy.data.model) {
@@ -54,9 +47,7 @@ export function checkValidityBehaviorPolicy(
5447
}
5548
}
5649

57-
export const loadBehaviorPolicy = (behaviorPolicy: BehaviorPolicy, store: WorkspaceState & WorkspaceAction) => {
58-
const { onNodesChange } = store
59-
50+
export const loadBehaviorPolicy = (behaviorPolicy: BehaviorPolicy): NodeAddChange => {
6051
const model = enumFromStringValue(BehaviorPolicyType, behaviorPolicy.behavior.id)
6152
if (!model)
6253
throw new Error(
@@ -78,5 +69,5 @@ export const loadBehaviorPolicy = (behaviorPolicy: BehaviorPolicy, store: Worksp
7869
},
7970
}
8071

81-
onNodesChange([{ item: behaviorPolicyNode, type: 'add' } as NodeAddChange])
72+
return { item: behaviorPolicyNode, type: 'add' }
8273
}

hivemq-edge/src/frontend/src/extensions/datahub/designer/client_filter/ClientFilterNode.utils.ts

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
1-
import { getIncomers, Node, NodeAddChange, XYPosition } from 'reactflow'
1+
import { Connection, getIncomers, Node, NodeAddChange, XYPosition } from 'reactflow'
22

33
import { getNodeId, isClientFilterNodeType } from '@datahub/utils/node.utils.ts'
44
import { BehaviorPolicy } from '@/api/__generated__'
55
import i18n from '@/config/i18n.config.ts'
66

7-
import {
8-
BehaviorPolicyData,
9-
ClientFilterData,
10-
DataHubNodeType,
11-
DryRunResults,
12-
WorkspaceAction,
13-
WorkspaceState,
14-
} from '@datahub/types.ts'
7+
import { BehaviorPolicyData, ClientFilterData, DataHubNodeType, DryRunResults, WorkspaceState } from '@datahub/types.ts'
158
import { PolicyCheckErrors } from '@datahub/designer/validation.errors.ts'
169
import { CANVAS_POSITION } from '@datahub/designer/checks.utils.ts'
1710

@@ -45,16 +38,17 @@ export function checkValidityClients(
4538
}
4639
}
4740

48-
export const loadClientFilter = (behaviorPolicy: BehaviorPolicy, store: WorkspaceState & WorkspaceAction) => {
49-
const { onNodesChange, onConnect } = store
50-
const BehaviorPolicyNode = store.nodes.find((node) => node.id === behaviorPolicy.id)
51-
if (!BehaviorPolicyNode)
41+
export const loadClientFilter = (
42+
behaviorPolicy: BehaviorPolicy,
43+
behaviorPolicyNode: Node<BehaviorPolicyData>
44+
): (NodeAddChange | Connection)[] => {
45+
if (behaviorPolicyNode.id !== behaviorPolicy.id)
5246
throw new Error(
5347
i18n.t('datahub:error.loading.connection.notFound', { type: DataHubNodeType.BEHAVIOR_POLICY }) as string
5448
)
5549
const position: XYPosition = {
56-
x: BehaviorPolicyNode.position.x + CANVAS_POSITION.Client.x,
57-
y: BehaviorPolicyNode.position.y + CANVAS_POSITION.Client.y,
50+
x: behaviorPolicyNode.position.x + CANVAS_POSITION.Client.x,
51+
y: behaviorPolicyNode.position.y + CANVAS_POSITION.Client.y,
5852
}
5953

6054
const topicNode: Node<ClientFilterData> = {
@@ -66,6 +60,8 @@ export const loadClientFilter = (behaviorPolicy: BehaviorPolicy, store: Workspac
6660
},
6761
}
6862

69-
onNodesChange([{ item: topicNode, type: 'add' } as NodeAddChange])
70-
onConnect({ source: topicNode.id, target: BehaviorPolicyNode.id, sourceHandle: null, targetHandle: null })
63+
return [
64+
{ item: topicNode, type: 'add' },
65+
{ source: topicNode.id, target: behaviorPolicyNode.id, sourceHandle: null, targetHandle: null },
66+
]
7167
}

hivemq-edge/src/frontend/src/extensions/datahub/designer/data_policy/DataPolicyNode.utils.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { getIncomers, getOutgoers, Node, NodeAddChange, XYPosition } from 'reactflow'
22

33
import { DataPolicy, DataPolicyValidator, PolicyOperation } from '@/api/__generated__'
4-
import { DataHubNodeType, DataPolicyData, DryRunResults, WorkspaceAction, WorkspaceState } from '@datahub/types.ts'
4+
import { DataHubNodeType, DataPolicyData, DryRunResults, WorkspaceState } from '@datahub/types.ts'
55
import { PolicyCheckErrors } from '@datahub/designer/validation.errors.ts'
66
import { isTopicFilterNodeType } from '@datahub/utils/node.utils.ts'
77

@@ -115,9 +115,7 @@ export const checkValidityDataPolicy = (
115115
}
116116
}
117117

118-
export const loadDataPolicy = (policy: DataPolicy, store: WorkspaceState & WorkspaceAction) => {
119-
const { onNodesChange } = store
120-
118+
export const loadDataPolicy = (policy: DataPolicy): NodeAddChange => {
121119
const position: XYPosition = {
122120
x: 0,
123121
y: 0,
@@ -130,5 +128,5 @@ export const loadDataPolicy = (policy: DataPolicy, store: WorkspaceState & Works
130128
data: {},
131129
}
132130

133-
onNodesChange([{ item: dataPolicyNode, type: 'add' } as NodeAddChange])
131+
return { item: dataPolicyNode, type: 'add' }
134132
}

hivemq-edge/src/frontend/src/extensions/datahub/designer/operation/OperationNode.utils.ts

Lines changed: 60 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@ import { Connection, getConnectedEdges, getIncomers, Node, NodeAddChange, XYPosi
22

33
import i18n from '@/config/i18n.config.ts'
44

5-
import { BehaviorPolicy, DataPolicy, PolicyOperation, Schema, SchemaReference, Script } from '@/api/__generated__'
5+
import {
6+
BehaviorPolicyOnTransition,
7+
DataPolicy,
8+
PolicyOperation,
9+
Schema,
10+
SchemaReference,
11+
Script,
12+
} from '@/api/__generated__'
613
import {
714
DataHubNodeType,
815
DataPolicyData,
@@ -12,7 +19,6 @@ import {
1219
PolicyOperationArguments,
1320
ResourceStatus,
1421
TransitionData,
15-
WorkspaceAction,
1622
WorkspaceState,
1723
} from '@datahub/types.ts'
1824
import {
@@ -96,11 +102,11 @@ export function checkValidityTransformFunction(
96102
}
97103

98104
const { transform } = operationNode.data.formData as unknown as OperationData.DataHubTransformType
99-
const defaultOrder = transform.length ? transform : scriptNodes.map((e) => e.data?.id)
105+
const defaultOrder = transform.length ? transform : scriptNodes.map((scriptNode) => scriptNode.data?.id)
100106

101107
const allTransformScripts: DryRunResults<PolicyOperation, Script>[] = []
102108
for (const scriptId of defaultOrder) {
103-
const script = scriptNodes.find((e) => e.data?.id === scriptId)
109+
const script = scriptNodes.find((scriptNode) => scriptNode.data?.id === scriptId)
104110
if (script) {
105111
const scriptName = script.node as Node<FunctionData>
106112

@@ -222,52 +228,66 @@ export function checkValidityPipeline(
222228
}
223229

224230
export const loadBehaviorPolicyPipelines = (
225-
behaviorPolicy: BehaviorPolicy,
226-
transitionNode: Node,
231+
behaviorPolicyTransition: BehaviorPolicyOnTransition,
232+
transitionNode: Node<TransitionData>,
227233
schemas: Schema[],
228-
scripts: Script[],
229-
store: WorkspaceState & WorkspaceAction
234+
scripts: Script[]
230235
) => {
231-
for (const transition of behaviorPolicy.onTransitions || []) {
232-
const activeTransition = getActiveTransition(transition)
233-
if (!activeTransition)
234-
throw new Error(i18n.t('datahub:error.loading.operation.noTransition', { source: activeTransition }) as string)
236+
const activeTransition = getActiveTransition(behaviorPolicyTransition)
237+
if (!activeTransition)
238+
throw new Error(i18n.t('datahub:error.loading.operation.noTransition', { source: activeTransition }) as string)
235239

236-
const transitionOnEvent = transition[activeTransition]
237-
if (!transitionOnEvent)
238-
throw new Error(i18n.t('datahub:error.loading.operation.noTransition', { source: activeTransition }) as string)
240+
const transitionOnEvent = behaviorPolicyTransition[activeTransition]
241+
if (!transitionOnEvent)
242+
throw new Error(i18n.t('datahub:error.loading.operation.noTransition', { source: activeTransition }) as string)
239243

240-
loadPipeline(transitionNode, transitionOnEvent.pipeline, null, schemas, scripts, store)
241-
}
244+
return loadPipeline(transitionNode, transitionOnEvent.pipeline, null, schemas, scripts)
242245
}
243246

244247
export const loadDataPolicyPipelines = (
245248
policy: DataPolicy,
246249
schemas: Schema[],
247250
scripts: Script[],
248-
store: WorkspaceState & WorkspaceAction
251+
dataPolicyNode: Node<DataPolicyData>
249252
) => {
250-
const dataNode = store.nodes.find((node) => node.id === policy.id)
251-
if (!dataNode)
253+
if (dataPolicyNode.id !== policy.id)
252254
throw new Error(
253255
i18n.t('datahub:error.loading.connection.notFound', { type: DataHubNodeType.DATA_POLICY }) as string
254256
)
255257

256-
if (policy.onSuccess && policy.onSuccess.pipeline)
257-
loadPipeline(dataNode, policy.onSuccess.pipeline, DataPolicyData.Handle.ON_SUCCESS, schemas, scripts, store)
258-
if (policy.onFailure && policy.onFailure.pipeline)
259-
loadPipeline(dataNode, policy.onFailure.pipeline, DataPolicyData.Handle.ON_ERROR, schemas, scripts, store)
258+
const newNodes: (NodeAddChange | Connection)[] = []
259+
260+
if (policy.onSuccess && policy.onSuccess.pipeline) {
261+
const res = loadPipeline(
262+
dataPolicyNode,
263+
policy.onSuccess.pipeline,
264+
DataPolicyData.Handle.ON_SUCCESS,
265+
schemas,
266+
scripts
267+
)
268+
newNodes.push(...res)
269+
}
270+
if (policy.onFailure && policy.onFailure.pipeline) {
271+
const res = loadPipeline(
272+
dataPolicyNode,
273+
policy.onFailure.pipeline,
274+
DataPolicyData.Handle.ON_ERROR,
275+
schemas,
276+
scripts
277+
)
278+
newNodes.push(...res)
279+
}
280+
281+
return newNodes
260282
}
261283

262284
export const loadPipeline = (
263285
parentNode: Node,
264286
pipeline: Array<PolicyOperation>,
265287
handle: DataPolicyData.Handle | null,
266288
schemas: Schema[],
267-
scripts: Script[],
268-
store: WorkspaceState & WorkspaceAction
289+
scripts: Script[]
269290
) => {
270-
const { onAddNodes, onConnect } = store
271291
if (!parentNode)
272292
throw new Error(i18n.t('datahub:error.loading.schema.unknown', { type: DataHubNodeType.DATA_POLICY }) as string)
273293

@@ -283,6 +303,8 @@ export const loadPipeline = (
283303
return position
284304
}
285305

306+
const newNodes: (NodeAddChange | Connection)[] = []
307+
286308
let connect: Connection = {
287309
source: parentNode.id,
288310
target: null,
@@ -320,24 +342,25 @@ export const loadPipeline = (
320342
},
321343
}
322344

323-
loadSchema(
345+
const deserialisers = loadSchema(
324346
operationNode,
325347
OperationData.Handle.DESERIALISER,
326348
-200,
327349
deserializer.arguments as SchemaReference,
328-
schemas,
329-
store
350+
schemas
330351
)
331-
loadSchema(
352+
const serialisers = loadSchema(
332353
operationNode,
333354
OperationData.Handle.SERIALISER,
334355
200,
335356
policyOperation.arguments as SchemaReference,
336-
schemas,
337-
store
357+
schemas
338358
)
339359

340-
loadScripts(operationNode, functions, scripts, store)
360+
const allScripts = loadScripts(operationNode, functions, scripts)
361+
newNodes.push(...deserialisers)
362+
newNodes.push(...serialisers)
363+
newNodes.push(...allScripts)
341364
}
342365
break
343366
default:
@@ -355,8 +378,7 @@ export const loadPipeline = (
355378

356379
if (!operationNode) throw new Error(i18n.t('datahub:error.loading.operation.unknown') as string)
357380
if (!Array.isArray(operationNode)) {
358-
onAddNodes([{ item: operationNode, type: 'add' } as NodeAddChange])
359-
onConnect({ ...connect, target: operationNode.id })
381+
newNodes.push({ item: operationNode, type: 'add' }, { ...connect, target: operationNode.id })
360382
connect = {
361383
source: operationNode.id,
362384
target: null,
@@ -366,4 +388,6 @@ export const loadPipeline = (
366388
operationNode = undefined
367389
}
368390
}
391+
392+
return newNodes
369393
}

0 commit comments

Comments
 (0)