@things-factory/integration-base 6.1.127 → 6.1.138

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 (51) hide show
  1. package/dist-server/engine/task/database-query.js +2 -1
  2. package/dist-server/engine/task/database-query.js.map +1 -1
  3. package/dist-server/engine/task/graphql-mutate.js +2 -1
  4. package/dist-server/engine/task/graphql-mutate.js.map +1 -1
  5. package/dist-server/engine/task/graphql-query.js +2 -1
  6. package/dist-server/engine/task/graphql-query.js.map +1 -1
  7. package/dist-server/engine/task/http-get.js +2 -1
  8. package/dist-server/engine/task/http-get.js.map +1 -1
  9. package/dist-server/engine/task/http-post.js +2 -1
  10. package/dist-server/engine/task/http-post.js.map +1 -1
  11. package/dist-server/engine/task/local-graphql-mutate.js +8 -5
  12. package/dist-server/engine/task/local-graphql-mutate.js.map +1 -1
  13. package/dist-server/engine/task/local-graphql-query.js +8 -5
  14. package/dist-server/engine/task/local-graphql-query.js.map +1 -1
  15. package/dist-server/engine/task/log.js +2 -1
  16. package/dist-server/engine/task/log.js.map +1 -1
  17. package/dist-server/engine/task/oracle-procedure.js +3 -3
  18. package/dist-server/engine/task/oracle-procedure.js.map +1 -1
  19. package/dist-server/engine/task/script.js +3 -2
  20. package/dist-server/engine/task/script.js.map +1 -1
  21. package/dist-server/engine/types.js.map +1 -1
  22. package/dist-server/routers/scenario-schedule-callback-router.js +7 -2
  23. package/dist-server/routers/scenario-schedule-callback-router.js.map +1 -1
  24. package/dist-server/service/scenario/scenario-type.js +1 -1
  25. package/dist-server/service/scenario/scenario-type.js.map +1 -1
  26. package/dist-server/service/scenario-instance/scenario-instance-mutation.js +2 -2
  27. package/dist-server/service/scenario-instance/scenario-instance-mutation.js.map +1 -1
  28. package/dist-server/service/scenario-instance/scenario-instance-type.js +9 -1
  29. package/dist-server/service/scenario-instance/scenario-instance-type.js.map +1 -1
  30. package/dist-server/tsconfig.tsbuildinfo +1 -1
  31. package/helps/integration/task/oracle-procedure.ja.md +139 -0
  32. package/helps/integration/task/oracle-procedure.ko.md +40 -30
  33. package/helps/integration/task/oracle-procedure.md +52 -55
  34. package/helps/integration/task/oracle-procedure.ms.md +50 -51
  35. package/helps/integration/task/oracle-procedure.zh.md +81 -84
  36. package/package.json +8 -8
  37. package/server/engine/task/database-query.ts +2 -1
  38. package/server/engine/task/graphql-mutate.ts +2 -1
  39. package/server/engine/task/graphql-query.ts +2 -1
  40. package/server/engine/task/http-get.ts +2 -1
  41. package/server/engine/task/http-post.ts +2 -1
  42. package/server/engine/task/local-graphql-mutate.ts +8 -5
  43. package/server/engine/task/local-graphql-query.ts +8 -5
  44. package/server/engine/task/log.ts +2 -1
  45. package/server/engine/task/oracle-procedure.ts +3 -4
  46. package/server/engine/task/script.ts +3 -2
  47. package/server/engine/types.ts +1 -0
  48. package/server/routers/scenario-schedule-callback-router.ts +6 -2
  49. package/server/service/scenario/scenario-type.ts +1 -1
  50. package/server/service/scenario-instance/scenario-instance-mutation.ts +2 -2
  51. package/server/service/scenario-instance/scenario-instance-type.ts +9 -1
@@ -1,141 +1,138 @@
1
1
  # Oracle 存储过程任务
2
2
 
