@things-factory/integration-base 8.0.40 → 9.0.0-9.0.0-beta.59.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 (169) hide show
  1. package/dist-server/engine/connector/headless-connector.d.ts +23 -0
  2. package/dist-server/engine/connector/headless-connector.js +357 -0
  3. package/dist-server/engine/connector/headless-connector.js.map +1 -0
  4. package/dist-server/engine/connector/http-connector.js +1 -1
  5. package/dist-server/engine/connector/http-connector.js.map +1 -1
  6. package/dist-server/engine/connector/index.d.ts +1 -0
  7. package/dist-server/engine/connector/index.js +1 -0
  8. package/dist-server/engine/connector/index.js.map +1 -1
  9. package/dist-server/engine/index.d.ts +3 -2
  10. package/dist-server/engine/index.js +3 -2
  11. package/dist-server/engine/index.js.map +1 -1
  12. package/dist-server/engine/resource-pool/headless-pool.d.ts +1 -0
  13. package/dist-server/engine/resource-pool/headless-pool.js +62 -0
  14. package/dist-server/engine/resource-pool/headless-pool.js.map +1 -0
  15. package/dist-server/engine/resource-pool/index.d.ts +1 -0
  16. package/dist-server/engine/resource-pool/index.js +5 -0
  17. package/dist-server/engine/resource-pool/index.js.map +1 -0
  18. package/dist-server/engine/task/headless-post.js +19 -33
  19. package/dist-server/engine/task/headless-post.js.map +1 -1
  20. package/dist-server/engine/task/headless-scrap.js +20 -13
  21. package/dist-server/engine/task/headless-scrap.js.map +1 -1
  22. package/dist-server/index.d.ts +6 -6
  23. package/dist-server/index.js +10 -10
  24. package/dist-server/index.js.map +1 -1
  25. package/dist-server/routes.js +6 -6
  26. package/dist-server/routes.js.map +1 -1
  27. package/dist-server/service/connection/connection-mutation.js +17 -5
  28. package/dist-server/service/connection/connection-mutation.js.map +1 -1
  29. package/dist-server/service/connection/connection-query.js +3 -0
  30. package/dist-server/service/connection/connection-query.js.map +1 -1
  31. package/dist-server/tsconfig.tsbuildinfo +1 -1
  32. package/package.json +12 -11
  33. package/translations/en.json +12 -4
  34. package/translations/ja.json +12 -4
  35. package/translations/ko.json +12 -4
  36. package/translations/ms.json +12 -4
  37. package/translations/zh.json +12 -4
  38. package/server/controllers/index.ts +0 -2
  39. package/server/controllers/publish-data.ts +0 -29
  40. package/server/controllers/scenario-controller.ts +0 -154
  41. package/server/engine/analyzer/analyze-integration.ts +0 -115
  42. package/server/engine/connection-manager.ts +0 -232
  43. package/server/engine/connector/echo-back-connector.ts +0 -51
  44. package/server/engine/connector/echo-back-server.ts +0 -72
  45. package/server/engine/connector/graphql-connector.ts +0 -126
  46. package/server/engine/connector/http-connector.ts +0 -65
  47. package/server/engine/connector/index.ts +0 -12
  48. package/server/engine/connector/mqtt-connector.ts +0 -78
  49. package/server/engine/connector/mssql-connector.ts +0 -152
  50. package/server/engine/connector/mysql-connector.ts +0 -94
  51. package/server/engine/connector/operato-connector.ts +0 -264
  52. package/server/engine/connector/oracle-connector.ts +0 -218
  53. package/server/engine/connector/postgresql-connector.ts +0 -152
  54. package/server/engine/connector/proxy-connector.ts +0 -53
  55. package/server/engine/connector/socket-server.ts +0 -86
  56. package/server/engine/connector/sqlite-connector.ts +0 -69
  57. package/server/engine/edge-client.ts +0 -45
  58. package/server/engine/index.ts +0 -10
  59. package/server/engine/pending-queue.ts +0 -97
  60. package/server/engine/scenario-engine.ts +0 -106
  61. package/server/engine/task/book-up-scenario.ts +0 -73
  62. package/server/engine/task/csv-readline.ts +0 -127
  63. package/server/engine/task/data-accessor.ts +0 -36
  64. package/server/engine/task/data-mapper.ts +0 -47
  65. package/server/engine/task/database-query.ts +0 -56
  66. package/server/engine/task/echo-receive.ts +0 -21
  67. package/server/engine/task/echo-send.ts +0 -32
  68. package/server/engine/task/empty-check.ts +0 -38
  69. package/server/engine/task/end.ts +0 -18
  70. package/server/engine/task/floating-point.ts +0 -71
  71. package/server/engine/task/goto.ts +0 -27
  72. package/server/engine/task/graphql-mutate.ts +0 -79
  73. package/server/engine/task/graphql-query.ts +0 -78
  74. package/server/engine/task/headless-post.ts +0 -147
  75. package/server/engine/task/headless-scrap.ts +0 -80
  76. package/server/engine/task/http-get.ts +0 -117
  77. package/server/engine/task/http-post.ts +0 -148
  78. package/server/engine/task/index.ts +0 -45
  79. package/server/engine/task/jsonata.ts +0 -45
  80. package/server/engine/task/local-graphql-mutate.ts +0 -100
  81. package/server/engine/task/local-graphql-query.ts +0 -100
  82. package/server/engine/task/log.ts +0 -78
  83. package/server/engine/task/mqtt-publish.ts +0 -69
  84. package/server/engine/task/mqtt-subscribe.ts +0 -291
  85. package/server/engine/task/mssql-procedure.ts +0 -128
  86. package/server/engine/task/oracle-procedure.ts +0 -124
  87. package/server/engine/task/pick-pending-scenario.ts +0 -80
  88. package/server/engine/task/publish.ts +0 -40
  89. package/server/engine/task/random.ts +0 -53
  90. package/server/engine/task/reset-pending-queue.ts +0 -17
  91. package/server/engine/task/script.ts +0 -63
  92. package/server/engine/task/set-domain.ts +0 -37
  93. package/server/engine/task/sleep.ts +0 -34
  94. package/server/engine/task/socket-listener.ts +0 -96
  95. package/server/engine/task/state-group-read.ts +0 -69
  96. package/server/engine/task/state-read.ts +0 -56
  97. package/server/engine/task/state-write.ts +0 -65
  98. package/server/engine/task/stop-scenario.ts +0 -44
  99. package/server/engine/task/sub-scenario.ts +0 -57
  100. package/server/engine/task/switch-goto.ts +0 -43
  101. package/server/engine/task/switch-range-goto.ts +0 -53
  102. package/server/engine/task/switch-range-scenario.ts +0 -79
  103. package/server/engine/task/switch-range-set.ts +0 -48
  104. package/server/engine/task/switch-scenario.ts +0 -67
  105. package/server/engine/task/switch-set.ts +0 -37
  106. package/server/engine/task/throw.ts +0 -27
  107. package/server/engine/task/utils/headless-pool-for-scenario.ts +0 -71
  108. package/server/engine/task/utils/substitute.ts +0 -44
  109. package/server/engine/task/variables.ts +0 -17
  110. package/server/engine/task-registry.ts +0 -23
  111. package/server/engine/types.ts +0 -114
  112. package/server/index.ts +0 -20
  113. package/server/migrations/index.ts +0 -9
  114. package/server/restful/index.ts +0 -1
  115. package/server/restful/unstable/index.ts +0 -7
  116. package/server/restful/unstable/run-scenario.ts +0 -51
  117. package/server/restful/unstable/scenario-instance.ts +0 -52
  118. package/server/restful/unstable/scenario-instances.ts +0 -80
  119. package/server/restful/unstable/scenario.ts +0 -41
  120. package/server/restful/unstable/scenarios.ts +0 -69
  121. package/server/restful/unstable/start-scenario.ts +0 -33
  122. package/server/restful/unstable/stop-scenario.ts +0 -30
  123. package/server/routers/scenario-schedule-callback-router.ts +0 -69
  124. package/server/routers/scenario-view-router.ts +0 -46
  125. package/server/routes.ts +0 -35
  126. package/server/service/analysis/analysis-query.ts +0 -13
  127. package/server/service/analysis/index.ts +0 -3
  128. package/server/service/connection/connection-mutation.ts +0 -190
  129. package/server/service/connection/connection-query.ts +0 -87
  130. package/server/service/connection/connection-subscription.ts +0 -104
  131. package/server/service/connection/connection-type.ts +0 -305
  132. package/server/service/connection/index.ts +0 -7
  133. package/server/service/connector/connector-query.ts +0 -62
  134. package/server/service/connector/connector-type.ts +0 -29
  135. package/server/service/connector/index.ts +0 -4
  136. package/server/service/index.ts +0 -52
  137. package/server/service/payload-log/index.ts +0 -7
  138. package/server/service/payload-log/payload-log-mutation.ts +0 -151
  139. package/server/service/payload-log/payload-log-query.ts +0 -49
  140. package/server/service/payload-log/payload-log-type.ts +0 -36
  141. package/server/service/payload-log/payload-log.ts +0 -100
  142. package/server/service/property-spec.ts +0 -24
  143. package/server/service/scenario/index.ts +0 -6
  144. package/server/service/scenario/scenario-mutation.ts +0 -396
  145. package/server/service/scenario/scenario-query.ts +0 -109
  146. package/server/service/scenario/scenario-type.ts +0 -78
  147. package/server/service/scenario/scenario.ts +0 -124
  148. package/server/service/scenario-flow/scenario-flow.ts +0 -17
  149. package/server/service/scenario-instance/index.ts +0 -6
  150. package/server/service/scenario-instance/scenario-instance-mutation.ts +0 -44
  151. package/server/service/scenario-instance/scenario-instance-query.ts +0 -42
  152. package/server/service/scenario-instance/scenario-instance-subscription.ts +0 -118
  153. package/server/service/scenario-instance/scenario-instance-type.ts +0 -557
  154. package/server/service/scenario-queue/index.ts +0 -4
  155. package/server/service/scenario-queue/scenario-queue-subscription.ts +0 -55
  156. package/server/service/scenario-queue/scenario-queue-type.ts +0 -27
  157. package/server/service/state-register/data-resolver.ts +0 -56
  158. package/server/service/state-register/index.ts +0 -8
  159. package/server/service/state-register/state-register-mutation.ts +0 -166
  160. package/server/service/state-register/state-register-query.ts +0 -80
  161. package/server/service/state-register/state-register-type.ts +0 -80
  162. package/server/service/state-register/state-register.ts +0 -113
  163. package/server/service/step/index.ts +0 -6
  164. package/server/service/step/step-mutation.ts +0 -52
  165. package/server/service/step/step-query.ts +0 -55
  166. package/server/service/step/step-type.ts +0 -238
  167. package/server/service/task-type/index.ts +0 -4
  168. package/server/service/task-type/task-type-query.ts +0 -95
  169. package/server/service/task-type/task-type-type.ts +0 -29
