@things-factory/integration-base 8.0.39 → 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 (174) 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/engine/task/mqtt-publish.js +29 -6
  23. package/dist-server/engine/task/mqtt-publish.js.map +1 -1
  24. package/dist-server/engine/task/mqtt-subscribe.js +178 -64
  25. package/dist-server/engine/task/mqtt-subscribe.js.map +1 -1
  26. package/dist-server/index.d.ts +6 -6
  27. package/dist-server/index.js +10 -10
  28. package/dist-server/index.js.map +1 -1
  29. package/dist-server/routes.js +6 -6
  30. package/dist-server/routes.js.map +1 -1
  31. package/dist-server/service/connection/connection-mutation.js +17 -5
  32. package/dist-server/service/connection/connection-mutation.js.map +1 -1
  33. package/dist-server/service/connection/connection-query.js +3 -0
  34. package/dist-server/service/connection/connection-query.js.map +1 -1
  35. package/dist-server/service/index.d.ts +1 -1
  36. package/dist-server/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +12 -11
  38. package/translations/en.json +12 -4
  39. package/translations/ja.json +12 -4
  40. package/translations/ko.json +12 -4
  41. package/translations/ms.json +12 -4
  42. package/translations/zh.json +12 -4
  43. package/server/controllers/index.ts +0 -2
  44. package/server/controllers/publish-data.ts +0 -29
  45. package/server/controllers/scenario-controller.ts +0 -154
  46. package/server/engine/analyzer/analyze-integration.ts +0 -115
  47. package/server/engine/connection-manager.ts +0 -232
  48. package/server/engine/connector/echo-back-connector.ts +0 -51
  49. package/server/engine/connector/echo-back-server.ts +0 -72
  50. package/server/engine/connector/graphql-connector.ts +0 -126
  51. package/server/engine/connector/http-connector.ts +0 -65
  52. package/server/engine/connector/index.ts +0 -12
  53. package/server/engine/connector/mqtt-connector.ts +0 -78
  54. package/server/engine/connector/mssql-connector.ts +0 -152
  55. package/server/engine/connector/mysql-connector.ts +0 -94
  56. package/server/engine/connector/operato-connector.ts +0 -264
  57. package/server/engine/connector/oracle-connector.ts +0 -218
  58. package/server/engine/connector/postgresql-connector.ts +0 -152
  59. package/server/engine/connector/proxy-connector.ts +0 -53
  60. package/server/engine/connector/socket-server.ts +0 -86
  61. package/server/engine/connector/sqlite-connector.ts +0 -69
  62. package/server/engine/edge-client.ts +0 -45
  63. package/server/engine/index.ts +0 -10
  64. package/server/engine/pending-queue.ts +0 -97
  65. package/server/engine/scenario-engine.ts +0 -106
  66. package/server/engine/task/book-up-scenario.ts +0 -73
  67. package/server/engine/task/csv-readline.ts +0 -127
  68. package/server/engine/task/data-accessor.ts +0 -36
  69. package/server/engine/task/data-mapper.ts +0 -47
  70. package/server/engine/task/database-query.ts +0 -56
  71. package/server/engine/task/echo-receive.ts +0 -21
  72. package/server/engine/task/echo-send.ts +0 -32
  73. package/server/engine/task/empty-check.ts +0 -38
  74. package/server/engine/task/end.ts +0 -18
  75. package/server/engine/task/floating-point.ts +0 -71
  76. package/server/engine/task/goto.ts +0 -27
  77. package/server/engine/task/graphql-mutate.ts +0 -79
  78. package/server/engine/task/graphql-query.ts +0 -78
  79. package/server/engine/task/headless-post.ts +0 -147
  80. package/server/engine/task/headless-scrap.ts +0 -80
  81. package/server/engine/task/http-get.ts +0 -117
  82. package/server/engine/task/http-post.ts +0 -148
  83. package/server/engine/task/index.ts +0 -45
  84. package/server/engine/task/jsonata.ts +0 -45
  85. package/server/engine/task/local-graphql-mutate.ts +0 -100
  86. package/server/engine/task/local-graphql-query.ts +0 -100
  87. package/server/engine/task/log.ts +0 -78
  88. package/server/engine/task/mqtt-publish.ts +0 -45
  89. package/server/engine/task/mqtt-subscribe.ts +0 -139
  90. package/server/engine/task/mssql-procedure.ts +0 -128
  91. package/server/engine/task/oracle-procedure.ts +0 -124
  92. package/server/engine/task/pick-pending-scenario.ts +0 -80
  93. package/server/engine/task/publish.ts +0 -40
  94. package/server/engine/task/random.ts +0 -53
  95. package/server/engine/task/reset-pending-queue.ts +0 -17
  96. package/server/engine/task/script.ts +0 -63
  97. package/server/engine/task/set-domain.ts +0 -37
  98. package/server/engine/task/sleep.ts +0 -34
  99. package/server/engine/task/socket-listener.ts +0 -96
  100. package/server/engine/task/state-group-read.ts +0 -69
  101. package/server/engine/task/state-read.ts +0 -56
  102. package/server/engine/task/state-write.ts +0 -65
  103. package/server/engine/task/stop-scenario.ts +0 -44
  104. package/server/engine/task/sub-scenario.ts +0 -57
  105. package/server/engine/task/switch-goto.ts +0 -43
  106. package/server/engine/task/switch-range-goto.ts +0 -53
  107. package/server/engine/task/switch-range-scenario.ts +0 -79
  108. package/server/engine/task/switch-range-set.ts +0 -48
  109. package/server/engine/task/switch-scenario.ts +0 -67
  110. package/server/engine/task/switch-set.ts +0 -37
  111. package/server/engine/task/throw.ts +0 -27
  112. package/server/engine/task/utils/headless-pool-for-scenario.ts +0 -71
  113. package/server/engine/task/utils/substitute.ts +0 -44
  114. package/server/engine/task/variables.ts +0 -17
  115. package/server/engine/task-registry.ts +0 -23
  116. package/server/engine/types.ts +0 -114
  117. package/server/index.ts +0 -20
  118. package/server/migrations/index.ts +0 -9
  119. package/server/restful/index.ts +0 -1
  120. package/server/restful/unstable/index.ts +0 -7
  121. package/server/restful/unstable/run-scenario.ts +0 -51
  122. package/server/restful/unstable/scenario-instance.ts +0 -52
  123. package/server/restful/unstable/scenario-instances.ts +0 -80
  124. package/server/restful/unstable/scenario.ts +0 -41
  125. package/server/restful/unstable/scenarios.ts +0 -69
  126. package/server/restful/unstable/start-scenario.ts +0 -33
  127. package/server/restful/unstable/stop-scenario.ts +0 -30
  128. package/server/routers/scenario-schedule-callback-router.ts +0 -69
  129. package/server/routers/scenario-view-router.ts +0 -46
  130. package/server/routes.ts +0 -35
  131. package/server/service/analysis/analysis-query.ts +0 -13
  132. package/server/service/analysis/index.ts +0 -3
  133. package/server/service/connection/connection-mutation.ts +0 -190
  134. package/server/service/connection/connection-query.ts +0 -87
  135. package/server/service/connection/connection-subscription.ts +0 -104
  136. package/server/service/connection/connection-type.ts +0 -305
  137. package/server/service/connection/index.ts +0 -7
  138. package/server/service/connector/connector-query.ts +0 -62
  139. package/server/service/connector/connector-type.ts +0 -29
  140. package/server/service/connector/index.ts +0 -4
  141. package/server/service/index.ts +0 -52
  142. package/server/service/payload-log/index.ts +0 -7
  143. package/server/service/payload-log/payload-log-mutation.ts +0 -151
  144. package/server/service/payload-log/payload-log-query.ts +0 -49
  145. package/server/service/payload-log/payload-log-type.ts +0 -36
  146. package/server/service/payload-log/payload-log.ts +0 -100
  147. package/server/service/property-spec.ts +0 -24
  148. package/server/service/scenario/index.ts +0 -6
  149. package/server/service/scenario/scenario-mutation.ts +0 -396
  150. package/server/service/scenario/scenario-query.ts +0 -109
  151. package/server/service/scenario/scenario-type.ts +0 -78
  152. package/server/service/scenario/scenario.ts +0 -124
  153. package/server/service/scenario-flow/scenario-flow.ts +0 -17
  154. package/server/service/scenario-instance/index.ts +0 -6
  155. package/server/service/scenario-instance/scenario-instance-mutation.ts +0 -44
  156. package/server/service/scenario-instance/scenario-instance-query.ts +0 -42
  157. package/server/service/scenario-instance/scenario-instance-subscription.ts +0 -118
  158. package/server/service/scenario-instance/scenario-instance-type.ts +0 -557
  159. package/server/service/scenario-queue/index.ts +0 -4
  160. package/server/service/scenario-queue/scenario-queue-subscription.ts +0 -55
  161. package/server/service/scenario-queue/scenario-queue-type.ts +0 -27
  162. package/server/service/state-register/data-resolver.ts +0 -56
  163. package/server/service/state-register/index.ts +0 -8
  164. package/server/service/state-register/state-register-mutation.ts +0 -166
  165. package/server/service/state-register/state-register-query.ts +0 -80
  166. package/server/service/state-register/state-register-type.ts +0 -80
  167. package/server/service/state-register/state-register.ts +0 -113
  168. package/server/service/step/index.ts +0 -6
  169. package/server/service/step/step-mutation.ts +0 -52
  170. package/server/service/step/step-query.ts +0 -55
  171. package/server/service/step/step-type.ts +0 -238
  172. package/server/service/task-type/index.ts +0 -4
  173. package/server/service/task-type/task-type-query.ts +0 -95
  174. 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 => 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
- }