3
- 调用 Oracle 数据库中存储的存储过程的任务、
4
- 它根据数据类型返回数据列表或特定数据类型的值。
3
+ 这个任务涉及调用存储在 Oracle 数据库中的存储过程。根据不同的数据类型,它可以返回数据列表或特定数据类型的值。
5
4
 
6
- ### 参数
5
+ ## 参数
6
+
7
+ ### 存储过程代码
8
+
9
+ - 存储过程代码是根据*存储过程名称*和*参数*自动生成的代码,用户无需手动输入。
10
+ - 例如,如果存储过程的名称是*mcs.myproc*,参数是*id*和*out_name*,则应表示如下:
7
11
 
8
- ### 过程代码
9
- - 存储过程代码是由*存储过程名称*和*参数*自动生成的代码,用户无需输入。
10
- - 例如,如果存储过程的名称为 *mcs.myproc*,参数为 *id* 和 *out_name*,那么存储过程代码将如下所示
11
- ```文本
12
- mcs.myproc(:id, :out_name);
13
- ```
12
+ ```text
13
+ mcs.myproc(:id, :out_name);
14
+ ```
14
15
 
15
16
  ### 存储过程名称
16
- - 指定存储过程的名称。
17
- - 如果存储过程需要用包或用户名分隔,请使用". "分隔。
18
- - 例如
19
- 文本
20
- mcs.myproc
21
- 文本 mcs.myproc
17
+
18
+ - 指定存储过程的名称。
19
+ - 如果需要按包或用户名称区分存储过程,请使用句点(.)进行分隔。
20
+ - 示例:
21
+
22
+ ```text
23
+ mcs.myproc
24
+ ```
22
25
 
23
26
  ### 参数
24
- - 参数由以下元素组成
25
- - 参数名称
26
- - 输入/输出名称:IN、INOUT、OUT
27
- - 参数类型:字符串、数字、日期、光标
28
- - 值:如果变量是输入,则是该输入的值。
29
- - MaxSize:如果变量是字符串或缓冲区类型,则为变量的最大大小。
27
+
28
+ - 参数由以下元素组成:
29
+ - 参数名称
30
+ - 方向:IN、INOUT、OUT
31
+ - 数据类型:String、Number、Date、Cursor
32
+ - 值:对于输入变量,是相应的值
33
+ - 最大大小:对于数据类型为 String 或 Buffer 的变量,指定变量的最大大小。
30
34
 
31
35
  #### 参数名称
32
36
 
33
- 参数名指定存储过程中使用的参数名称。
34
- 例如
35
- ``sql
36
- mcs.myproc(:id, :out_name);
37
- ```
38
- id 和 out_name 是参数名。
37
+ 参数名称指定存储过程中使用的参数的名称。在上面的示例中,'id'和'out_name'是参数名称。
39
38
 
40
- ### 指定输入和输出
39
+ ### 方向
41
40
 
42
- 指定变量是输入(IN)还是输出(OUT)。
41
+ 指定变量是输入(IN)还是输出(OUT)变量。
43
42
 
44
- ### 参数类型
43
+ ### 数据类型
45
44
 
46
- 指定参数的类型。类型必须与实际创建存储过程时指定的名称相同。
45
+ 指定参数的数据类型。数据类型应与创建存储过程时命名的数据类型完全一致。
47
46
 
48
- 如果存储过程以
47
+ 例如,如果存储过程实现如下:
49
48
 
50
- 存储过程
49
+ ```sql
51
50
  CREATE OR REPLACE NONEDITIONABLE PROCEDURE myproc (in_id IN VARCHAR2, out_name OUT VARCHAR2) AS
