@things-factory/integration-base 8.0.0-beta.9 → 8.0.0

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.
Files changed (160) hide show
  1. package/dist-server/engine/connector/http-connector.js +1 -1
  2. package/dist-server/engine/connector/http-connector.js.map +1 -1
  3. package/dist-server/engine/connector/index.d.ts +0 -1
  4. package/dist-server/engine/connector/index.js +0 -1
  5. package/dist-server/engine/connector/index.js.map +1 -1
  6. package/dist-server/engine/index.d.ts +0 -1
  7. package/dist-server/engine/index.js +0 -1
  8. package/dist-server/engine/index.js.map +1 -1
  9. package/dist-server/engine/task/headless-post.js +33 -19
  10. package/dist-server/engine/task/headless-post.js.map +1 -1
  11. package/dist-server/engine/task/headless-scrap.js +13 -20
  12. package/dist-server/engine/task/headless-scrap.js.map +1 -1
  13. package/dist-server/tsconfig.tsbuildinfo +1 -1
  14. package/package.json +11 -12
  15. package/server/controllers/index.ts +2 -0
  16. package/server/controllers/publish-data.ts +29 -0
  17. package/server/controllers/scenario-controller.ts +156 -0
  18. package/server/engine/analyzer/analyze-integration.ts +115 -0
  19. package/server/engine/connection-manager.ts +239 -0
  20. package/server/engine/connector/echo-back-connector.ts +51 -0
  21. package/server/engine/connector/echo-back-server.ts +72 -0
  22. package/server/engine/connector/graphql-connector.ts +126 -0
  23. package/server/engine/connector/http-connector.ts +65 -0
  24. package/server/engine/connector/index.ts +12 -0
  25. package/server/engine/connector/mqtt-connector.ts +78 -0
  26. package/server/engine/connector/mssql-connector.ts +152 -0
  27. package/server/engine/connector/mysql-connector.ts +94 -0
  28. package/server/engine/connector/operato-connector.ts +264 -0
  29. package/server/engine/connector/oracle-connector.ts +218 -0
  30. package/server/engine/connector/postgresql-connector.ts +152 -0
  31. package/server/engine/connector/proxy-connector.ts +53 -0
  32. package/server/engine/connector/socket-server.ts +86 -0
  33. package/server/engine/connector/sqlite-connector.ts +69 -0
  34. package/server/engine/edge-client.ts +45 -0
  35. package/server/engine/index.ts +10 -0
  36. package/server/engine/pending-queue.ts +97 -0
  37. package/server/engine/scenario-engine.ts +106 -0
  38. package/server/engine/task/book-up-scenario.ts +73 -0
  39. package/server/engine/task/csv-readline.ts +127 -0
  40. package/server/engine/task/data-accessor.ts +36 -0
  41. package/server/engine/task/data-mapper.ts +47 -0
  42. package/server/engine/task/database-query.ts +56 -0
  43. package/server/engine/task/echo-receive.ts +21 -0
  44. package/server/engine/task/echo-send.ts +32 -0
  45. package/server/engine/task/empty-check.ts +38 -0
  46. package/server/engine/task/end.ts +18 -0
  47. package/server/engine/task/floating-point.ts +71 -0
  48. package/server/engine/task/goto.ts +27 -0
  49. package/server/engine/task/graphql-mutate.ts +79 -0
  50. package/server/engine/task/graphql-query.ts +78 -0
  51. package/server/engine/task/headless-post.ts +147 -0
  52. package/server/engine/task/headless-scrap.ts +80 -0
  53. package/server/engine/task/http-get.ts +117 -0
  54. package/server/engine/task/http-post.ts +148 -0
  55. package/server/engine/task/index.ts +45 -0
  56. package/server/engine/task/jsonata.ts +45 -0
  57. package/server/engine/task/local-graphql-mutate.ts +100 -0
  58. package/server/engine/task/local-graphql-query.ts +100 -0
  59. package/server/engine/task/log.ts +78 -0
  60. package/server/engine/task/mqtt-publish.ts +45 -0
  61. package/server/engine/task/mqtt-subscribe.ts +139 -0
  62. package/server/engine/task/mssql-procedure.ts +128 -0
  63. package/server/engine/task/oracle-procedure.ts +124 -0
  64. package/server/engine/task/pick-pending-scenario.ts +80 -0
  65. package/server/engine/task/publish.ts +40 -0
  66. package/server/engine/task/random.ts +53 -0
  67. package/server/engine/task/reset-pending-queue.ts +17 -0
  68. package/server/engine/task/script.ts +63 -0
  69. package/server/engine/task/set-domain.ts +37 -0
  70. package/server/engine/task/sleep.ts +34 -0
  71. package/server/engine/task/socket-listener.ts +96 -0
  72. package/server/engine/task/state-group-read.ts +69 -0
  73. package/server/engine/task/state-read.ts +56 -0
  74. package/server/engine/task/state-write.ts +65 -0
  75. package/server/engine/task/stop-scenario.ts +44 -0
  76. package/server/engine/task/sub-scenario.ts +57 -0
  77. package/server/engine/task/switch-goto.ts +43 -0
  78. package/server/engine/task/switch-range-goto.ts +53 -0
  79. package/server/engine/task/switch-range-scenario.ts +79 -0
  80. package/server/engine/task/switch-range-set.ts +48 -0
  81. package/server/engine/task/switch-scenario.ts +67 -0
  82. package/server/engine/task/switch-set.ts +37 -0
  83. package/server/engine/task/throw.ts +27 -0
  84. package/server/engine/task/utils/headless-pool-for-scenario.ts +71 -0
  85. package/server/engine/task/utils/substitute.ts +44 -0
  86. package/server/engine/task/variables.ts +17 -0
  87. package/server/engine/task-registry.ts +23 -0
  88. package/server/engine/types.ts +114 -0
  89. package/server/index.ts +20 -0
  90. package/server/migrations/index.ts +9 -0
  91. package/server/restful/index.ts +1 -0
  92. package/server/restful/unstable/index.ts +7 -0
  93. package/server/restful/unstable/run-scenario.ts +51 -0
  94. package/server/restful/unstable/scenario-instance.ts +52 -0
  95. package/server/restful/unstable/scenario-instances.ts +80 -0
  96. package/server/restful/unstable/scenario.ts +41 -0
  97. package/server/restful/unstable/scenarios.ts +69 -0
  98. package/server/restful/unstable/start-scenario.ts +33 -0
  99. package/server/restful/unstable/stop-scenario.ts +30 -0
  100. package/server/routers/scenario-schedule-callback-router.ts +69 -0
  101. package/server/routers/scenario-view-router.ts +46 -0
  102. package/server/routes.ts +30 -0
  103. package/server/service/analysis/analysis-query.ts +13 -0
  104. package/server/service/analysis/index.ts +3 -0
  105. package/server/service/connection/connection-mutation.ts +190 -0
  106. package/server/service/connection/connection-query.ts +87 -0
  107. package/server/service/connection/connection-subscription.ts +104 -0
  108. package/server/service/connection/connection-type.ts +288 -0
  109. package/server/service/connection/index.ts +7 -0
  110. package/server/service/connector/connector-query.ts +62 -0
  111. package/server/service/connector/connector-type.ts +29 -0
  112. package/server/service/connector/index.ts +4 -0
  113. package/server/service/index.ts +52 -0
  114. package/server/service/payload-log/index.ts +7 -0
  115. package/server/service/payload-log/payload-log-mutation.ts +151 -0
  116. package/server/service/payload-log/payload-log-query.ts +49 -0
  117. package/server/service/payload-log/payload-log-type.ts +36 -0
  118. package/server/service/payload-log/payload-log.ts +100 -0
  119. package/server/service/property-spec.ts +24 -0
  120. package/server/service/scenario/index.ts +6 -0
  121. package/server/service/scenario/scenario-mutation.ts +396 -0
  122. package/server/service/scenario/scenario-query.ts +109 -0
  123. package/server/service/scenario/scenario-type.ts +78 -0
  124. package/server/service/scenario/scenario.ts +124 -0
  125. package/server/service/scenario-flow/scenario-flow.ts +17 -0
  126. package/server/service/scenario-instance/index.ts +6 -0
  127. package/server/service/scenario-instance/scenario-instance-mutation.ts +44 -0
  128. package/server/service/scenario-instance/scenario-instance-query.ts +42 -0
  129. package/server/service/scenario-instance/scenario-instance-subscription.ts +118 -0
  130. package/server/service/scenario-instance/scenario-instance-type.ts +563 -0
  131. package/server/service/scenario-queue/index.ts +4 -0
  132. package/server/service/scenario-queue/scenario-queue-subscription.ts +55 -0
  133. package/server/service/scenario-queue/scenario-queue-type.ts +27 -0
  134. package/server/service/state-register/data-resolver.ts +56 -0
  135. package/server/service/state-register/index.ts +8 -0
  136. package/server/service/state-register/state-register-mutation.ts +166 -0
  137. package/server/service/state-register/state-register-query.ts +80 -0
  138. package/server/service/state-register/state-register-type.ts +80 -0
  139. package/server/service/state-register/state-register.ts +113 -0
  140. package/server/service/step/index.ts +6 -0
  141. package/server/service/step/step-mutation.ts +52 -0
  142. package/server/service/step/step-query.ts +55 -0
  143. package/server/service/step/step-type.ts +215 -0
  144. package/server/service/task-type/index.ts +4 -0
  145. package/server/service/task-type/task-type-query.ts +95 -0
  146. package/server/service/task-type/task-type-type.ts +29 -0
  147. package/translations/en.json +4 -12
  148. package/translations/ja.json +4 -12
  149. package/translations/ko.json +4 -12
  150. package/translations/ms.json +4 -12
  151. package/translations/zh.json +4 -12
  152. package/dist-server/engine/connector/headless-connector.d.ts +0 -23
  153. package/dist-server/engine/connector/headless-connector.js +0 -357
  154. package/dist-server/engine/connector/headless-connector.js.map +0 -1
  155. package/dist-server/engine/resource-pool/headless-pool.d.ts +0 -1
  156. package/dist-server/engine/resource-pool/headless-pool.js +0 -62
  157. package/dist-server/engine/resource-pool/headless-pool.js.map +0 -1
  158. package/dist-server/engine/resource-pool/index.d.ts +0 -1
  159. package/dist-server/engine/resource-pool/index.js +0 -5
  160. package/dist-server/engine/resource-pool/index.js.map +0 -1
