@things-factory/integration-base 8.0.0 → 9.0.0-beta.3

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/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 +1 -0
  10. package/dist-server/engine/index.js +1 -0
  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/tsconfig.tsbuildinfo +1 -1
  23. package/package.json +12 -11
  24. package/translations/en.json +12 -4
  25. package/translations/ja.json +12 -4
  26. package/translations/ko.json +12 -4
  27. package/translations/ms.json +12 -4
  28. package/translations/zh.json +12 -4
  29. package/server/controllers/index.ts +0 -2
  30. package/server/controllers/publish-data.ts +0 -29
  31. package/server/controllers/scenario-controller.ts +0 -156
  32. package/server/engine/analyzer/analyze-integration.ts +0 -115
  33. package/server/engine/connection-manager.ts +0 -239
  34. package/server/engine/connector/echo-back-connector.ts +0 -51
  35. package/server/engine/connector/echo-back-server.ts +0 -72
  36. package/server/engine/connector/graphql-connector.ts +0 -126
  37. package/server/engine/connector/http-connector.ts +0 -65
  38. package/server/engine/connector/index.ts +0 -12
  39. package/server/engine/connector/mqtt-connector.ts +0 -78
  40. package/server/engine/connector/mssql-connector.ts +0 -152
  41. package/server/engine/connector/mysql-connector.ts +0 -94
  42. package/server/engine/connector/operato-connector.ts +0 -264
  43. package/server/engine/connector/oracle-connector.ts +0 -218
  44. package/server/engine/connector/postgresql-connector.ts +0 -152
  45. package/server/engine/connector/proxy-connector.ts +0 -53
  46. package/server/engine/connector/socket-server.ts +0 -86
  47. package/server/engine/connector/sqlite-connector.ts +0 -69
  48. package/server/engine/edge-client.ts +0 -45
  49. package/server/engine/index.ts +0 -10
  50. package/server/engine/pending-queue.ts +0 -97
  51. package/server/engine/scenario-engine.ts +0 -106
  52. package/server/engine/task/book-up-scenario.ts +0 -73
  53. package/server/engine/task/csv-readline.ts +0 -127
  54. package/server/engine/task/data-accessor.ts +0 -36
  55. package/server/engine/task/data-mapper.ts +0 -47
  56. package/server/engine/task/database-query.ts +0 -56
  57. package/server/engine/task/echo-receive.ts +0 -21
  58. package/server/engine/task/echo-send.ts +0 -32
  59. package/server/engine/task/empty-check.ts +0 -38
  60. package/server/engine/task/end.ts +0 -18
  61. package/server/engine/task/floating-point.ts +0 -71
  62. package/server/engine/task/goto.ts +0 -27
  63. package/server/engine/task/graphql-mutate.ts +0 -79
  64. package/server/engine/task/graphql-query.ts +0 -78
  65. package/server/engine/task/headless-post.ts +0 -147
  66. package/server/engine/task/headless-scrap.ts +0 -80
  67. package/server/engine/task/http-get.ts +0 -117
  68. package/server/engine/task/http-post.ts +0 -148
  69. package/server/engine/task/index.ts +0 -45
  70. package/server/engine/task/jsonata.ts +0 -45
  71. package/server/engine/task/local-graphql-mutate.ts +0 -100
  72. package/server/engine/task/local-graphql-query.ts +0 -100
  73. package/server/engine/task/log.ts +0 -78
  74. package/server/engine/task/mqtt-publish.ts +0 -45
  75. package/server/engine/task/mqtt-subscribe.ts +0 -139
  76. package/server/engine/task/mssql-procedure.ts +0 -128
  77. package/server/engine/task/oracle-procedure.ts +0 -124
  78. package/server/engine/task/pick-pending-scenario.ts +0 -80
  79. package/server/engine/task/publish.ts +0 -40
  80. package/server/engine/task/random.ts +0 -53
  81. package/server/engine/task/reset-pending-queue.ts +0 -17
  82. package/server/engine/task/script.ts +0 -63
  83. package/server/engine/task/set-domain.ts +0 -37
  84. package/server/engine/task/sleep.ts +0 -34
  85. package/server/engine/task/socket-listener.ts +0 -96
  86. package/server/engine/task/state-group-read.ts +0 -69
  87. package/server/engine/task/state-read.ts +0 -56
  88. package/server/engine/task/state-write.ts +0 -65
  89. package/server/engine/task/stop-scenario.ts +0 -44
  90. package/server/engine/task/sub-scenario.ts +0 -57
  91. package/server/engine/task/switch-goto.ts +0 -43
  92. package/server/engine/task/switch-range-goto.ts +0 -53
  93. package/server/engine/task/switch-range-scenario.ts +0 -79
  94. package/server/engine/task/switch-range-set.ts +0 -48
  95. package/server/engine/task/switch-scenario.ts +0 -67
  96. package/server/engine/task/switch-set.ts +0 -37
  97. package/server/engine/task/throw.ts +0 -27
  98. package/server/engine/task/utils/headless-pool-for-scenario.ts +0 -71
  99. package/server/engine/task/utils/substitute.ts +0 -44
  100. package/server/engine/task/variables.ts +0 -17
  101. package/server/engine/task-registry.ts +0 -23
  102. package/server/engine/types.ts +0 -114
  103. package/server/index.ts +0 -20
  104. package/server/migrations/index.ts +0 -9
  105. package/server/restful/index.ts +0 -1
  106. package/server/restful/unstable/index.ts +0 -7
  107. package/server/restful/unstable/run-scenario.ts +0 -51
  108. package/server/restful/unstable/scenario-instance.ts +0 -52
  109. package/server/restful/unstable/scenario-instances.ts +0 -80
  110. package/server/restful/unstable/scenario.ts +0 -41
  111. package/server/restful/unstable/scenarios.ts +0 -69
  112. package/server/restful/unstable/start-scenario.ts +0 -33
  113. package/server/restful/unstable/stop-scenario.ts +0 -30
  114. package/server/routers/scenario-schedule-callback-router.ts +0 -69
  115. package/server/routers/scenario-view-router.ts +0 -46
  116. package/server/routes.ts +0 -30
  117. package/server/service/analysis/analysis-query.ts +0 -13
  118. package/server/service/analysis/index.ts +0 -3
  119. package/server/service/connection/connection-mutation.ts +0 -190
  120. package/server/service/connection/connection-query.ts +0 -87
  121. package/server/service/connection/connection-subscription.ts +0 -104
  122. package/server/service/connection/connection-type.ts +0 -288
  123. package/server/service/connection/index.ts +0 -7
  124. package/server/service/connector/connector-query.ts +0 -62
  125. package/server/service/connector/connector-type.ts +0 -29
  126. package/server/service/connector/index.ts +0 -4
  127. package/server/service/index.ts +0 -52
  128. package/server/service/payload-log/index.ts +0 -7
  129. package/server/service/payload-log/payload-log-mutation.ts +0 -151
  130. package/server/service/payload-log/payload-log-query.ts +0 -49
  131. package/server/service/payload-log/payload-log-type.ts +0 -36
  132. package/server/service/payload-log/payload-log.ts +0 -100
  133. package/server/service/property-spec.ts +0 -24
  134. package/server/service/scenario/index.ts +0 -6
  135. package/server/service/scenario/scenario-mutation.ts +0 -396
  136. package/server/service/scenario/scenario-query.ts +0 -109
  137. package/server/service/scenario/scenario-type.ts +0 -78
  138. package/server/service/scenario/scenario.ts +0 -124
  139. package/server/service/scenario-flow/scenario-flow.ts +0 -17
  140. package/server/service/scenario-instance/index.ts +0 -6
  141. package/server/service/scenario-instance/scenario-instance-mutation.ts +0 -44
  142. package/server/service/scenario-instance/scenario-instance-query.ts +0 -42
  143. package/server/service/scenario-instance/scenario-instance-subscription.ts +0 -118
  144. package/server/service/scenario-instance/scenario-instance-type.ts +0 -563
  145. package/server/service/scenario-queue/index.ts +0 -4
  146. package/server/service/scenario-queue/scenario-queue-subscription.ts +0 -55
  147. package/server/service/scenario-queue/scenario-queue-type.ts +0 -27
  148. package/server/service/state-register/data-resolver.ts +0 -56
  149. package/server/service/state-register/index.ts +0 -8
  150. package/server/service/state-register/state-register-mutation.ts +0 -166
  151. package/server/service/state-register/state-register-query.ts +0 -80
  152. package/server/service/state-register/state-register-type.ts +0 -80
  153. package/server/service/state-register/state-register.ts +0 -113
  154. package/server/service/step/index.ts +0 -6
  155. package/server/service/step/step-mutation.ts +0 -52
  156. package/server/service/step/step-query.ts +0 -55
  157. package/server/service/step/step-type.ts +0 -215
  158. package/server/service/task-type/index.ts +0 -4
  159. package/server/service/task-type/task-type-query.ts +0 -95
  160. package/server/service/task-type/task-type-type.ts +0 -29