52
- 开始
53
- SELECT name INTO out_name FROM MCS.FMB_USERS WHERE id = in_id
54
- 结束;
51
+ BEGIN
52
+ SELECT name INTO out_name FROM MCS.FMB_USERS WHERE id = in_id ;
53
+ END;
55
54
  ```
56
55
 
57
- 请注意,第一个和第二个参数都指定为 VARCHAR2
56
+ 第一个和第二个参数都是 VARCHAR2 类型。
58
57
 
59
- 如果需要调用这些存储过程,必须将参数类型指定为字符串、
60
- 对于输出,必须指定最大大小。
58
+ 在调用这样的存储过程时,应将参数类型指定为 String,并且对于输出,还应指定最大大小。
61
59
 
62
- 调用说明示例如下
60
+ 以下是如何
63
61
 
64
- [存储过程 example1](./assets/././././././././assets/images/oracle-procedure-example1.png '存储过程 example1')
62
+ 指定的示例:
65
63
 
64
+ ![procedure example1](./assets/../../../../assets/images/oracle-procedure-example1.png 'procedure example1')
66
65
 
67
- ### Accessor [accessor](../concept/data-accessor.md)
66
+ ### 访问器
68
67
 
69
- 按照 [JSONATA 文档](http://docs.jsonata.org/overview.html) 进行配置。
68
+ 配置遵循[JSONATA 文档](http://docs.jsonata.org/overview.html)
70
69
 
70
+ 如果指定了“访问器”,则该访问器生成的值将用作参数值。如果“访问器”操作没有结果,则使用“值(val)”设置。
71
71
 
72
- ###
72
+ ### 值(val)
73
73
 
74
- 如果参数是输入(IN),请指定其值。
75
- 不要直接在值中输入常量,而应指定具体的任务名称。
74
+ 如果参数是输入(IN),则在此字段中指定值。直接为此字段输入“常数”值。
76
75
 
77
- 在上例中,如果 id 的输入值指定为 ID,则指定 ID 任务返回的值作为输入值。
76
+ 在前面提到的示例中,如果将“ID”指定为“id”参数的输入值,则应将 ID 任务返回的值用作输入值。
78
77
 
78
+ 如果“访问器”设置没有结果,将使用“值”中设置的值。
79
79
 
80
80
  ### 最大大小
81
81
 
82
- 如果参数类型为字符串或缓冲区,请指定最大大小。对于其他类型,请不要指定值,并忽略它。
82
+ 对于数据类型为 String 或 Buffer 的参数,指定最大大小。对于其他数据类型,请忽略此设置。
83
83
 
84
- ### 任务结果
84
+ ## 任务结果
85
85
 
86
- 存储过程调用的结果以对象的形式返回,指定为输出的参数名称是关键字,并返回值。
86
+ 调用存储过程的结果以对象格式返回,指定为输出的参数名称变为键,其对应的值返回。
87
87
 
88
- 例如,上面介绍的任务会返回以下结果值。
88
+ 例如,在上述任务中,结果值将如下所示:
89
89
 
90
90
  ```javascript
91
- }
92
- out_name: 'Admin
91
+ {
92
+ out_name: 'Admin'
93
93
  }
94
94
  ```
95
95
 
96
+ ## 另一个示例(游标)
96
97
 
97
- ### 其他使用示例(光标)
98
+ ### 存储过程实施示例
98
99
 
99
- ### 编写存储过程的示例
100
-
101
- ``sql
102
- CREATE OR REPLACE NONEDITIONABLE PROCEDURE PROCEDURE1(out_cursor OUT SYS_REFCURSOR) AS
103
- 开始
104
- 开始
105
- 打开 out_cursor FOR
106
- SELECT * FROM FARMWEATHER WHERE rownum <= 1000;
107
- 结束;
108
- 结束过程1;
100
+ ```sql
101
+ CREATE OR REPLACE NONEDITIONABLE PROCEDURE PROCEDURE1(out_cursor OUT SYS_REFCURSOR) AS
102
+ BEGIN
103
+ BEGIN
104
+ OPEN out_cursor FOR
105
+ SELECT * FROM FARMWEATHER WHERE rownum <= 1000;
106
+ END;
107
+ END PROCEDURE1;
109
108
  ```
110
109
 
111
- ### 调用存储过程的示例
110
+ ### 调用存储过程示例
112
111
 
113
- ![存储过程 example2](./assets/././././././././assets/images/oracle-procedure-example2.png'存储过程 example2')
112
+ ![procedure example2](./assets/../../../../assets/images/oracle-procedure-example2.png 'procedure example2')
114
113
 
115
- ### 程序任务调用结果
114
+ ### 存储过程调用的任务结果
116
115
 
117
116
  ```javascript