@@ -0,0 +1,67 @@
1
+ import { getRepository } from '@things-factory/shell'
2
+ import { access, deepClone } from '@things-factory/utils'
3
+
4
+ import { Scenario } from '../../service/scenario/scenario'
5
+ import { TaskRegistry } from '../task-registry'
6
+ import { InputStep } from '../../service/step/step-type'
7
+ import { Context } from '../types'
8
+
9
+ async function SwitchScenario(step: InputStep, context: Context) {
10
+ var { logger, data, load } = context
11
+ var {
12
+ params: { accessor, cases, variables }
13
+ } = step
14
+
15
+ var value = access(accessor, data)
16
+
17
+ var scenarioName = cases[value] || cases['default']
18
+ logger.info(`switch to scenario '${scenarioName}' by value '${value}' .`)
19
+
20
+ var subscenario = await getRepository(Scenario).findOne({
21
+ where: {
22
+ name: scenarioName
23
+ },
24
+ relations: ['steps', 'domain']
25
+ })
26
+
27
+ logger.info(`Sub Scenario '${subscenario.name}' started.`)
28
+ var subContext = await load(step, subscenario, {
29
+ ...context,
30
+ data: {},
31
+ /*
32
+ FIXME variables 설정이 안된 경우에 subscenario의 variables는 undefined가 되는 것이 맞겠지만,
33
+ 하위 호환성 유지를 위해서 부모의 variables를 사용함
34
+ */
35
+ variables: variables ? deepClone(access(variables, data)) : context.variables
36
+ })
37
+ logger.info(`Sub Scenario '${subscenario.name}' done.`)
38
+
39
+ return {
40
+ data: subContext.data
41
+ }
42
+ }
43
+
44
+ SwitchScenario.parameterSpec = [
45
+ {
46
+ type: 'scenario-step-input',
47
+ name: 'accessor',
48
+ label: 'accessor'
49
+ },
50
+ {
51
+ type: 'map',
52
+ name: 'cases',
53
+ label: 'cases',
54
+ property: {
55
+ valuetype: 'scenario-input'
56
+ }
57
+ },
58
+ {
59
+ type: 'scenario-step-input',
60
+ name: 'variables',
61
+ label: 'variables'
62
+ }
63
+ ]
64
+
65
+ SwitchScenario.connectorFree = true
66
+
67
+ TaskRegistry.registerTaskHandler('switch-scenario', SwitchScenario)
@@ -0,0 +1,37 @@
1
+ import { access } from '@things-factory/utils'
2
+ import { TaskRegistry } from '../task-registry'
3
+ import { InputStep } from '../../service/step/step-type'
4
+ import { Context } from '../types'
5
+
6
+ async function SwitchSet(step: InputStep, { logger, data }: Context) {
7
+ var {
8
+ params: { accessor, cases }
9
+ } = step
10
+
11
+ var value = access(accessor, data)
12
+
13
+ var data = cases[value] || cases['default']
14
+
15
+ logger.info(`switch to data '${data}' by value '${value}' .`)
16
+
17
+ return {
18
+ data
19
+ }
20
+ }
21
+
22
+ SwitchSet.parameterSpec = [
23
+ {
24
+ type: 'scenario-step-input',
25
+ name: 'accessor',
26
+ label: 'accessor'
27
+ },
28
+ {
29
+ type: 'map',
30
+ name: 'cases',
31
+ label: 'cases'
32
+ }
33
+ ]
34
+
35
+ SwitchSet.connectorFree = true
36
+
37
+ TaskRegistry.registerTaskHandler('switch-set', SwitchSet)
@@ -0,0 +1,27 @@
1
+ import { TaskRegistry } from '../task-registry'
2
+ import { InputStep } from '../../service/step/step-type'
3
+ import { Context } from '../types'
4
+
5
+ async function Throw(step: InputStep, { logger }: Context) {
6
+ var {
7
+ name,
8
+ params: { message }
9
+ } = step
10
+
11
+ throw `'${message}' is thrown by step '${name}'`
12
+
13
+ return {}
14
+ }
15
+
16
+ Throw.parameterSpec = [
17
+ {
18
+ type: 'string',
19
+ name: 'message',
20
+ label: 'message'
21
+ }
22
+ ]
23
+
24
+ Throw.connectorFree = true
25
+ Throw.help = 'integration/task/throw'
26
+
27
+ TaskRegistry.registerTaskHandler('throw', Throw)
@@ -0,0 +1,71 @@
1
+ import * as genericPool from 'generic-pool'
2
+
3
+ import { config, logger } from '@things-factory/env'
4
+
5
+ try {
6
+ var puppeteer = require('puppeteer')
7
+ } catch (err) {
8
+ logger.error(err)
9
+ }
10
+
11
+ var headlessPool
12
+
13
+ export function getHeadlessPool() {
14
+ if (!headlessPool) {
15
+ headlessPool = genericPool.createPool(
16
+ {
17
+ create() {
18
+ console.log('headless instance in headless-pool-for-scensrio about to create')
19
+ return initializeChromium()
20
+ },
21
+ validate(browser) {
22
+ return Promise.race([
23
+ new Promise(res => setTimeout(() => res(false), 1500)),
24
+ browser
25
+ //@ts-ignore
26
+ .version()
27
+ .then(_ => true)
28
+ .catch(_ => false)
29
+ ])
30
+ },
31
+ destroy(browser) {
32
+ //@ts-ignore
33
+ return browser.close()
34
+ }
35
+ },
36
+ {
37
+ min: 2,
38
+ max: 10,
39
+ testOnBorrow: true,
40
+ acquireTimeoutMillis: 15000
41
+ }
42
+ )
43
+ }
44
+
45
+ return headlessPool
46
+ }
47
+
48
+ const CHROMIUM_PATH = config.get('CHROMIUM_PATH')
49
+
50
+ async function initializeChromium() {
51
+ try {
52
+ if (!puppeteer) {
53
+ return
54
+ }
55
+
56
+ var launchSetting = {
57
+ args: ['--mute-audio', '--no-sandbox'],
58
+ headless: 'shell'
59
+ }
60
+
61
+ if (CHROMIUM_PATH) {
62
+ launchSetting['executablePath'] = CHROMIUM_PATH
63
+ }
64
+
65
+ const browser = await puppeteer.launch(launchSetting)
66
+
67
+ return browser
68
+ } catch (err) {
69
+ logger.error(err)
70
+ }
71
+ }
@@ -0,0 +1,44 @@
1
+ const SELF = function (o) {
2
+ return o
3
+ }
4
+
5
+ function parse(text) {
6
+ var defaultIndex = text.indexOf('||')
7
+ var originText = ''
8
+ var defaultValue = ''
9
+ if (defaultIndex != -1) {
10
+ originText = text
11
+ defaultValue = text.substring(defaultIndex + 2, text.length - 1).trim()
12
+ text = text.replace(text.substring(defaultIndex, text.length - 1), '').trim()
13
+ }
14
+ var parsed = text
15
+ .substr(2, text.length - 3)
16
+ .trim()
17
+ .replace(/\[(\w+)\]/g, '.$1')
18
+ .replace(/^\./, '')
19
+ .split('.')
20
+ .filter(accessor => !!accessor.trim())
21
+ var accessors = parsed.slice(1)
22
+ return {
23
+ defaultValue: defaultValue,
24
+ match: text,
25
+ originText: originText || text,
26
+ target: parsed[0],
27
+ accessor:
28
+ accessors.length > 0
29
+ ? function (o) {
30
+ return accessors.reduce((o, accessor) => (o ? o[accessor] : undefined), o)
31
+ }
32
+ : SELF
33
+ }
34
+ }
35
+
36
+ export function substitute(value, data) {
37
+ var text = String(value)
38
+ var substituteVal = text.match(/#{[^}]*}/gi)
39
+ var prop = substituteVal ? parse(substituteVal[0]) : undefined
40
+ if (prop && data.hasOwnProperty(prop.target)) {
41
+ return prop.accessor(data[prop.target])
42
+ }
43
+ return value
44
+ }
@@ -0,0 +1,17 @@
1
+ import { TaskRegistry } from '../task-registry'
2
+ import { InputStep } from '../../service/step/step-type'
3
+ import { Context } from '../types'
4
+
5
+ async function Variables(step: InputStep, { variables }: Context) {
6
+ return {
7
+ data: variables instanceof Array ? [...variables] : typeof variables == 'object' ? { ...variables } : variables
8
+ }
9
+ }
10
+
11
+ Variables.parameterSpec = []
12
+
13
+ Variables.connectorFree = true
14
+
15
+ Variables.help = 'integration/task/variables'
16
+
17
+ TaskRegistry.registerTaskHandler('variables', Variables)
@@ -0,0 +1,23 @@
1
+ import { TaskHandler } from './types'
2
+
3
+ export class TaskRegistry {
4
+ static handlers: { [type: string]: TaskHandler } = {}
5
+
6
+ static getTaskHandler(type: string): TaskHandler {
7
+ return TaskRegistry.handlers[type]
8
+ }
9
+
10
+ static registerTaskHandler(type: string, handler: TaskHandler) {
11
+ TaskRegistry.handlers[type] = handler
12
+ }
13
+
14
+ static unregisterTaskHandler(type: string) {
15
+ delete TaskRegistry.handlers[type]
16
+ }
17
+
18
+ static getTaskHandlers(): { [propName: string]: TaskHandler } {
19
+ return {
20
+ ...TaskRegistry.handlers
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,114 @@
1
+ import { Connection, PropertySpec, ScenarioInstance, ScenarioInstanceStatus, Step } from '../service'
2
+ import { Domain } from '@things-factory/shell'
3
+ import { User } from '@things-factory/auth-base'
4
+
5
+ export interface Connector {
6
+ ready(connections: Connection[]): Promise<any>
7
+ connect(connection: Connection): Promise<any>
8
+ disconnect(connection: Connection): Promise<any>
9
+ parameterSpec: PropertySpec[]
10
+ taskPrefixes?: string[]
11
+ description?: string
12
+ help?: string
13
+ }
14
+
15
+ export type Context = {
16
+ /**
17
+ * Represents the domain context.
18
+ */
19
+ domain: Domain
20
+
21
+ /**
22
+ * User information.
23
+ */
24
+ user: User
25
+
26
+ /**
27
+ * Language code, for example 'en', 'ko'.
28
+ */
29
+ lng: string
30
+
31
+ /**
32
+ * Flag to indicate if the IP is unsafe, can be undefined.
33
+ */
34
+ unsafeIP: boolean | undefined
35
+
36
+ /**
37
+ * List of prohibited privileges, can be undefined.
38
+ */
39
+ prohibitedPrivileges: { category: string; privilege: string }[] | undefined
40
+
41
+ /**
42
+ * Logger for logging purposes.
43
+ */
44
+ logger: any
45
+
46
+ /**
47
+ * Function to publish events or messages.
48
+ */
49
+ publish: Function
50
+
51
+ /**
52
+ * Function to load resources or data.
53
+ */
54
+ load: Function
55
+
56
+ /**
57
+ * Current status of the scenario instance.
58
+ */
59
+ state: ScenarioInstanceStatus
60
+
61
+ /**
62
+ * General data storage object.
63
+ */
64
+ data: any
65
+
66
+ /**
67
+ * Variables related to the context.
68
+ */
69
+ variables: Object
70
+
71
+ /**
72
+ * Local GraphQL client object.
73
+ */
74
+ client: any /* graphql local client */
75
+
76
+ /**
77
+ * Root object, can be used for various purposes.
78
+ */
79
+ root?: ScenarioInstance
80
+
81
+ /**
82
+ * Array of function closures.
83
+ */
84
+ closures: Function[]
85
+
86
+ /**
87
+ * Function to check the state.
88
+ */
89
+ checkState: Function
90
+
91
+ /**
92
+ * MQTT subscriber context object.
93
+ */
94
+ __mqtt_subscriber?: any
95
+
96
+ /**
97
+ * socket listener context object.
98
+ */
99
+ __socket_listener?: any
100
+
101
+ /**
102
+ * csv readline context object.
103
+ */
104
+ __csv_resources?: any
105
+ }
106
+
107
+ export type TaskHandler = (
108
+ step: Step,
109
+ context: Context
110
+ ) => Promise<{
111
+ next?: string
112
+ state?: ScenarioInstanceStatus
113
+ data?: any
114
+ }>
@@ -0,0 +1,20 @@
1
+ export * from './migrations'
2
+ export * from './engine'
3
+ export * from './controllers'
4
+ export * from './service'
5
+
6
+ import './routes'
7
+ import './restful' /* APIs */
8
+
9
+ import { ConnectionManager, ScenarioEngine } from './engine'
10
+
11
+ process.on('bootstrap-module-start' as any, async ({ app, config, client }: any) => {
12
+ try {
13
+ await ConnectionManager.ready()
14
+ await ScenarioEngine.loadAll()
15
+
16
+ console.log('Scenario Engine has just started.')
17
+ } catch (ex) {
18
+ ConnectionManager.logger.error('Just has failed to start Scenario Engine.', ex)
19
+ }
20
+ })
@@ -0,0 +1,9 @@
1
+ const glob = require('glob')
2
+ const path = require('path')
3
+
4
+ export var migrations = []
5
+
6
+ glob.sync(path.resolve(__dirname, '.', '**', '*.js')).forEach(function(file) {
7
+ if (file.indexOf('index.js') !== -1) return
8
+ migrations = migrations.concat(Object.values(require(path.resolve(file))) || [])
9
+ })
@@ -0,0 +1 @@
1
+ import './unstable'
@@ -0,0 +1,7 @@
1
+ import './scenario'
2
+ import './scenarios'
3
+ import './scenario-instance'
4
+ import './scenario-instances'
5
+ import './run-scenario'
6
+ import './start-scenario'
7
+ import './stop-scenario'
@@ -0,0 +1,51 @@
1
+ import gql from 'graphql-tag'
2
+
3
+ import { restfulApiRouter as router } from '@things-factory/api'
4
+
5
+ const debug = require('debug')('things-factory:integration-base:restful:unstable:run-scenario')
6
+
7
+ router.post('/unstable/run-scenario/:scenarioName', async (context, next) => {
8
+ const { client } = context.state
9
+ const { scenarioName } = context.params
10
+ const body = context.request.body || {}
11
+ let { instanceName = '', variables = {} } = body
12
+
13
+ if (Object.keys(variables).length === 0) {
14
+ variables = body
15
+ }
16
+
17
+ debug('post:/unstable/run-scenario/:scenarioName', scenarioName)
18
+ let response = await client.mutate({
19
+ mutation: gql`
20
+ mutation ($instanceName: String, $scenarioName: String!, $variables: Object) {
21
+ runScenario(instanceName: $instanceName, scenarioName: $scenarioName, variables: $variables) {
22
+ instanceName
23
+ scenarioName
24
+ data
25
+ result
26
+ message
27
+ timestamp
28
+ }
29
+ }
30
+ `,
31
+ variables: {
32
+ instanceName,
33
+ scenarioName,
34
+ variables
35
+ },
36
+ context
37
+ })
38
+
39
+ const { errors, data } = response
40
+
41
+ if (!data) {
42
+ context.status = 500
43
+ context.body = errors
44
+
45
+ return
46
+ }
47
+
48
+ const { result } = data.runScenario
49
+
50
+ context.body = result
51
+ })
@@ -0,0 +1,52 @@
1
+ import gql from 'graphql-tag'
2
+ import { restfulApiRouter as router } from '@things-factory/api'
3
+
4
+ const debug = require('debug')('things-factory:integration-base:restful:unstable:scenario-instance')
5
+
6
+ router.get('/unstable/scenario-instance/:instanceName', async (context, next) => {
7
+ const { client } = context.state
8
+ const { instanceName } = context.params
9
+
10
+ debug('get:/unstable/scenario-instance/:instanceName', context.params)
11
+
12
+ context.body = await client.query({
13
+ query: gql`
14
+ query($instanceName: String!) {
15
+ scenarioInstance(instanceName: $instanceName) {
16
+ root {
17
+ instanceName
18
+ scenarioName
19
+ state
20
+ progress {
21
+ rounds
22
+ rate
23
+ steps
24
+ step
25
+ }
26
+ variables
27
+ data
28
+ message
29
+ timestamp
30
+ }
31
+ instanceName
32
+ scenarioName
33
+ state
34
+ progress {
35
+ rounds
36
+ rate
37
+ steps
38
+ step
39
+ }
40
+ variables
41
+ data
42
+ message
43
+ timestamp
44
+ }
45
+ }
46
+ `,
47
+ variables: {
48
+ instanceName
49
+ },
50
+ context
51
+ })
52
+ })
@@ -0,0 +1,80 @@
1
+ import gql from 'graphql-tag'
2
+ import { restfulApiRouter as router } from '@things-factory/api'
3
+
4
+ const debug = require('debug')('things-factory:integration-base:restful:unstable:scenario-instances')
5
+
6
+ function FPSparams(query) {
7
+ var { page, limit } = query
8
+
9
+ var filters = []
10
+ var sortings = []
11
+
12
+ page = parseInt(page)
13
+ limit = parseInt(limit)
14
+
15
+ var pagination = {
16
+ page: isNaN(page) ? 0 : page,
17
+ limit: isNaN(limit) ? 100 : limit
18
+ }
19
+
20
+ return {
21
+ filters,
22
+ sortings,
23
+ pagination
24
+ }
25
+ }
26
+
27
+ router.get('/unstable/scenario-instances', async (context, next) => {
28
+ const { client } = context.state
29
+
30
+ var { filters, sortings, pagination } = FPSparams(context.query)
31
+
32
+ debug('get:/unstable/scenario-instances', context.params)
33
+
34
+ context.body = await client.query({
35
+ query: gql`
36
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
37
+ scenarioInstances(filters: $filters, pagination: $pagination, sortings: $sortings) {
38
+ items {
39
+ root {
40
+ instanceName
41
+ scenarioName
42
+ state
43
+ progress {
44
+ rounds
45
+ rate
46
+ steps
47
+ step
48
+ }
49
+ variables
50
+ data
51
+ message
52
+ timestamp
53
+ }
54
+ instanceName
55
+ scenarioName
56
+ state
57
+ progress {
58
+ rounds
59
+ rate
60
+ steps
61
+ step
62
+ }
63
+ variables
64
+ data
65
+ message
66
+ timestamp
67
+ }
68
+
69
+ total
70
+ }
71
+ }
72
+ `,
73
+ variables: {
74
+ filters,
75
+ pagination,
76
+ sortings
77
+ },
78
+ context
79
+ })
80
+ })
@@ -0,0 +1,41 @@
1
+ import gql from 'graphql-tag'
2
+ import { restfulApiRouter as router } from '@things-factory/api'
3
+
4
+ const debug = require('debug')('things-factory:integration-base:restful:unstable:scenario')
5
+
6
+ router.get('/unstable/scenario/:id', async (context, next) => {
7
+ const { client } = context.state
8
+ const { id } = context.params
9
+
10
+ debug('get:/unstable/scenario/:id', context.params)
11
+
12
+ context.body = await client.query({
13
+ query: gql`
14
+ query ($id: String!) {
15
+ scenario(id: $id) {
16
+ id
17
+ name
18
+ description
19
+ state
20
+ schedule
21
+ timezone
22
+ steps {
23
+ id
24
+ name
25
+ description
26
+ sequence
27
+ task
28
+ skip
29
+ log
30
+ connection
31
+ params
32
+ }
33
+ }
34
+ }
35
+ `,
36
+ variables: {
37
+ id
38
+ },
39
+ context
40
+ })
41
+ })