@@ -1,396 +0,0 @@
1
- import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
- import { In } from 'typeorm'
3
-
4
- import {
5
- Application,
6
- getCallbackBaseWithDomainContext,
7
- registerSchedule,
8
- unregisterSchedule
9
- } from '@things-factory/scheduler-client'
10
-
11
- import { Step } from '../step/step-type'
12
- import { Scenario } from './scenario'
13
- import { NewScenario, ScenarioPatch } from './scenario-type'
14
-
15
- const crypto = require('crypto')
16
-
17
- @Resolver(Scenario)
18
- export class ScenarioMutation {
19
- @Directive('@transaction')
20
- @Directive('@privilege(category: "scenario", privilege: "mutation", domainOwnerGranted: true)')
21
- @Mutation(returns => Scenario, { description: 'To create new scenario' })
22
- async createScenario(
23
- @Arg('scenario', type => NewScenario) scenario: NewScenario,
24
- @Ctx() context: ResolverContext
25
- ): Promise<Scenario> {
26
- const { domain, user, tx } = context.state
27
-
28
- return await tx.getRepository(Scenario).save({
29
- ...scenario,
30
- domain,
31
- creator: user,
32
- updater: user
33
- })
34
- }
35
-
36
- @Directive('@transaction')
37
- @Directive('@privilege(category: "scenario", privilege: "mutation", domainOwnerGranted: true)')
38
- @Mutation(returns => Scenario, { description: 'To modify scenario information' })
39
- async updateScenario(
40
- @Arg('name') name: string,
41
- @Arg('patch', type => ScenarioPatch) patch: ScenarioPatch,
42
- @Ctx() context: ResolverContext
43
- ): Promise<Scenario> {
44
- const { domain, user, tx } = context.state
45
-
46
- const repository = tx.getRepository(Scenario)
47
- const scenario = await repository.findOne({
48
- where: { domain: { id: domain.id }, name }
49
- })
50
-
51
- if (!scenario) {
52
- throw new Error(
53
- context.t('error.scenario not found', {
54
- scenario: name
55
- })
56
- )
57
- }
58
-
59
- return await repository.save({
60
- ...scenario,
61
- ...patch,
62
- updater: user
63
- })
64
- }
65
-
66
- @Directive('@transaction')
67
- @Directive('@privilege(category: "scenario", privilege: "mutation", domainOwnerGranted: true)')
68
- @Mutation(returns => [Scenario], { description: "To modify multiple scenarios' information" })
69
- async updateMultipleScenario(
70
- @Arg('patches', type => [ScenarioPatch]) patches: ScenarioPatch[],
71
- @Ctx() context: ResolverContext
72
- ): Promise<Scenario[]> {
73
- const { domain, user, tx } = context.state
74
-
75
- let results = []
76
- const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
77
- const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
78
- const scenarioRepo = tx.getRepository(Scenario)
79
-
80
- if (_createRecords.length > 0) {
81
- for (let i = 0; i < _createRecords.length; i++) {
82
- const newRecord = _createRecords[i]
83
-
84
- const result = await scenarioRepo.save({
85
- ...newRecord,
86
- domain,
87
- creator: user,
88
- updater: user
89
- })
90
-
91
- results.push({ ...result, cuFlag: '+' })
92
- }
93
- }
94
-
95
- if (_updateRecords.length > 0) {
96
- for (let i = 0; i < _updateRecords.length; i++) {
97
- const newRecord = _updateRecords[i]
98
- const scenario = await scenarioRepo.findOneBy({ id: newRecord.id })
99
-
100
- const result = await scenarioRepo.save({
101
- ...scenario,
102
- ...newRecord,
103
- updater: user
104
- })
105
-
106
- results.push({ ...result, cuFlag: 'M' })
107
- }
108
- }
109
-
110
- return results
111
- }
112
-
113
- @Directive('@transaction')
114
- @Directive('@privilege(category: "scenario", privilege: "mutation", domainOwnerGranted: true)')
115
- @Mutation(returns => Boolean, { description: 'To delete scenario' })
116
- async deleteScenario(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<boolean> {
117
- const { domain, tx } = context.state
118
-
119
- await tx.getRepository(Scenario).delete({ domain: { id: domain.id }, name })
120
-
121
- return true
122
- }
123
-
124
- @Directive('@transaction')
125
- @Directive('@privilege(category: "scenario", privilege: "mutation", domainOwnerGranted: true)')
126
- @Mutation(returns => Boolean, { description: 'To delete multiple scenarios' })
127
- async deleteScenarios(
128
- @Arg('ids', type => [String]) ids: string[],
129
- @Ctx() context: ResolverContext
130
- ): Promise<boolean> {
131
- const { domain, tx } = context.state
132
-
133
- await tx.getRepository(Scenario).delete({
134
- domain: { id: domain.id },
135
- id: In(ids)
136
- })
137
-
138
- return true
139
- }
140
-
141
- @Directive('@transaction')
142
- @Directive('@privilege(category: "scenario", privilege: "mutation", domainOwnerGranted: true)')
143
- @Mutation(returns => Boolean, { description: 'To import multiple scenarios' })
144
- async importScenarios(
145
- @Arg('scenarios', type => [ScenarioPatch]) scenarios: Scenario[],
146
- @Ctx() context: ResolverContext
147
- ): Promise<boolean> {
148
- const { tx, domain, user } = context.state
149
-
150
- const repository = tx.getRepository(Scenario)
151
-
152
- await Promise.all(
153
- scenarios.map(async (scenario: Scenario) => {
154
- const { id, name } = scenario
155
- var savedScenario
156
-
157
- if (id) {
158
- const sameId = await repository.findOneBy({ id })
159
-
160
- if (sameId) {
161
- if (sameId.domainId != domain.id) {
162
- throw `Scenario with id '${id}:${name}' is already taken by another domain`
163
- }
164
-
165
- const sameName = await repository.findOneBy({ domain: { id: domain.id }, name })
166
- if (sameName && sameName.id != id) {
167
- throw `Scenario Name '${name}' is already taken by another scenario`
168
- }
169
-
170
- savedScenario = await repository.save({
171
- ...sameId,
172
- ...scenario,
173
- domain,
174
- updater: user
175
- })
176
- } else {
177
- savedScenario = await repository.save({
178
- ...scenario,
179
- domain,
180
- updater: user,
181
- creator: user
182
- })
183
- }
184
- } else {
185
- savedScenario = await repository.save({
186
- ...scenario,
187
- domain,
188
- updater: user,
189
- creator: user
190
- })
191
- }
192
-
193
- await tx.getRepository(Step).delete({ domain: { id: domain.id }, scenario: { id: savedScenario.id } })
194
- await tx.getRepository(Step).save(
195
- scenario.steps.map((step: Step) => {
196
- return {
197
- ...step,
198
- domain,
199
- scenario: savedScenario,
200
- updater: user
201
- }
202
- })
203
- )
204
- })
205
- )
206
-
207
- return true
208
- }
209
-
210
- @Directive('@transaction')
211
- @Directive('@privilege(category: "scenario", privilege: "mutation", domainOwnerGranted: true)')
212
- @Mutation(returns => [Scenario], { description: 'To import multiple scenarios' })
213
- async copyScenarios(
214
- @Arg('ids', type => [String]) ids: string[],
215
- @Ctx() context: ResolverContext
216
- ): Promise<Scenario[]> {
217
- const { domain, user, tx } = context.state
218
-
219
- const originals = await tx.getRepository(Scenario).find({
220
- where: {
221
- id: In(ids),
222
- domain: { id: domain.id }
223
- },
224
- relations: ['domain', 'steps']
225
- })
226
-
227
- if (originals.length == 0) {
228
- return []
229
- }
230
-
231
- var newSteps = []
232
-
233
- var newCopys = originals.map(scenario => {
234
- let scenarioId = crypto.randomUUID()
235
- newSteps.push(
236
- ...scenario.steps.map(step => {
237
- return {
238
- scenario: scenarioId,
239
- name: step.name,
240
- description: step.description,
241
- sequence: step.sequence,
242
- task: step.task,
243
- connection: step.connection,
244
- params: step.params,
245
-
246
- domain,
247
- creator: user,
248
- updater: user
249
- }
250
- })
251
- )
252
-
253
- return {
254
- id: scenarioId,
255
- name: scenario.name + ' (' + scenarioId + ')',
256
- type: scenario.type,
257
- description: scenario.description,
258
- active: false, // deprecated
259
- schedule: scenario.schedule,
260
- timezone: scenario.timezone,
261
-
262
- domain,
263
- creator: user,
264
- updater: user
265
- }
266
- })
267
-
268
- var copiedScenarios = await tx.getRepository(Scenario).save(newCopys)
269
- var copiedSteps = await tx.getRepository(Step).save(newSteps)
270
-
271
- return copiedScenarios.map(scenario => {
272
- scenario.steps = copiedSteps.filter(step => step.scenario == scenario.id)
273
- return scenario
274
- })
275
- }
276
-
277
- @Directive('@transaction')
278
- @Directive('@privilege(category: "scenario", privilege: "mutation", domainOwnerGranted: true)')
279
- @Mutation(returns => Scenario, {
280
- description: 'To start posting scenario based on the schedule of the given scenario'
281
- })
282
- async startScenarioSchedule(
283
- @Arg('scenarioId') scenarioId: string,
284
- @Ctx() context: ResolverContext
285
- ): Promise<Scenario> {
286
- const { domain, user, tx } = context.state
287
-
288
- var repository = tx.getRepository(Scenario)
289
- var scenario = await repository.findOne({
290
- where: { domain: { id: domain.id }, id: scenarioId }
291
- })
292
-
293
- if (!scenario) {
294
- throw new Error(
295
- context.t('error.scenario not found', {
296
- scenario: scenarioId
297
- })
298
- )
299
- }
300
-
301
- if (!scenario.schedule) {
302
- throw new Error(
303
- context.t('error.schedule is not set', {
304
- scenario: scenario.name
305
- })
306
- )
307
- }
308
-
309
- if (!scenario.timezone) {
310
- throw new Error(
311
- context.t('error.timezone is not set', {
312
- scenario: scenario.name
313
- })
314
- )
315
- }
316
-
317
- try {
318
- var handle = await registerSchedule({
319
- name: scenario.name,
320
- client: {
321
- application: Application,
322
- group: `${domain.id}`,
323
- type: 'scenario',
324
- key: scenario.id,
325
- operation: 'start'
326
- },
327
- type: 'cron',
328
- schedule: scenario.schedule,
329
- timezone: scenario.timezone,
330
- task: {
331
- type: 'rest',
332
- connection: {
333
- host: `${getCallbackBaseWithDomainContext(domain)}/callback-schedule-for-scenario`,
334
- headers: {
335
- 'Content-Type': 'application/json',
336
- accept: '*/*'
337
- }
338
- },
339
- data: {
340
- domainId: domain.id,
341
- userId: user.id,
342
- scenarioId
343
- },
344
- history_check: true,
345
- failed_policy: 'retry_dlq',
346
- max_retry_count: -1,
347
- retry_period: 60
348
- }
349
- })
350
-
351
- return await repository.save({
352
- ...scenario,
353
- scheduleId: handle
354
- })
355
- } catch (err) {
356
- console.error('startScenarioSchedule', err)
357
- }
358
- }
359
-
360
- @Directive('@transaction')
361
- @Directive('@privilege(category: "scenario", privilege: "mutation", domainOwnerGranted: true)')
362
- @Mutation(returns => Scenario, {
363
- nullable: true,
364
- description: 'To stop posting scenario based on the schedule of the given scenario'
365
- })
366
- async stopScenarioSchedule(
367
- @Arg('scenarioId') scenarioId: string,
368
- @Ctx() context: ResolverContext
369
- ): Promise<Scenario | undefined> {
370
- const { domain, tx } = context.state
371
-
372
- var repository = tx.getRepository(Scenario)
373
- var scenario = await repository.findOne({
374
- where: { domain: { id: domain.id }, id: scenarioId }
375
- })
376
-
377
- if (!scenario) {
378
- throw new Error(
379
- context.t('error.scenario not found', {
380
- scenario: scenarioId
381
- })
382
- )
383
- }
384
-
385
- try {
386
- await unregisterSchedule(scenario.scheduleId)
387
-
388
- return await repository.save({
389
- ...scenario,
390
- scheduleId: null
391
- })
392
- } catch (err) {
393
- console.error('stopScenarioSchedule', err)
394
- }
395
- }
396
- }
@@ -1,109 +0,0 @@
1
- import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
- import { Not, IsNull } from 'typeorm'
3
-
4
- import { User, Role } from '@things-factory/auth-base'
5
- import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
6
-
7
- import { ScenarioEngine } from '../../engine'
8
- import { ScenarioInstance, ScenarioInstanceStatus } from '../scenario-instance/scenario-instance-type'
9
- import { Step } from '../step/step-type'
10
- import { Scenario } from './scenario'
11
- import { ScenarioList } from './scenario-type'
12
- import { Connection } from '../connection/connection-type'
13
-
14
- @Resolver(Scenario)
15
- export class ScenarioQuery {
16
- @Directive('@privilege(category: "scenario", privilege: "query", domainOwnerGranted: true)')
17
- @Query(returns => Scenario, { description: 'To fetch a scenario' })
18
- async scenario(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Scenario> {
19
- const { domain } = context.state
20
-
21
- const scenario = await getRepository(Scenario).findOne({ where: { id } })
22
- if (domain.id == scenario.domainId || domain.parentId == scenario.domainId) {
23
- return scenario
24
- }
25
- }
26
-
27
- @Directive('@privilege(category: "scenario", privilege: "query", domainOwnerGranted: true)')
28
- @Query(returns => ScenarioList, { description: 'To fetch multiple scenarios' })
29
- async scenarios(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<ScenarioList> {
30
- const { domain } = context.state
31
-
32
- const queryBuilder = getQueryBuilderFromListParams({
33
- repository: getRepository(Scenario),
34
- params,
35
- domain,
36
- searchables: ['name', 'description', 'type']
37
- })
38
-
39
- const [items, total] = await queryBuilder.getManyAndCount()
40
-
41
- return { items, total }
42
- }
43
-
44
- @FieldResolver(type => Domain)
45
- async domain(@Root() scenario: Scenario) {
46
- return await getRepository(Domain).findOneBy({ id: scenario.domainId })
47
- }
48
-
49
- @FieldResolver(type => User)
50
- async updater(@Root() scenario: Scenario): Promise<User> {
51
- return await getRepository(User).findOneBy({ id: scenario.updaterId })
52
- }
53
-
54
- @FieldResolver(type => User)
55
- async creator(@Root() scenario: Scenario): Promise<User> {
56
- return await getRepository(User).findOneBy({ id: scenario.creatorId })
57
- }
58
-
59
- @FieldResolver(type => [Step])
60
- async steps(@Root() scenario: Scenario, @Ctx() context: ResolverContext): Promise<Step[]> {
61
- const { domain } = context.state
62
-
63
- return await getRepository(Step).find({
64
- where: { domain: { id: domain.id }, scenario: { id: scenario.id } }
65
- })
66
- }
67
-
68
- @FieldResolver(type => [Connection])
69
- async connectionNames(@Root() scenario: Scenario, @Ctx() context: ResolverContext) {
70
- const { domain } = context.state
71
-
72
- const steps = await getRepository(Step).find({
73
- where: { domain: { id: domain.id }, scenario: { id: scenario.id }, connection: Not(IsNull()) }
74
- })
75
-
76
- return steps.map(step => step.connection).filter(Boolean)
77
- }
78
-
79
- @FieldResolver(type => [Connection])
80
- async publishTags(@Root() scenario: Scenario, @Ctx() context: ResolverContext) {
81
- const { domain } = context.state
82
-
83
- const steps = await getRepository(Step).find({
84
- where: { domain: { id: domain.id }, scenario: { id: scenario.id }, task: 'publish' }
85
- })
86
-
87
- return steps.map(step => step.params?.tag).filter(Boolean)
88
- }
89
-
90
- @FieldResolver(type => String, { nullable: true })
91
- async state(@Root() scenario: Scenario, @Ctx() context: ResolverContext): Promise<string> {
92
- const { domain } = context.state
93
-
94
- var instance = ScenarioEngine.getScenarioInstance(domain, scenario.name)
95
- return instance && ScenarioInstanceStatus[instance.context?.state]
96
- }
97
-
98
- @FieldResolver(type => [ScenarioInstance], { nullable: true })
99
- async instances(@Root() scenario: Scenario, @Ctx() context: ResolverContext): Promise<ScenarioInstance[]> {
100
- const { domain } = context.state
101
-
102
- return ScenarioEngine.getScenarioInstances(domain, scenario.name)
103
- }
104
-
105
- @FieldResolver(type => Role)
106
- async role(@Root() scenario: Scenario) {
107
- return scenario.roleId && (await getRepository(Role).findOneBy({ id: scenario.roleId }))
108
- }
109
- }
@@ -1,78 +0,0 @@
1
- import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
-
3
- import { ObjectRef } from '@things-factory/shell'
4
-
5
- import { Scenario } from './scenario'
6
- import { StepPatch } from '../step/step-type'
7
-
8
- @InputType()
9
- export class NewScenario {
10
- @Field()
11
- name: string
12
-
13
- @Field({ nullable: true })
14
- description?: string
15
-
16
- @Field({ nullable: true })
17
- type?: string
18
-
19
- @Field({ nullable: true })
20
- schedule?: string
21
-
22
- @Field({ nullable: true })
23
- timezone?: string
24
-
25
- @Field({ nullable: true })
26
- ttl?: number
27
-
28
- @Field({ nullable: true })
29
- active?: boolean
30
-
31
- @Field(type => ObjectRef, { nullable: true })
32
- role?: ObjectRef
33
- }
34
-
35
- @InputType()
36
- export class ScenarioPatch {
37
- @Field(type => ID, { nullable: true })
38
- id?: string
39
-
40
- @Field({ nullable: true })
41
- name?: string
42
-
43
- @Field({ nullable: true })
44
- description?: string
45
-
46
- @Field({ nullable: true })
47
- type?: string
48
-
49
- @Field({ nullable: true })
50
- schedule?: string
51
-
52
- @Field({ nullable: true })
53
- timezone?: string
54
-
55
- @Field({ nullable: true })
56
- ttl?: number
57
-
58
- @Field({ nullable: true })
59
- active?: boolean
60
-
61
- @Field(type => [StepPatch], { nullable: true })
62
- steps?: StepPatch[]
63
-
64
- @Field(type => ObjectRef, { nullable: true })
65
- role?: ObjectRef
66
-
67
- @Field({ nullable: true })
68
- cuFlag?: string
69
- }
70
-
71
- @ObjectType()
72
- export class ScenarioList {
73
- @Field(type => [Scenario])
74
- items: Scenario[]
75
-
76
- @Field(type => Int)
77
- total: number
78
- }
@@ -1,124 +0,0 @@
1
- import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
- import {
3
- Column,
4
- CreateDateColumn,
5
- Entity,
6
- Index,
7
- ManyToOne,
8
- OneToMany,
9
- PrimaryGeneratedColumn,
10
- RelationId,
11
- UpdateDateColumn
12
- } from 'typeorm'
13
-
14
- import { PrivilegeObject, Role, User } from '@things-factory/auth-base'
15
- import { Domain } from '@things-factory/shell'
16
-
17
- import { ScenarioEngine } from '../../engine'
18
- import { Step } from '../step/step-type'
19
-
20
- @Entity()
21
- @Index('ix_scenario_0', (scenario: Scenario) => [scenario.domain, scenario.name], { unique: true })
22
- @ObjectType()
23
- export class Scenario {
24
- @PrimaryGeneratedColumn('uuid')
25
- @Field(type => ID)
26
- id?: string
27
-
28
- @ManyToOne(type => Domain)
29
- @Field(type => Domain)
30
- domain?: Domain
31
-
32
- @RelationId((scenario: Scenario) => scenario.domain)
33
- domainId?: string
34
-
35
- @Column()
36
- @Field()
37
- name?: string
38
-
39
- @Column({ nullable: true })
40
- @Field({ nullable: true })
41
- description?: string
42
-
43
- @Column({ nullable: true })
44
- @Field({ nullable: true })
45
- type?: string
46
-
47
- @Column({ nullable: true })
48
- @Field({ nullable: true, description: 'accessible and executable system-wide' })
49
- public?: boolean
50
-
51
- @Column({ nullable: true })
52
- @Field({ nullable: true, description: '[will be deprecated] automatically be started when this server start' })
53
- active?: boolean
54
-
55
- @Column({ nullable: true })
56
- @Field({ nullable: true })
57
- schedule?: string
58
-
59
- @Column({ nullable: true })
60
- @Field({ nullable: true })
61
- scheduleId?: string
62
-
63
- @Column({ nullable: true })
64
- @Field({ nullable: true })
65
- timezone?: string
66
-
67
- @Column({ nullable: true })
68
- @Field({ nullable: true })
69
- ttl?: number
70
-
71
- @OneToMany(type => Step, step => step.scenario)
72
- @Field(type => [Step], { nullable: true })
73
- steps?: Step[]
74
-
75
- @Column({ type: 'simple-json', nullable: true })
76
- @Field(type => PrivilegeObject, { nullable: true })
77
- privilege?: PrivilegeObject
78
-
79
- @ManyToOne(type => Role)
80
- @Field(type => Role, { nullable: true })
81
- role?: Role
82
-
83
- @RelationId((scenario: Scenario) => scenario.role)
84
- roleId?: string
85
-
86
- @CreateDateColumn()
87
- @Field({ nullable: true })
88
- createdAt?: Date
89
-
90
- @UpdateDateColumn()
91
- @Field({ nullable: true })
92
- updatedAt?: Date
93
-
94
- @ManyToOne(type => User, { nullable: true })
95
- @Field(type => User, { nullable: true })
96
- creator?: User
97
-
98
- @RelationId((scenario: Scenario) => scenario.creator)
99
- creatorId?: string
100
-
101
- @ManyToOne(type => User, { nullable: true })
102
- @Field(type => User, { nullable: true })
103
- updater?: User
104
-
105
- @RelationId((scenario: Scenario) => scenario.updater)
106
- updaterId?: string
107
-
108
- async start(options?: { instanceName?: string; domain?: Domain; user?: User; variables?: any }) {
109
- try {
110
- await ScenarioEngine.load(options?.instanceName || this.name, this, {
111
- domain: options?.domain || this.domain,
112
- user: options?.user || this.updater,
113
- variables: options?.variables
114
- })
115
- } catch (ex) {}
116
- }
117
-
118
- async stop(options?: { instanceName?: string; domain?: Domain; user?: User }) {
119
- try {
120
- await ScenarioEngine.unload(options?.domain || this.domain, options?.instanceName || this.name)
121
- } finally {
122
- }
123
- }
124
- }