@@ -1,100 +0,0 @@
1
- import {
2
- CreateDateColumn,
3
- UpdateDateColumn,
4
- Entity,
5
- Index,
6
- Column,
7
- RelationId,
8
- ManyToOne,
9
- PrimaryGeneratedColumn
10
- } from 'typeorm'
11
- import { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'
12
-
13
- import { config } from '@things-factory/env'
14
- import { Bizplace } from '@things-factory/biz-base'
15
- import { Domain } from '@things-factory/shell'
16
- import { User } from '@things-factory/auth-base'
17
-
18
- const ORMCONFIG = config.get('ormconfig', {})
19
- const DATABASE_TYPE = ORMCONFIG.type
20
-
21
- export enum PayloadType {
22
- INGESTION = 'ingestion',
23
- EGESTION = 'egestion'
24
- }
25
- @Entity()
26
- @Index('ix_payload_log_0', (payloadLog: PayloadLog) => [payloadLog.domain])
27
- @Index('ix_payload_log_1', (payloadLog: PayloadLog) => [payloadLog.domain, payloadLog.endpoint])
28
- @ObjectType({ description: 'Entity for PayloadLog' })
29
- export class PayloadLog {
30
- @PrimaryGeneratedColumn('uuid')
31
- @Field(type => ID)
32
- readonly id: string
33
-
34
- @ManyToOne(type => Domain)
35
- @Field(type => Domain)
36
- domain?: Domain
37
-
38
- @RelationId((payloadLog: PayloadLog) => payloadLog.domain)
39
- domainId?: string
40
-
41
- @Column()
42
- @Field()
43
- name: string
44
-
45
- @Column({
46
- nullable: true,
47
- type:
48
- DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
49
- ? 'enum'
50
- : DATABASE_TYPE == 'oracle'
51
- ? 'varchar2'
52
- : DATABASE_TYPE == 'mssql'
53
- ? 'nvarchar'
54
- : 'varchar',
55
- enum:
56
- DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? PayloadType : undefined,
57
- length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined : 32,
58
- default: PayloadType.EGESTION
59
- })
60
- @Field(type => String)
61
- type: PayloadType
62
-
63
- @Column({ nullable: true })
64
- @Field({ nullable: true })
65
- src: string
66
-
67
- @Column()
68
- @Field()
69
- endpoint: string
70
-
71
- @Column()
72
- @Field()
73
- request: string
74
-
75
- @Column()
76
- @Field()
77
- response: string
78
-
79
- @CreateDateColumn()
80
- @Field({ nullable: true })
81
- createdAt?: Date
82
-
83
- @UpdateDateColumn()
84
- @Field({ nullable: true })
85
- updatedAt?: Date
86
-
87
- @ManyToOne(type => User, { nullable: true })
88
- @Field(type => User, { nullable: true })
89
- creator?: User
90
-
91
- @RelationId((payloadLog: PayloadLog) => payloadLog.creator)
92
- creatorId?: string
93
-
94
- @ManyToOne(type => User, { nullable: true })
95
- @Field(type => User, { nullable: true })
96
- updater?: User
97
-
98
- @RelationId((payloadLog: PayloadLog) => payloadLog.updater)
99
- updaterId?: string
100
- }
@@ -1,24 +0,0 @@
1
- import { Field, ObjectType } from 'type-graphql'
2
-
3
- import { ScalarObject } from '@things-factory/shell'
4
-
5
- @ObjectType()
6
- export class PropertySpec {
7
- @Field()
8
- type: string
9
-
10
- @Field()
11
- label: string
12
-
13
- @Field()
14
- name: string
15
-
16
- @Field({ nullable: true })
17
- placeholder?: string
18
-
19
- @Field(type => ScalarObject, { nullable: true })
20
- property?: { [key: string]: any }
21
-
22
- @Field(type => ScalarObject, { nullable: true })
23
- styles?: { [key: string]: any }
24
- }
@@ -1,6 +0,0 @@
1
- import { Scenario } from './scenario'
2
- import { ScenarioQuery } from './scenario-query'
3
- import { ScenarioMutation } from './scenario-mutation'
4
-
5
- export const entities = [Scenario]
6
- export const resolvers = [ScenarioQuery, ScenarioMutation]
@@ -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 => JSON.parse(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
- }