118
- { }
119
- "out_cursor" [].
117
+ {
118
+ "out_cursor": [
120
119
  {
121
- "FARMDATE" "2006-01-07T15:00:00.000Z",
122
- "MAXT" 29.5,
123
- "MINT" 21.8,
124
- "WINDSPEED" 1.6,
125
- "FARMHUM": 70: 70.2,
126
- "降水量": 0 0
120
+ "FARMDATE": "2006-01-07T15:00:00.000Z",
121
+ "MAXT": 29.5,
122
+ "MINT": 21.8,
123
+ "WINDSPEED": 1.6,
124
+ "FARMHUM": 70.2,
125
+ "PRECIPITATION": 0
127
126
  },
128
127
  {
129
- "FARMDATE" "2006-01-08T15:00:00.000Z",
130
- "MAXT" 30.1,
131
- "MINT" 21,
132
- "WINDSPEED" 1.6,
133
- "FARMHUM": 67: 67.4,
134
- "precipitation": 0 0
128
+ "FARMDATE": "2006-01-08T15:00:00.000Z",
129
+ "MAXT": 30.1,
130
+ "MINT": 21,
131
+ "WINDSPEED": 1.6,
132
+ "FARMHUM": 67.4,
133
+ "PRECIPITATION": 0
135
134
  },
136
- ...
135
+ ..
137
136
  ]
138
137
  }
