@things-factory/integration-base 8.0.0-beta.9 → 8.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/engine/connector/http-connector.js +1 -1
- package/dist-server/engine/connector/http-connector.js.map +1 -1
- package/dist-server/engine/connector/index.d.ts +0 -1
- package/dist-server/engine/connector/index.js +0 -1
- package/dist-server/engine/connector/index.js.map +1 -1
- package/dist-server/engine/index.d.ts +0 -1
- package/dist-server/engine/index.js +0 -1
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/task/headless-post.js +33 -19
- package/dist-server/engine/task/headless-post.js.map +1 -1
- package/dist-server/engine/task/headless-scrap.js +13 -20
- package/dist-server/engine/task/headless-scrap.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -12
- package/server/controllers/index.ts +2 -0
- package/server/controllers/publish-data.ts +29 -0
- package/server/controllers/scenario-controller.ts +156 -0
- package/server/engine/analyzer/analyze-integration.ts +115 -0
- package/server/engine/connection-manager.ts +239 -0
- package/server/engine/connector/echo-back-connector.ts +51 -0
- package/server/engine/connector/echo-back-server.ts +72 -0
- package/server/engine/connector/graphql-connector.ts +126 -0
- package/server/engine/connector/http-connector.ts +65 -0
- package/server/engine/connector/index.ts +12 -0
- package/server/engine/connector/mqtt-connector.ts +78 -0
- package/server/engine/connector/mssql-connector.ts +152 -0
- package/server/engine/connector/mysql-connector.ts +94 -0
- package/server/engine/connector/operato-connector.ts +264 -0
- package/server/engine/connector/oracle-connector.ts +218 -0
- package/server/engine/connector/postgresql-connector.ts +152 -0
- package/server/engine/connector/proxy-connector.ts +53 -0
- package/server/engine/connector/socket-server.ts +86 -0
- package/server/engine/connector/sqlite-connector.ts +69 -0
- package/server/engine/edge-client.ts +45 -0
- package/server/engine/index.ts +10 -0
- package/server/engine/pending-queue.ts +97 -0
- package/server/engine/scenario-engine.ts +106 -0
- package/server/engine/task/book-up-scenario.ts +73 -0
- package/server/engine/task/csv-readline.ts +127 -0
- package/server/engine/task/data-accessor.ts +36 -0
- package/server/engine/task/data-mapper.ts +47 -0
- package/server/engine/task/database-query.ts +56 -0
- package/server/engine/task/echo-receive.ts +21 -0
- package/server/engine/task/echo-send.ts +32 -0
- package/server/engine/task/empty-check.ts +38 -0
- package/server/engine/task/end.ts +18 -0
- package/server/engine/task/floating-point.ts +71 -0
- package/server/engine/task/goto.ts +27 -0
- package/server/engine/task/graphql-mutate.ts +79 -0
- package/server/engine/task/graphql-query.ts +78 -0
- package/server/engine/task/headless-post.ts +147 -0
- package/server/engine/task/headless-scrap.ts +80 -0
- package/server/engine/task/http-get.ts +117 -0
- package/server/engine/task/http-post.ts +148 -0
- package/server/engine/task/index.ts +45 -0
- package/server/engine/task/jsonata.ts +45 -0
- package/server/engine/task/local-graphql-mutate.ts +100 -0
- package/server/engine/task/local-graphql-query.ts +100 -0
- package/server/engine/task/log.ts +78 -0
- package/server/engine/task/mqtt-publish.ts +45 -0
- package/server/engine/task/mqtt-subscribe.ts +139 -0
- package/server/engine/task/mssql-procedure.ts +128 -0
- package/server/engine/task/oracle-procedure.ts +124 -0
- package/server/engine/task/pick-pending-scenario.ts +80 -0
- package/server/engine/task/publish.ts +40 -0
- package/server/engine/task/random.ts +53 -0
- package/server/engine/task/reset-pending-queue.ts +17 -0
- package/server/engine/task/script.ts +63 -0
- package/server/engine/task/set-domain.ts +37 -0
- package/server/engine/task/sleep.ts +34 -0
- package/server/engine/task/socket-listener.ts +96 -0
- package/server/engine/task/state-group-read.ts +69 -0
- package/server/engine/task/state-read.ts +56 -0
- package/server/engine/task/state-write.ts +65 -0
- package/server/engine/task/stop-scenario.ts +44 -0
- package/server/engine/task/sub-scenario.ts +57 -0
- package/server/engine/task/switch-goto.ts +43 -0
- package/server/engine/task/switch-range-goto.ts +53 -0
- package/server/engine/task/switch-range-scenario.ts +79 -0
- package/server/engine/task/switch-range-set.ts +48 -0
- package/server/engine/task/switch-scenario.ts +67 -0
- package/server/engine/task/switch-set.ts +37 -0
- package/server/engine/task/throw.ts +27 -0
- package/server/engine/task/utils/headless-pool-for-scenario.ts +71 -0
- package/server/engine/task/utils/substitute.ts +44 -0
- package/server/engine/task/variables.ts +17 -0
- package/server/engine/task-registry.ts +23 -0
- package/server/engine/types.ts +114 -0
- package/server/index.ts +20 -0
- package/server/migrations/index.ts +9 -0
- package/server/restful/index.ts +1 -0
- package/server/restful/unstable/index.ts +7 -0
- package/server/restful/unstable/run-scenario.ts +51 -0
- package/server/restful/unstable/scenario-instance.ts +52 -0
- package/server/restful/unstable/scenario-instances.ts +80 -0
- package/server/restful/unstable/scenario.ts +41 -0
- package/server/restful/unstable/scenarios.ts +69 -0
- package/server/restful/unstable/start-scenario.ts +33 -0
- package/server/restful/unstable/stop-scenario.ts +30 -0
- package/server/routers/scenario-schedule-callback-router.ts +69 -0
- package/server/routers/scenario-view-router.ts +46 -0
- package/server/routes.ts +30 -0
- package/server/service/analysis/analysis-query.ts +13 -0
- package/server/service/analysis/index.ts +3 -0
- package/server/service/connection/connection-mutation.ts +190 -0
- package/server/service/connection/connection-query.ts +87 -0
- package/server/service/connection/connection-subscription.ts +104 -0
- package/server/service/connection/connection-type.ts +288 -0
- package/server/service/connection/index.ts +7 -0
- package/server/service/connector/connector-query.ts +62 -0
- package/server/service/connector/connector-type.ts +29 -0
- package/server/service/connector/index.ts +4 -0
- package/server/service/index.ts +52 -0
- package/server/service/payload-log/index.ts +7 -0
- package/server/service/payload-log/payload-log-mutation.ts +151 -0
- package/server/service/payload-log/payload-log-query.ts +49 -0
- package/server/service/payload-log/payload-log-type.ts +36 -0
- package/server/service/payload-log/payload-log.ts +100 -0
- package/server/service/property-spec.ts +24 -0
- package/server/service/scenario/index.ts +6 -0
- package/server/service/scenario/scenario-mutation.ts +396 -0
- package/server/service/scenario/scenario-query.ts +109 -0
- package/server/service/scenario/scenario-type.ts +78 -0
- package/server/service/scenario/scenario.ts +124 -0
- package/server/service/scenario-flow/scenario-flow.ts +17 -0
- package/server/service/scenario-instance/index.ts +6 -0
- package/server/service/scenario-instance/scenario-instance-mutation.ts +44 -0
- package/server/service/scenario-instance/scenario-instance-query.ts +42 -0
- package/server/service/scenario-instance/scenario-instance-subscription.ts +118 -0
- package/server/service/scenario-instance/scenario-instance-type.ts +563 -0
- package/server/service/scenario-queue/index.ts +4 -0
- package/server/service/scenario-queue/scenario-queue-subscription.ts +55 -0
- package/server/service/scenario-queue/scenario-queue-type.ts +27 -0
- package/server/service/state-register/data-resolver.ts +56 -0
- package/server/service/state-register/index.ts +8 -0
- package/server/service/state-register/state-register-mutation.ts +166 -0
- package/server/service/state-register/state-register-query.ts +80 -0
- package/server/service/state-register/state-register-type.ts +80 -0
- package/server/service/state-register/state-register.ts +113 -0
- package/server/service/step/index.ts +6 -0
- package/server/service/step/step-mutation.ts +52 -0
- package/server/service/step/step-query.ts +55 -0
- package/server/service/step/step-type.ts +215 -0
- package/server/service/task-type/index.ts +4 -0
- package/server/service/task-type/task-type-query.ts +95 -0
- package/server/service/task-type/task-type-type.ts +29 -0
- package/translations/en.json +4 -12
- package/translations/ja.json +4 -12
- package/translations/ko.json +4 -12
- package/translations/ms.json +4 -12
- package/translations/zh.json +4 -12
- package/dist-server/engine/connector/headless-connector.d.ts +0 -23
- package/dist-server/engine/connector/headless-connector.js +0 -357
- package/dist-server/engine/connector/headless-connector.js.map +0 -1
- package/dist-server/engine/resource-pool/headless-pool.d.ts +0 -1
- package/dist-server/engine/resource-pool/headless-pool.js +0 -62
- package/dist-server/engine/resource-pool/headless-pool.js.map +0 -1
- package/dist-server/engine/resource-pool/index.d.ts +0 -1
- package/dist-server/engine/resource-pool/index.js +0 -5
- package/dist-server/engine/resource-pool/index.js.map +0 -1
@@ -0,0 +1,117 @@
|
|
1
|
+
import fetch from 'node-fetch'
|
2
|
+
import 'ses'
|
3
|
+
import { URL } from 'url'
|
4
|
+
import https from 'https'
|
5
|
+
import { TaskRegistry } from '../task-registry'
|
6
|
+
import { ConnectionManager } from '../connection-manager'
|
7
|
+
import { substitute } from './utils/substitute'
|
8
|
+
import { InputStep } from '../../service/step/step-type'
|
9
|
+
import { Context } from '../types'
|
10
|
+
|
11
|
+
async function HttpGet(step: InputStep, { logger, data, domain, user, variables, lng }: Context) {
|
12
|
+
var { connection: connectionName, params: stepOptions } = step
|
13
|
+
var { headers: requestHeaders, searchParams = {}, path } = stepOptions || {}
|
14
|
+
var connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
|
15
|
+
|
16
|
+
if (!connection) {
|
17
|
+
throw new Error(`connection '${connectionName}' is not established.`)
|
18
|
+
}
|
19
|
+
|
20
|
+
var { endpoint, params: connectionParams, authHeaders = {} } = connection
|
21
|
+
|
22
|
+
const compartment = new Compartment({
|
23
|
+
domain,
|
24
|
+
user,
|
25
|
+
lng,
|
26
|
+
data,
|
27
|
+
variables,
|
28
|
+
console
|
29
|
+
})
|
30
|
+
|
31
|
+
let evalPath
|
32
|
+
try {
|
33
|
+
evalPath = compartment.evaluate('`' + path + '`')
|
34
|
+
} catch (err) {
|
35
|
+
throw new Error(`Failed to evaluate path: ${err.message}`)
|
36
|
+
}
|
37
|
+
|
38
|
+
path = evalPath
|
39
|
+
|
40
|
+
requestHeaders =
|
41
|
+
requestHeaders &&
|
42
|
+
Object.entries(requestHeaders as { [key: string]: string }).reduce((sum, [key, value]) => {
|
43
|
+
try {
|
44
|
+
sum[key] = compartment.evaluate('`' + value + '`')
|
45
|
+
} catch (err) {
|
46
|
+
throw new Error(`Failed to evaluate header value: ${err.message}`)
|
47
|
+
}
|
48
|
+
return sum
|
49
|
+
}, {})
|
50
|
+
|
51
|
+
searchParams =
|
52
|
+
searchParams &&
|
53
|
+
Object.entries(searchParams as { [key: string]: string }).reduce((sum, [key, value]) => {
|
54
|
+
try {
|
55
|
+
sum[key] = compartment.evaluate('`' + value + '`')
|
56
|
+
} catch (err) {
|
57
|
+
throw new Error(`Failed to evaluate search param value: ${err.message}`)
|
58
|
+
}
|
59
|
+
return sum
|
60
|
+
}, {})
|
61
|
+
|
62
|
+
var url = new URL(path, endpoint)
|
63
|
+
if (searchParams) {
|
64
|
+
Object.keys(searchParams).forEach(key => {
|
65
|
+
let value = substitute(searchParams[key], data)
|
66
|
+
url.searchParams.append(key, value)
|
67
|
+
})
|
68
|
+
}
|
69
|
+
|
70
|
+
var fetchOptions: any = {
|
71
|
+
method: 'GET',
|
72
|
+
headers: {
|
73
|
+
...requestHeaders,
|
74
|
+
...authHeaders
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
var { rejectUnauthorized } = connectionParams
|
79
|
+
|
80
|
+
if (!rejectUnauthorized) {
|
81
|
+
const httpsAgent = new https.Agent({
|
82
|
+
rejectUnauthorized
|
83
|
+
})
|
84
|
+
fetchOptions.agent = httpsAgent
|
85
|
+
}
|
86
|
+
|
87
|
+
var response = await fetch(url, fetchOptions)
|
88
|
+
|
89
|
+
return {
|
90
|
+
data:
|
91
|
+
response.ok && response.headers.get('content-type').includes('application/json')
|
92
|
+
? await response.json()
|
93
|
+
: await response.text()
|
94
|
+
}
|
95
|
+
}
|
96
|
+
|
97
|
+
HttpGet.parameterSpec = [
|
98
|
+
{
|
99
|
+
type: 'string',
|
100
|
+
name: 'path',
|
101
|
+
label: 'path'
|
102
|
+
},
|
103
|
+
{
|
104
|
+
type: 'http-headers',
|
105
|
+
name: 'headers',
|
106
|
+
label: 'headers'
|
107
|
+
},
|
108
|
+
{
|
109
|
+
type: 'http-parameters',
|
110
|
+
name: 'searchParams',
|
111
|
+
label: 'search-params'
|
112
|
+
}
|
113
|
+
]
|
114
|
+
|
115
|
+
HttpGet.help = 'integration/task/http-get'
|
116
|
+
|
117
|
+
TaskRegistry.registerTaskHandler('http-get', HttpGet)
|
@@ -0,0 +1,148 @@
|
|
1
|
+
import fetch from 'node-fetch'
|
2
|
+
import { URL } from 'url'
|
3
|
+
import 'ses'
|
4
|
+
import { access } from '@things-factory/utils'
|
5
|
+
import { TaskRegistry } from '../task-registry'
|
6
|
+
import { ConnectionManager } from '../connection-manager'
|
7
|
+
import https from 'https'
|
8
|
+
import { InputStep } from '../../service/step/step-type'
|
9
|
+
import { Context } from '../types'
|
10
|
+
|
11
|
+
async function HttpPost(step: InputStep, { logger, data, domain, user, variables, lng }: Context) {
|
12
|
+
var { connection: connectionName, params: stepOptions } = step
|
13
|
+
var { headers: requestHeaders, contentType, path, accessor } = stepOptions || {}
|
14
|
+
|
15
|
+
var connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
|
16
|
+
|
17
|
+
if (!connection) {
|
18
|
+
throw new Error(`connection '${connectionName}' is not established.`)
|
19
|
+
}
|
20
|
+
|
21
|
+
var { endpoint, params: connectionParams, authHeaders = {} } = connection
|
22
|
+
|
23
|
+
const compartment = new Compartment({
|
24
|
+
domain,
|
25
|
+
user,
|
26
|
+
lng,
|
27
|
+
data,
|
28
|
+
variables,
|
29
|
+
console
|
30
|
+
})
|
31
|
+
|
32
|
+
let evalPath
|
33
|
+
try {
|
34
|
+
evalPath = compartment.evaluate('`' + path + '`')
|
35
|
+
} catch (err) {
|
36
|
+
throw new Error(`Failed to evaluate path: ${err.message}`)
|
37
|
+
}
|
38
|
+
|
39
|
+
path = evalPath
|
40
|
+
|
41
|
+
requestHeaders =
|
42
|
+
requestHeaders &&
|
43
|
+
Object.entries(requestHeaders as { [key: string]: string }).reduce((sum, [key, value]) => {
|
44
|
+
try {
|
45
|
+
sum[key] = compartment.evaluate('`' + value + '`')
|
46
|
+
} catch (err) {
|
47
|
+
throw new Error(`Failed to evaluate header value: ${err.message}`)
|
48
|
+
}
|
49
|
+
return sum
|
50
|
+
}, {})
|
51
|
+
|
52
|
+
var url = new URL(path, endpoint)
|
53
|
+
var headers = {
|
54
|
+
...authHeaders,
|
55
|
+
...requestHeaders
|
56
|
+
}
|
57
|
+
|
58
|
+
var body = access(accessor, data)
|
59
|
+
if (contentType && body) {
|
60
|
+
headers['content-type'] = contentType
|
61
|
+
switch (contentType) {
|
62
|
+
case 'text/plain':
|
63
|
+
body = JSON.stringify(body)
|
64
|
+
break
|
65
|
+
case 'application/json':
|
66
|
+
body = JSON.stringify(body)
|
67
|
+
break
|
68
|
+
case 'application/x-www-form-urlencoded':
|
69
|
+
const searchParams = new URLSearchParams()
|
70
|
+
for (const prop in body) {
|
71
|
+
searchParams.set(prop, body[prop])
|
72
|
+
}
|
73
|
+
body = searchParams
|
74
|
+
break
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
var fetchOptions: any = {
|
79
|
+
method: 'POST',
|
80
|
+
headers,
|
81
|
+
body
|
82
|
+
}
|
83
|
+
|
84
|
+
var { rejectUnauthorized } = connectionParams
|
85
|
+
|
86
|
+
if (!rejectUnauthorized) {
|
87
|
+
const httpsAgent = new https.Agent({
|
88
|
+
rejectUnauthorized
|
89
|
+
})
|
90
|
+
fetchOptions.agent = httpsAgent
|
91
|
+
}
|
92
|
+
|
93
|
+
var response = await fetch(url, fetchOptions)
|
94
|
+
|
95
|
+
return {
|
96
|
+
data:
|
97
|
+
response.ok && response.headers.get('content-type').includes('application/json')
|
98
|
+
? await response.json()
|
99
|
+
: await response.text()
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
HttpPost.parameterSpec = [
|
104
|
+
{
|
105
|
+
type: 'string',
|
106
|
+
name: 'path',
|
107
|
+
label: 'path'
|
108
|
+
},
|
109
|
+
{
|
110
|
+
type: 'http-headers',
|
111
|
+
name: 'headers',
|
112
|
+
label: 'headers'
|
113
|
+
},
|
114
|
+
{
|
115
|
+
type: 'select',
|
116
|
+
name: 'contentType',
|
117
|
+
label: 'content-type',
|
118
|
+
property: {
|
119
|
+
options: [
|
120
|
+
{
|
121
|
+
display: '',
|
122
|
+
value: ''
|
123
|
+
},
|
124
|
+
{
|
125
|
+
display: 'application/json',
|
126
|
+
value: 'application/json'
|
127
|
+
},
|
128
|
+
{
|
129
|
+
display: 'text/plain',
|
130
|
+
value: 'text/plain'
|
131
|
+
},
|
132
|
+
{
|
133
|
+
display: 'application/x-www-form-urlencoded',
|
134
|
+
value: 'application/x-www-form-urlencoded'
|
135
|
+
}
|
136
|
+
]
|
137
|
+
}
|
138
|
+
},
|
139
|
+
{
|
140
|
+
type: 'scenario-step-input',
|
141
|
+
name: 'accessor',
|
142
|
+
label: 'accessor'
|
143
|
+
}
|
144
|
+
]
|
145
|
+
|
146
|
+
HttpPost.help = 'integration/task/http-post'
|
147
|
+
|
148
|
+
TaskRegistry.registerTaskHandler('http-post', HttpPost)
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import './echo-send'
|
2
|
+
import './echo-receive'
|
3
|
+
import './sleep'
|
4
|
+
import './log'
|
5
|
+
import './publish'
|
6
|
+
import './http-get'
|
7
|
+
import './http-post'
|
8
|
+
import './graphql-query'
|
9
|
+
import './graphql-mutate'
|
10
|
+
import './local-graphql-query'
|
11
|
+
import './local-graphql-mutate'
|
12
|
+
import './sub-scenario'
|
13
|
+
import './stop-scenario'
|
14
|
+
import './book-up-scenario'
|
15
|
+
import './pick-pending-scenario'
|
16
|
+
import './reset-pending-queue'
|
17
|
+
import './empty-check'
|
18
|
+
import './goto'
|
19
|
+
import './end'
|
20
|
+
import './switch-goto'
|
21
|
+
import './switch-range-goto'
|
22
|
+
import './switch-scenario'
|
23
|
+
import './switch-range-scenario'
|
24
|
+
import './switch-set'
|
25
|
+
import './switch-range-set'
|
26
|
+
import './script'
|
27
|
+
import './database-query'
|
28
|
+
import './mqtt-subscribe'
|
29
|
+
import './mqtt-publish'
|
30
|
+
import './throw'
|
31
|
+
import './variables'
|
32
|
+
import './floating-point'
|
33
|
+
import './socket-listener'
|
34
|
+
import './random'
|
35
|
+
import './csv-readline'
|
36
|
+
import './data-mapper'
|
37
|
+
import './headless-post'
|
38
|
+
import './headless-scrap'
|
39
|
+
import './set-domain'
|
40
|
+
import './mssql-procedure'
|
41
|
+
import './oracle-procedure'
|
42
|
+
import './jsonata'
|
43
|
+
import './state-read'
|
44
|
+
import './state-write'
|
45
|
+
import './state-group-read'
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import jsonata from 'jsonata'
|
2
|
+
|
3
|
+
import { TaskRegistry } from '../task-registry'
|
4
|
+
import { InputStep } from '../../service/step/step-type'
|
5
|
+
import { Context } from '../types'
|
6
|
+
|
7
|
+
async function JSonata(step: InputStep, context: Context) {
|
8
|
+
var {
|
9
|
+
params: { expression }
|
10
|
+
} = step
|
11
|
+
|
12
|
+
const { domain, user, data, variables, lng, logger } = context
|
13
|
+
|
14
|
+
var result = jsonata(expression).evaluate({
|
15
|
+
domain,
|
16
|
+
user,
|
17
|
+
lng,
|
18
|
+
data,
|
19
|
+
variables
|
20
|
+
})
|
21
|
+
|
22
|
+
return {
|
23
|
+
data: result
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
JSonata.parameterSpec = [
|
28
|
+
{
|
29
|
+
type: 'textarea',
|
30
|
+
name: 'expression',
|
31
|
+
label: 'jsonata-expression',
|
32
|
+
property: {
|
33
|
+
language: 'javascript',
|
34
|
+
showLineNumbers: true
|
35
|
+
},
|
36
|
+
styles: {
|
37
|
+
flex: '1'
|
38
|
+
}
|
39
|
+
}
|
40
|
+
]
|
41
|
+
|
42
|
+
JSonata.connectorFree = true
|
43
|
+
JSonata.help = 'integration/task/jsonata'
|
44
|
+
|
45
|
+
TaskRegistry.registerTaskHandler('jsonata', JSonata)
|
@@ -0,0 +1,100 @@
|
|
1
|
+
import gql from 'graphql-tag'
|
2
|
+
import 'ses'
|
3
|
+
|
4
|
+
import { User } from '@things-factory/auth-base'
|
5
|
+
import { getRepository } from '@things-factory/shell'
|
6
|
+
import { access } from '@things-factory/utils'
|
7
|
+
|
8
|
+
import { TaskRegistry } from '../task-registry'
|
9
|
+
import { InputStep } from '../../service/step/step-type'
|
10
|
+
import { Context } from '../types'
|
11
|
+
|
12
|
+
async function LocalGraphqlMutate(step: InputStep, context: Context) {
|
13
|
+
var { params, updaterId } = step
|
14
|
+
var { mutation, variables: variablesAccessorMap, headers } = params || {}
|
15
|
+
var { logger, client, domain, user, data, variables, lng } = context
|
16
|
+
|
17
|
+
user =
|
18
|
+
user ||
|
19
|
+
(await getRepository(User).findOne({
|
20
|
+
where: { id: updaterId },
|
21
|
+
relations: ['domains']
|
22
|
+
}))
|
23
|
+
|
24
|
+
const compartment = new Compartment({
|
25
|
+
domain,
|
26
|
+
user,
|
27
|
+
lng,
|
28
|
+
data,
|
29
|
+
variables,
|
30
|
+
console
|
31
|
+
})
|
32
|
+
|
33
|
+
let evalMutation
|
34
|
+
try {
|
35
|
+
evalMutation = compartment.evaluate('`' + mutation + '`')
|
36
|
+
} catch (err) {
|
37
|
+
throw new Error(`Failed to evaluate mutation: ${err.message}`)
|
38
|
+
}
|
39
|
+
|
40
|
+
mutation = evalMutation
|
41
|
+
|
42
|
+
const queryVariables = Object.keys(variablesAccessorMap || {}).reduce((variables, key) => {
|
43
|
+
const accessor = variablesAccessorMap[key]
|
44
|
+
variables[key] = access(accessor, data)
|
45
|
+
return variables
|
46
|
+
}, {})
|
47
|
+
|
48
|
+
var { data: mutateResult, errors } = await client.mutate({
|
49
|
+
mutation: gql`
|
50
|
+
${mutation}
|
51
|
+
`,
|
52
|
+
variables: queryVariables,
|
53
|
+
headers,
|
54
|
+
context: {
|
55
|
+
state: {
|
56
|
+
domain,
|
57
|
+
user
|
58
|
+
}
|
59
|
+
}
|
60
|
+
})
|
61
|
+
|
62
|
+
if (errors) {
|
63
|
+
errors.forEach(error => {
|
64
|
+
logger.error('GraphQL Error: %s', error)
|
65
|
+
})
|
66
|
+
}
|
67
|
+
|
68
|
+
return {
|
69
|
+
data: mutateResult
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
LocalGraphqlMutate.parameterSpec = [
|
74
|
+
{
|
75
|
+
type: 'graphql',
|
76
|
+
name: 'mutation',
|
77
|
+
label: 'mutation',
|
78
|
+
property: {
|
79
|
+
showLineNumbers: true
|
80
|
+
},
|
81
|
+
styles: {
|
82
|
+
flex: 1
|
83
|
+
}
|
84
|
+
},
|
85
|
+
{
|
86
|
+
type: 'key-values',
|
87
|
+
name: 'variables',
|
88
|
+
label: 'variables'
|
89
|
+
},
|
90
|
+
{
|
91
|
+
type: 'key-values',
|
92
|
+
name: 'headers',
|
93
|
+
label: 'headers'
|
94
|
+
}
|
95
|
+
]
|
96
|
+
|
97
|
+
LocalGraphqlMutate.connectorFree = true
|
98
|
+
LocalGraphqlMutate.help = 'integration/task/local-graphql-mutate'
|
99
|
+
|
100
|
+
TaskRegistry.registerTaskHandler('local-graphql-mutate', LocalGraphqlMutate)
|
@@ -0,0 +1,100 @@
|
|
1
|
+
import gql from 'graphql-tag'
|
2
|
+
import 'ses'
|
3
|
+
|
4
|
+
import { User } from '@things-factory/auth-base'
|
5
|
+
import { getRepository } from '@things-factory/shell'
|
6
|
+
import { access } from '@things-factory/utils'
|
7
|
+
|
8
|
+
import { TaskRegistry } from '../task-registry'
|
9
|
+
import { InputStep } from '../../service/step/step-type'
|
10
|
+
import { Context } from '../types'
|
11
|
+
|
12
|
+
async function LocalGraphqlQuery(step: InputStep, context: Context) {
|
13
|
+
var { params, updaterId } = step
|
14
|
+
var { query, variables: variablesAccessorMap, headers } = params || {}
|
15
|
+
var { logger, client, domain, user, data, variables, lng } = context
|
16
|
+
|
17
|
+
user =
|
18
|
+
user ||
|
19
|
+
(await getRepository(User).findOne({
|
20
|
+
where: { id: updaterId },
|
21
|
+
relations: ['domains']
|
22
|
+
}))
|
23
|
+
|
24
|
+
const compartment = new Compartment({
|
25
|
+
domain,
|
26
|
+
user,
|
27
|
+
lng,
|
28
|
+
data,
|
29
|
+
variables,
|
30
|
+
console
|
31
|
+
})
|
32
|
+
|
33
|
+
let evalQuery
|
34
|
+
try {
|
35
|
+
evalQuery = compartment.evaluate('`' + query + '`')
|
36
|
+
} catch (err) {
|
37
|
+
throw new Error(`Failed to evaluate query: ${err.message}`)
|
38
|
+
}
|
39
|
+
|
40
|
+
query = evalQuery
|
41
|
+
|
42
|
+
const queryVariables = Object.keys(variablesAccessorMap || {}).reduce((variables, key) => {
|
43
|
+
const accessor = variablesAccessorMap[key]
|
44
|
+
variables[key] = access(accessor, data)
|
45
|
+
return variables
|
46
|
+
}, {})
|
47
|
+
|
48
|
+
var { data: queryResult, errors } = await client.query({
|
49
|
+
query: gql`
|
50
|
+
${query}
|
51
|
+
`,
|
52
|
+
variables: queryVariables,
|
53
|
+
headers,
|
54
|
+
context: {
|
55
|
+
state: {
|
56
|
+
domain,
|
57
|
+
user
|
58
|
+
}
|
59
|
+
}
|
60
|
+
})
|
61
|
+
|
62
|
+
if (errors) {
|
63
|
+
errors.forEach(error => {
|
64
|
+
logger.error('GraphQL Error: %s', error)
|
65
|
+
})
|
66
|
+
}
|
67
|
+
|
68
|
+
return {
|
69
|
+
data: queryResult
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
LocalGraphqlQuery.parameterSpec = [
|
74
|
+
{
|
75
|
+
type: 'graphql',
|
76
|
+
name: 'query',
|
77
|
+
label: 'query',
|
78
|
+
property: {
|
79
|
+
showLineNumbers: true
|
80
|
+
},
|
81
|
+
styles: {
|
82
|
+
flex: 1
|
83
|
+
}
|
84
|
+
},
|
85
|
+
{
|
86
|
+
type: 'key-values',
|
87
|
+
name: 'variables',
|
88
|
+
label: 'variables'
|
89
|
+
},
|
90
|
+
{
|
91
|
+
type: 'key-values',
|
92
|
+
name: 'headers',
|
93
|
+
label: 'headers'
|
94
|
+
}
|
95
|
+
]
|
96
|
+
|
97
|
+
LocalGraphqlQuery.connectorFree = true
|
98
|
+
LocalGraphqlQuery.help = 'integration/task/local-graphql-query'
|
99
|
+
|
100
|
+
TaskRegistry.registerTaskHandler('local-graphql-query', LocalGraphqlQuery)
|
@@ -0,0 +1,78 @@
|
|
1
|
+
import { access, hasTemplateExpression } from '@things-factory/utils'
|
2
|
+
import 'ses'
|
3
|
+
import { TaskRegistry } from '../task-registry'
|
4
|
+
import { InputStep } from '../../service/step/step-type'
|
5
|
+
import { Context } from '../types'
|
6
|
+
|
7
|
+
async function Log(step: InputStep, { logger, data, variables, domain, user, lng }: Context) {
|
8
|
+
var {
|
9
|
+
params: { message, accessor, level = 'info' }
|
10
|
+
} = step
|
11
|
+
|
12
|
+
if (hasTemplateExpression(message)) {
|
13
|
+
const compartment = new Compartment({
|
14
|
+
domain,
|
15
|
+
user,
|
16
|
+
lng,
|
17
|
+
data,
|
18
|
+
variables,
|
19
|
+
console
|
20
|
+
})
|
21
|
+
|
22
|
+
try {
|
23
|
+
message = compartment.evaluate('`' + message + '`')
|
24
|
+
} catch (err) {
|
25
|
+
throw new Error(`Failed to evaluate message: ${err.message}`)
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
accessor = access(accessor, data)
|
30
|
+
|
31
|
+
if (accessor) {
|
32
|
+
if (typeof accessor !== 'string') {
|
33
|
+
accessor = JSON.stringify(accessor, null, 2)
|
34
|
+
}
|
35
|
+
message += ': ' + accessor
|
36
|
+
}
|
37
|
+
|
38
|
+
switch (level) {
|
39
|
+
case 'error':
|
40
|
+
logger.error(message)
|
41
|
+
return
|
42
|
+
case 'warn':
|
43
|
+
logger.warn(message)
|
44
|
+
return
|
45
|
+
default:
|
46
|
+
logger.info(message)
|
47
|
+
}
|
48
|
+
|
49
|
+
return {
|
50
|
+
data: message
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
Log.parameterSpec = [
|
55
|
+
{
|
56
|
+
type: 'string',
|
57
|
+
name: 'message',
|
58
|
+
label: 'message'
|
59
|
+
},
|
60
|
+
{
|
61
|
+
type: 'scenario-step-input',
|
62
|
+
name: 'accessor',
|
63
|
+
label: 'accessor'
|
64
|
+
},
|
65
|
+
{
|
66
|
+
type: 'select',
|
67
|
+
name: 'level',
|
68
|
+
label: 'level',
|
69
|
+
property: {
|
70
|
+
options: ['info', 'warn', 'error']
|
71
|
+
}
|
72
|
+
}
|
73
|
+
]
|
74
|
+
|
75
|
+
Log.connectorFree = true
|
76
|
+
Log.help = 'integration/task/log'
|
77
|
+
|
78
|
+
TaskRegistry.registerTaskHandler('log', Log)
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import { access } from '@things-factory/utils'
|
2
|
+
import { TaskRegistry } from '../task-registry'
|
3
|
+
import { ConnectionManager } from '../connection-manager'
|
4
|
+
import { InputStep } from '../../service/step/step-type'
|
5
|
+
import { Context } from '../types'
|
6
|
+
|
7
|
+
async function MqttPublish(step: InputStep, { logger, data, domain }: Context) {
|
8
|
+
var {
|
9
|
+
connection: connectionName,
|
10
|
+
params: { topic, accessor }
|
11
|
+
} = step
|
12
|
+
|
13
|
+
const { client } = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
|
14
|
+
if (!client) {
|
15
|
+
throw Error(`connection is not found : ${connectionName}`)
|
16
|
+
}
|
17
|
+
|
18
|
+
if (!topic || !accessor) {
|
19
|
+
throw Error(`topic and accessor should be defined: : topic - '${topic}', accessor - '${accessor}'`)
|
20
|
+
}
|
21
|
+
|
22
|
+
var message = JSON.stringify(access(accessor, data))
|
23
|
+
await client.publish(topic, message)
|
24
|
+
|
25
|
+
return {
|
26
|
+
data: message
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
MqttPublish.parameterSpec = [
|
31
|
+
{
|
32
|
+
type: 'string',
|
33
|
+
name: 'topic',
|
34
|
+
label: 'topic'
|
35
|
+
},
|
36
|
+
{
|
37
|
+
type: 'scenario-step-input',
|
38
|
+
name: 'accessor',
|
39
|
+
label: 'accessor'
|
40
|
+
}
|
41
|
+
]
|
42
|
+
|
43
|
+
MqttPublish.help = 'integration/task/mqtt-publish'
|
44
|
+
|
45
|
+
TaskRegistry.registerTaskHandler('mqtt-publish', MqttPublish)
|