139
138
  ```
140
-
141
- 通过www.DeepL.com/Translator(免费版)翻译
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/integration-base",
3
- "version": "6.1.127",
3
+ "version": "6.1.138",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -26,12 +26,12 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "@apollo/client": "^3.6.9",
29
- "@things-factory/api": "^6.1.127",
30
- "@things-factory/auth-base": "^6.1.127",
31
- "@things-factory/env": "^6.1.127",
32
- "@things-factory/oauth2-client": "^6.1.127",
33
- "@things-factory/scheduler-client": "^6.1.127",
34
- "@things-factory/shell": "^6.1.127",
29
+ "@things-factory/api": "^6.1.129",
30
+ "@things-factory/auth-base": "^6.1.129",
31
+ "@things-factory/env": "^6.1.129",
32
+ "@things-factory/oauth2-client": "^6.1.129",
33
+ "@things-factory/scheduler-client": "^6.1.129",
34
+ "@things-factory/shell": "^6.1.129",
35
35
  "async-mqtt": "^2.5.0",
36
36
  "chance": "^1.1.11",
37
37
  "cross-fetch": "^3.0.4",
@@ -46,5 +46,5 @@
46
46
  "devDependencies": {
47
47
  "@types/cron": "^2.0.1"
48
48
  },
49
- "gitHead": "1e37585e8021af947ffdf03c11c90754a949a318"
49
+ "gitHead": "6bcb91fa7d1647f069212383bf0ece8039e742e5"
50
50
  }
@@ -3,7 +3,7 @@ import { ConnectionManager } from '../connection-manager'
3
3
  import { TaskRegistry } from '../task-registry'
4
4
 
5
5
  async function DatabaseQuery(step, context) {
6
- var { domain, data, variables } = context
6
+ var { domain, user, data, variables } = context
7
7
  var {
8
8
  connection: connectionName,
9
9
  params: { query }
@@ -14,6 +14,7 @@ async function DatabaseQuery(step, context) {
14
14
  const vm = new VM({
15
15
  sandbox: {
16
16
  domain,
17
+ user,
17
18
  data,
18
19
  variables
19
20
  }
@@ -10,11 +10,12 @@ async function GraphqlMutate(step, context) {
10
10
  var { connection: connectionName, params: stepOptions } = step
11
11
  var { mutation, variables: variablesAccessorMap, headers } = stepOptions || {}
12
12
 
13
- var { domain, data, variables } = context
13
+ var { domain, user, data, variables } = context
14
14
 
15
15
  const vm = new VM({
16
16
  sandbox: {
17
17
  domain,
18
+ user,
18
19
  data,
19
20
  variables
20
21
  }
@@ -9,11 +9,12 @@ import { TaskRegistry } from '../task-registry'
9
9
  async function GraphqlQuery(step, context) {
10
10
  var { connection: connectionName, params: stepOptions } = step
11
11
  var { query, variables: variablesAccessorMap, headers } = stepOptions || {}
12
- var { domain, data, variables } = context
12
+ var { domain, user, data, variables } = context
13
13
 
14
14
  const vm = new VM({
15
15
  sandbox: {
16
16
  domain,
17
+ user,
17
18
  data,
18
19
  variables
19
20
  }
@@ -6,7 +6,7 @@ import { TaskRegistry } from '../task-registry'
6
6
  import { ConnectionManager } from '../connection-manager'
7
7
  import { substitute } from './utils/substitute'
8
8
 
9
- async function HttpGet(step, { logger, data, domain, variables }) {
9
+ async function HttpGet(step, { logger, data, domain, user, variables }) {
10
10
  var { connection: connectionName, params: stepOptions } = step
11
11
  var { headers: requestHeaders, searchParams = {}, path } = stepOptions || {}
12
12
  var connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
@@ -20,6 +20,7 @@ async function HttpGet(step, { logger, data, domain, variables }) {
20
20
  const vm = new VM({
21
21
  sandbox: {
22
22
  domain,
23
+ user,
23
24
  data,
24
25
  variables
25
26
  }
@@ -6,7 +6,7 @@ import { TaskRegistry } from '../task-registry'
6
6
  import { ConnectionManager } from '../connection-manager'
7
7
  import https from 'https'
8
8
 
9
- async function HttpPost(step, { logger, data, domain, variables }) {
9
+ async function HttpPost(step, { logger, data, domain, user, variables }) {
10
10
  var { connection: connectionName, params: stepOptions } = step
11
11
  var { headers: requestHeaders, contentType, path, accessor } = stepOptions || {}
12
12
 
@@ -21,6 +21,7 @@ async function HttpPost(step, { logger, data, domain, variables }) {
21
21
  const vm = new VM({
22
22
  sandbox: {
23
23
  domain,
24
+ user,
24
25
  data,
25
26
  variables
26
27
  }
@@ -10,16 +10,19 @@ import { TaskRegistry } from '../task-registry'
10
10
  async function LocalGraphqlMutate(step, context) {
11
11
  var { params, updaterId } = step
12
12
  var { mutation, variables: variablesAccessorMap, headers } = params || {}
13
- var { client, domain, data, variables } = context
13
+ var { client, domain, user, data, variables } = context
14
14
 
15
- const user = await getRepository(User).findOne({
16
- where: { id: updaterId },
17
- relations: ['domains']
18
- })
15
+ user =
16
+ user ||
17
+ (await getRepository(User).findOne({
18
+ where: { id: updaterId },
19
+ relations: ['domains']
20
+ }))
19
21
 
20
22
  const vm = new VM({
21
23
  sandbox: {
22
24
  domain,
25
+ user,
23
26
  data,
24
27
  variables
25
28
  }
@@ -10,16 +10,19 @@ import { TaskRegistry } from '../task-registry'
10
10
  async function LocalGraphqlQuery(step, context) {
11
11
  var { params, updaterId } = step
12
12
  var { query, variables: variablesAccessorMap, headers } = params || {}
13
- var { client, domain, data, variables } = context
13
+ var { client, domain, user, data, variables } = context
14
14
 
15
- const user = await getRepository(User).findOne({
16
- where: { id: updaterId },
17
- relations: ['domains']
18
- })
15
+ user =
16
+ user ||
17
+ (await getRepository(User).findOne({
18
+ where: { id: updaterId },
19
+ relations: ['domains']
20
+ }))
19
21
 
20
22
  const vm = new VM({
21
23
  sandbox: {
22
24
  domain,
25
+ user,
23
26
  data,
24
27
  variables
25
28
  }
@@ -2,7 +2,7 @@ import { access, hasTemplateExpression } from '@things-factory/utils'
2
2
  import { VM } from 'vm2'
3
3
  import { TaskRegistry } from '../task-registry'
4
4
 
5
- async function Log(step, { logger, data, variables, domain }) {
5
+ async function Log(step, { logger, data, variables, domain, user }) {
6
6
  var {
7
7
  params: { message, accessor, level = 'info' }
8
8
  } = step
@@ -11,6 +11,7 @@ async function Log(step, { logger, data, variables, domain }) {
11
11
  const vm = new VM({
12
12
  sandbox: {
13
13
  domain,
14
+ user,
14
15
  data,
15
16
  variables
16
17
  }
@@ -42,7 +42,7 @@ const DIR = {
42
42
  }
43
43
 
44
44
  async function OracleProcedure(step, context) {
45
- var { domain, data, variables } = context
45
+ var { domain, user, data, variables } = context
46
46
  var { connection: connectionName, params } = step
47
47
 
48
48
  var { code = '', parameters = [] } = params.parameters as ValueType
@@ -52,6 +52,7 @@ async function OracleProcedure(step, context) {
52
52
  const vm = new VM({
53
53
  sandbox: {
54
54
  domain,
55
+ user,
55
56
  data,
56
57
  variables
57
58
  }
@@ -71,7 +72,7 @@ async function OracleProcedure(step, context) {
71
72
  type: TYPES[type]
72
73
  }
73
74
 
74
- const calculated = val !== undefined ? val : accessor ? access(accessor, data) : undefined
75
+ const calculated = accessor ? access(accessor, data) || val : val
75
76
 
76
77
  if (calculated !== undefined) {
77
78
  sum[name].val =
@@ -108,8 +109,6 @@ async function OracleProcedure(step, context) {
108
109
  }
109
110
  }
110
111
 
111
- console.log('taskResult: ', taskResult)
112
-
113
112
  return {
114
113
  data: taskResult
115
114
  }
@@ -6,7 +6,7 @@ async function Script(step, context) {
6
6
  params: { script }
7
7
  } = step
8
8
 
9
- const { domain, data, variables } = context
9
+ const { domain, user, data, variables, logger } = context
10
10
 
11
11
  const vm = new NodeVM({
12
12
  timeout: 5000,
@@ -14,12 +14,13 @@ async function Script(step, context) {
14
14
  console: 'inherit',
15
15
  sandbox: {
16
16
  domain,
17
+ user,
17
18
  data,
18
19
  variables
19
20
  }
20
21
  })
21
22
 
22
- const result = await vm.run(`return (async () => {\n${script}\n})()`)
23
+ var result = await vm.run(`return (async () => {\n${script}\n})()`)
23
24
 
24
25
  return {
25
26
  data: result
@@ -12,6 +12,7 @@ export interface Connector {
12
12
 
13
13
  export type Context = {
14
14
  domain: Object
15
+ user: Object
15
16
  logger: any
16
17
  publish: Function
17
18
  load: Function
@@ -18,7 +18,7 @@ scenarioScheduleCallbackRouter.post('/callback-schedule-for-scenario', async (co
18
18
  // key: scenario.id,
19
19
  // operation: 'start'
20
20
 
21
- const { domain } = context.state
21
+ const { domain, user } = context.state
22
22
 
23
23
  if (!domain) {
24
24
  throw new Error('cannot identify the current domain.')
@@ -58,7 +58,11 @@ scenarioScheduleCallbackRouter.post('/callback-schedule-for-scenario', async (co
58
58
  // TODO prepare the secure authentication method
59
59
  context.state.user = scenario.creator
60
60
 
61
- ScenarioEngine.load(scenario.name, scenario, context)
61
+ ScenarioEngine.load(scenario.name, scenario, {
62
+ domain,
63
+ user,
64
+ variables: client.task?.data
65
+ })
62
66
 
63
67
  context.status = 200
64
68
  })
@@ -92,7 +92,7 @@ export class Scenario {
92
92
 
93
93
  async start(instanceName, variables?: any) {
94
94
  try {
95
- await ScenarioEngine.load(instanceName || this.name, this, { variables })
95
+ await ScenarioEngine.load(instanceName || this.name, this, { domain: this.domain, user: this.updater, variables })
96
96
  } catch (ex) {}
97
97
  }
98
98
 
@@ -71,7 +71,7 @@ export class ScenarioInstanceMutation {
71
71
  @Arg('variables', type => ScalarObject, { nullable: true }) variables: any,
72
72
  @Ctx() context: ResolverContext
73
73
  ): Promise<ScenarioInstance> {
74
- const { domain } = context.state
74
+ const { domain, user } = context.state
75
75
 
76
76
  debug('startScenario', instanceName, scenarioName, variables)
77
77
 
@@ -86,7 +86,7 @@ export class ScenarioInstanceMutation {
86
86
  }
87
87
 
88
88
  instanceName = instanceName || scenarioName
89
- return await ScenarioEngine.load(instanceName, scenario, { domain, variables })
89
+ return await ScenarioEngine.load(instanceName, scenario, { domain, user, variables })
90
90
  }
91
91
 
92
92
  @Mutation(returns => ScenarioInstance, { nullable: true, description: 'To start new scenario instance' })
@@ -7,6 +7,7 @@ import util from 'util'
7
7
  import { createLogger, format, transports } from 'winston'
8
8
 
9
9
  import { Domain, pubsub, PubSubLogTransport, ScalarObject } from '@things-factory/shell'
10
+ import { User } from '@things-factory/auth-base'
10
11
  import { sleep } from '@things-factory/utils'
11
12
 
12
13
  import { TaskRegistry } from '../../engine'
@@ -93,6 +94,9 @@ export class ScenarioInstance {
93
94
  @Field({ nullable: true })
94
95
  public domain: Domain
95
96
 
97
+ @Field({ nullable: true })
98
+ public user: User
99
+
96
100
  @Field({ nullable: true })
97
101
  public scenarioName: string
98
102
 
@@ -149,16 +153,18 @@ export class ScenarioInstance {
149
153
  }
150
154
 
151
155
  constructor(instanceName, { name: scenarioName, steps, domain: scenarioDomain }, context?) {
152
- const domain = context?.domain || scenarioDomain
156
+ const { domain = scenarioDomain, user } = context || {}
153
157
 
154
158
  this.instanceName = instanceName
155
159
  this.scenarioName = scenarioName
156
160
  this.steps = orderBy(steps || [], step => step.sequence)
157
161
  this.domain = domain
162
+ this.user = user
158
163
  this.disposer = context?.disposer
159
164
 
160
165
  this.context = {
161
166
  domain,
167
+ user,
162
168
  logger:
163
169
  context?.logger ||
164
170
  createLogger({
@@ -254,6 +260,8 @@ export class ScenarioInstance {
254
260
  const message = ex.stack ? ex.stack : ex
255
261
  const { scenarioName, domain } = this
256
262
 
263
+ this.context.logger.error(ex.message ? ex.message : ex)
264
+
257
265
  debug('failed to run ', `[ Domain: ${domain.name}, Scenario: ${scenarioName} ]\n`, ex)
258
266
  this.setState(
259
267
  ScenarioInstanceStatus.HALTED,