@things-factory/process 6.0.57

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 (212) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/assets/images/hatiolab-logo.png +0 -0
  3. package/client/actions/main.ts +1 -0
  4. package/client/bootstrap.ts +8 -0
  5. package/client/index.ts +1 -0
  6. package/client/pages/main.ts +25 -0
  7. package/client/pages/process/process-importer.ts +97 -0
  8. package/client/pages/process/process-list-page.ts +348 -0
  9. package/client/pages/process-instance/process-instance-importer.ts +97 -0
  10. package/client/pages/process-instance/process-instance-list-page.ts +348 -0
  11. package/client/pages/process-thread/process-thread-importer.ts +97 -0
  12. package/client/pages/process-thread/process-thread-list-page.ts +348 -0
  13. package/client/reducers/main.ts +17 -0
  14. package/client/route.ts +19 -0
  15. package/client/tsconfig.json +11 -0
  16. package/dist-client/actions/main.d.ts +1 -0
  17. package/dist-client/actions/main.js +2 -0
  18. package/dist-client/actions/main.js.map +1 -0
  19. package/dist-client/bootstrap.d.ts +1 -0
  20. package/dist-client/bootstrap.js +8 -0
  21. package/dist-client/bootstrap.js.map +1 -0
  22. package/dist-client/index.d.ts +1 -0
  23. package/dist-client/index.js +2 -0
  24. package/dist-client/index.js.map +1 -0
  25. package/dist-client/pages/main.d.ts +1 -0
  26. package/dist-client/pages/main.js +27 -0
  27. package/dist-client/pages/main.js.map +1 -0
  28. package/dist-client/pages/process/process-importer.d.ts +22 -0
  29. package/dist-client/pages/process/process-importer.js +100 -0
  30. package/dist-client/pages/process/process-importer.js.map +1 -0
  31. package/dist-client/pages/process/process-list-page.d.ts +62 -0
  32. package/dist-client/pages/process/process-list-page.js +326 -0
  33. package/dist-client/pages/process/process-list-page.js.map +1 -0
  34. package/dist-client/pages/process-instance/process-instance-importer.d.ts +22 -0
  35. package/dist-client/pages/process-instance/process-instance-importer.js +100 -0
  36. package/dist-client/pages/process-instance/process-instance-importer.js.map +1 -0
  37. package/dist-client/pages/process-instance/process-instance-list-page.d.ts +62 -0
  38. package/dist-client/pages/process-instance/process-instance-list-page.js +326 -0
  39. package/dist-client/pages/process-instance/process-instance-list-page.js.map +1 -0
  40. package/dist-client/pages/process-thread/process-thread-importer.d.ts +22 -0
  41. package/dist-client/pages/process-thread/process-thread-importer.js +100 -0
  42. package/dist-client/pages/process-thread/process-thread-importer.js.map +1 -0
  43. package/dist-client/pages/process-thread/process-thread-list-page.d.ts +62 -0
  44. package/dist-client/pages/process-thread/process-thread-list-page.js +326 -0
  45. package/dist-client/pages/process-thread/process-thread-list-page.js.map +1 -0
  46. package/dist-client/reducers/main.d.ts +6 -0
  47. package/dist-client/reducers/main.js +14 -0
  48. package/dist-client/reducers/main.js.map +1 -0
  49. package/dist-client/route.d.ts +1 -0
  50. package/dist-client/route.js +17 -0
  51. package/dist-client/route.js.map +1 -0
  52. package/dist-client/tsconfig.tsbuildinfo +1 -0
  53. package/dist-server/controllers/common.js +70 -0
  54. package/dist-server/controllers/common.js.map +1 -0
  55. package/dist-server/controllers/index.js +1 -0
  56. package/dist-server/controllers/index.js.map +1 -0
  57. package/dist-server/controllers/process-instance/abort.js +54 -0
  58. package/dist-server/controllers/process-instance/abort.js.map +1 -0
  59. package/dist-server/controllers/process-instance/assign.js +41 -0
  60. package/dist-server/controllers/process-instance/assign.js.map +1 -0
  61. package/dist-server/controllers/process-instance/draft.js +74 -0
  62. package/dist-server/controllers/process-instance/draft.js.map +1 -0
  63. package/dist-server/controllers/process-instance/end.js +54 -0
  64. package/dist-server/controllers/process-instance/end.js.map +1 -0
  65. package/dist-server/controllers/process-instance/index.js +6 -0
  66. package/dist-server/controllers/process-instance/index.js.map +1 -0
  67. package/dist-server/controllers/process-instance/issue.js +105 -0
  68. package/dist-server/controllers/process-instance/issue.js.map +1 -0
  69. package/dist-server/controllers/process-instance/pick.js +33 -0
  70. package/dist-server/controllers/process-instance/pick.js.map +1 -0
  71. package/dist-server/controllers/process-thread/_abort.js +11 -0
  72. package/dist-server/controllers/process-thread/_abort.js.map +1 -0
  73. package/dist-server/controllers/process-thread/abort.js +36 -0
  74. package/dist-server/controllers/process-thread/abort.js.map +1 -0
  75. package/dist-server/controllers/process-thread/delegate.js +36 -0
  76. package/dist-server/controllers/process-thread/delegate.js.map +1 -0
  77. package/dist-server/controllers/process-thread/end.js +35 -0
  78. package/dist-server/controllers/process-thread/end.js.map +1 -0
  79. package/dist-server/controllers/process-thread/index.js +7 -0
  80. package/dist-server/controllers/process-thread/index.js.map +1 -0
  81. package/dist-server/controllers/process-thread/restart.js +36 -0
  82. package/dist-server/controllers/process-thread/restart.js.map +1 -0
  83. package/dist-server/controllers/process-thread/save.js +38 -0
  84. package/dist-server/controllers/process-thread/save.js.map +1 -0
  85. package/dist-server/controllers/process-thread/start.js +32 -0
  86. package/dist-server/controllers/process-thread/start.js.map +1 -0
  87. package/dist-server/controllers/process-thread/submit.js +37 -0
  88. package/dist-server/controllers/process-thread/submit.js.map +1 -0
  89. package/dist-server/index.js +7 -0
  90. package/dist-server/index.js.map +1 -0
  91. package/dist-server/middlewares/index.js +8 -0
  92. package/dist-server/middlewares/index.js.map +1 -0
  93. package/dist-server/migrations/index.js +12 -0
  94. package/dist-server/migrations/index.js.map +1 -0
  95. package/dist-server/routes.js +25 -0
  96. package/dist-server/routes.js.map +1 -0
  97. package/dist-server/service/index.js +33 -0
  98. package/dist-server/service/index.js.map +1 -0
  99. package/dist-server/service/process/event-subscriber.js +21 -0
  100. package/dist-server/service/process/event-subscriber.js.map +1 -0
  101. package/dist-server/service/process/index.js +12 -0
  102. package/dist-server/service/process/index.js.map +1 -0
  103. package/dist-server/service/process/process-history.js +113 -0
  104. package/dist-server/service/process/process-history.js.map +1 -0
  105. package/dist-server/service/process/process-model-type.js +138 -0
  106. package/dist-server/service/process/process-model-type.js.map +1 -0
  107. package/dist-server/service/process/process-mutation.js +179 -0
  108. package/dist-server/service/process/process-mutation.js.map +1 -0
  109. package/dist-server/service/process/process-query.js +160 -0
  110. package/dist-server/service/process/process-query.js.map +1 -0
  111. package/dist-server/service/process/process-search-key-item-type.js +28 -0
  112. package/dist-server/service/process/process-search-key-item-type.js.map +1 -0
  113. package/dist-server/service/process/process-type.js +91 -0
  114. package/dist-server/service/process/process-type.js.map +1 -0
  115. package/dist-server/service/process/process.js +112 -0
  116. package/dist-server/service/process/process.js.map +1 -0
  117. package/dist-server/service/process-instance/event-subscriber.js +43 -0
  118. package/dist-server/service/process-instance/event-subscriber.js.map +1 -0
  119. package/dist-server/service/process-instance/index.js +13 -0
  120. package/dist-server/service/process-instance/index.js.map +1 -0
  121. package/dist-server/service/process-instance/process-instance-history.js +173 -0
  122. package/dist-server/service/process-instance/process-instance-history.js.map +1 -0
  123. package/dist-server/service/process-instance/process-instance-mutation.js +44 -0
  124. package/dist-server/service/process-instance/process-instance-mutation.js.map +1 -0
  125. package/dist-server/service/process-instance/process-instance-query.js +176 -0
  126. package/dist-server/service/process-instance/process-instance-query.js.map +1 -0
  127. package/dist-server/service/process-instance/process-instance-subscription.js +54 -0
  128. package/dist-server/service/process-instance/process-instance-subscription.js.map +1 -0
  129. package/dist-server/service/process-instance/process-instance-type.js +103 -0
  130. package/dist-server/service/process-instance/process-instance-type.js.map +1 -0
  131. package/dist-server/service/process-instance/process-instance.js +177 -0
  132. package/dist-server/service/process-instance/process-instance.js.map +1 -0
  133. package/dist-server/service/process-stats/index.js +6 -0
  134. package/dist-server/service/process-stats/index.js.map +1 -0
  135. package/dist-server/service/process-stats/process-stats-query.js +61 -0
  136. package/dist-server/service/process-stats/process-stats-query.js.map +1 -0
  137. package/dist-server/service/process-stats/process-stats-type.js +43 -0
  138. package/dist-server/service/process-stats/process-stats-type.js.map +1 -0
  139. package/dist-server/service/process-summary/index.js +8 -0
  140. package/dist-server/service/process-summary/index.js.map +1 -0
  141. package/dist-server/service/process-summary/process-summary-query.js +109 -0
  142. package/dist-server/service/process-summary/process-summary-query.js.map +1 -0
  143. package/dist-server/service/process-summary/process-summary.js +28 -0
  144. package/dist-server/service/process-summary/process-summary.js.map +1 -0
  145. package/dist-server/service/process-thread/event-subscriber.js +31 -0
  146. package/dist-server/service/process-thread/event-subscriber.js.map +1 -0
  147. package/dist-server/service/process-thread/index.js +12 -0
  148. package/dist-server/service/process-thread/index.js.map +1 -0
  149. package/dist-server/service/process-thread/process-thread-history.js +194 -0
  150. package/dist-server/service/process-thread/process-thread-history.js.map +1 -0
  151. package/dist-server/service/process-thread/process-thread-mutation.js +45 -0
  152. package/dist-server/service/process-thread/process-thread-mutation.js.map +1 -0
  153. package/dist-server/service/process-thread/process-thread-query.js +92 -0
  154. package/dist-server/service/process-thread/process-thread-query.js.map +1 -0
  155. package/dist-server/service/process-thread/process-thread-subscription.js +45 -0
  156. package/dist-server/service/process-thread/process-thread-subscription.js.map +1 -0
  157. package/dist-server/service/process-thread/process-thread-type.js +21 -0
  158. package/dist-server/service/process-thread/process-thread-type.js.map +1 -0
  159. package/dist-server/service/process-thread/process-thread.js +101 -0
  160. package/dist-server/service/process-thread/process-thread.js.map +1 -0
  161. package/dist-server/tsconfig.tsbuildinfo +1 -0
  162. package/helps/process/process-instance.md +160 -0
  163. package/helps/process/process-thread.md +160 -0
  164. package/helps/process/process.md +160 -0
  165. package/package.json +44 -0
  166. package/server/controllers/common.ts +90 -0
  167. package/server/controllers/index.ts +0 -0
  168. package/server/controllers/process-instance/abort.ts +75 -0
  169. package/server/controllers/process-instance/end.ts +74 -0
  170. package/server/controllers/process-instance/index.ts +2 -0
  171. package/server/controllers/process-thread/_abort.ts +20 -0
  172. package/server/controllers/process-thread/abort.ts +48 -0
  173. package/server/controllers/process-thread/end.ts +54 -0
  174. package/server/controllers/process-thread/index.ts +3 -0
  175. package/server/controllers/process-thread/start.ts +49 -0
  176. package/server/index.ts +4 -0
  177. package/server/middlewares/index.ts +3 -0
  178. package/server/migrations/index.ts +9 -0
  179. package/server/routes.ts +28 -0
  180. package/server/service/index.ts +32 -0
  181. package/server/service/process/event-subscriber.ts +17 -0
  182. package/server/service/process/index.ts +9 -0
  183. package/server/service/process/process-history.ts +102 -0
  184. package/server/service/process/process-mutation.ts +210 -0
  185. package/server/service/process/process-query.ts +117 -0
  186. package/server/service/process/process-search-key-item-type.ts +16 -0
  187. package/server/service/process/process-type.ts +65 -0
  188. package/server/service/process/process.ts +97 -0
  189. package/server/service/process-instance/event-subscriber.ts +44 -0
  190. package/server/service/process-instance/index.ts +10 -0
  191. package/server/service/process-instance/process-instance-history.ts +148 -0
  192. package/server/service/process-instance/process-instance-mutation.ts +33 -0
  193. package/server/service/process-instance/process-instance-query.ts +138 -0
  194. package/server/service/process-instance/process-instance-subscription.ts +52 -0
  195. package/server/service/process-instance/process-instance-type.ts +71 -0
  196. package/server/service/process-instance/process-instance.ts +147 -0
  197. package/server/service/process-stats/index.ts +3 -0
  198. package/server/service/process-stats/process-stats-query.ts +57 -0
  199. package/server/service/process-stats/process-stats-type.ts +31 -0
  200. package/server/service/process-thread/event-subscriber.ts +31 -0
  201. package/server/service/process-thread/index.ts +9 -0
  202. package/server/service/process-thread/process-thread-mutation.ts +34 -0
  203. package/server/service/process-thread/process-thread-query.ts +58 -0
  204. package/server/service/process-thread/process-thread-subscription.ts +41 -0
  205. package/server/service/process-thread/process-thread-type.ts +15 -0
  206. package/server/service/process-thread/process-thread.ts +90 -0
  207. package/server/tsconfig.json +10 -0
  208. package/things-factory.config.js +13 -0
  209. package/translations/en.json +1 -0
  210. package/translations/ko.json +1 -0
  211. package/translations/ms.json +1 -0
  212. package/translations/zh.json +1 -0
@@ -0,0 +1,74 @@
1
+ import { ProcessInstance, ProcessInstanceStatus } from '../../service/process-instance/process-instance'
2
+ import { ProcessThreadStatus } from '../../service/process-thread/process-thread'
3
+ import { evalProcessInstanceState } from '../common'
4
+
5
+ export async function end(
6
+ { id, output, reason }: { id: string; output?: object; reason?: string },
7
+ context: ResolverContext
8
+ ): Promise<ProcessInstance> {
9
+ const { domain, user, tx } = context.state
10
+ const repository = tx.getRepository(ProcessInstance)
11
+
12
+ var processInstance = await repository.findOne({
13
+ where: { domain: { id: domain.id }, id },
14
+ relations: [
15
+ 'domain',
16
+ 'process',
17
+ 'processThreads',
18
+ 'assigneeRole',
19
+ 'supervisoryRole',
20
+ 'updater',
21
+ 'creator',
22
+ 'starter',
23
+ 'terminator'
24
+ ]
25
+ })
26
+
27
+ if (!processInstance) {
28
+ throw new Error(
29
+ context.t('error.process-instance not found', {
30
+ processInstance: id
31
+ })
32
+ )
33
+ }
34
+
35
+ /*
36
+ Prerequisites for a Task to Be End.
37
+ - The previous state of the task must not be End or Aborted.
38
+ - There should be no unfinished process threads.
39
+ */
40
+ if (processInstance.state == ProcessInstanceStatus.Aborted || processInstance.state == ProcessInstanceStatus.Ended) {
41
+ throw new Error(
42
+ context.t(`error.process-instance is already terminated`, {
43
+ id,
44
+ state: processInstance.state
45
+ })
46
+ )
47
+ }
48
+
49
+ const TERMINATED = [ProcessThreadStatus.Aborted, ProcessThreadStatus.Delegated, ProcessThreadStatus.Ended]
50
+
51
+ for (let processThread of processInstance.processThreads) {
52
+ if (TERMINATED.includes(processThread.state)) {
53
+ continue
54
+ }
55
+
56
+ throw new Error(
57
+ context.t(`error.all process threads should be terminated`, {
58
+ processThread: processThread.id,
59
+ state: processInstance.state
60
+ })
61
+ )
62
+ }
63
+
64
+ return await repository.save({
65
+ ...processInstance,
66
+ reason,
67
+ output,
68
+ transaction: 'end',
69
+ state: await evalProcessInstanceState(id, context),
70
+ updater: user,
71
+ terminatedAt: new Date(),
72
+ terminator: user
73
+ } as any)
74
+ }
@@ -0,0 +1,2 @@
1
+ export * from './abort'
2
+ export * from './end'
@@ -0,0 +1,20 @@
1
+ import { ProcessThread, ProcessThreadStatus } from '../../service/process-thread/process-thread'
2
+
3
+ export async function _abort(
4
+ { processThread, reason }: { processThread: ProcessThread; reason: string },
5
+ context: ResolverContext
6
+ ): Promise<ProcessThread> {
7
+ const { domain, user, tx } = context.state
8
+
9
+ var repository = tx.getRepository(ProcessThread)
10
+
11
+ return await repository.save({
12
+ ...processThread,
13
+ reason,
14
+ state: ProcessThreadStatus.Aborted,
15
+ transaction: 'abort',
16
+ updater: user,
17
+ terminatedAt: new Date(),
18
+ terminator: user
19
+ })
20
+ }
@@ -0,0 +1,48 @@
1
+ import { ProcessThread, ProcessThreadStatus } from '../../service/process-thread/process-thread'
2
+ import { updateProcessInstanceState } from '../common'
3
+ import { _abort } from './_abort'
4
+
5
+ export async function abort(
6
+ { id, reason }: { id: string; reason: string },
7
+ context: ResolverContext
8
+ ): Promise<ProcessThread> {
9
+ const { domain, user, tx } = context.state
10
+
11
+ var repository = tx.getRepository(ProcessThread)
12
+
13
+ var processThread = await repository.findOne({
14
+ where: { domain: { id: domain.id }, id },
15
+ relations: ['domain', 'processInstance', 'assignee', 'creator', 'updater']
16
+ })
17
+
18
+ if (!processThread) {
19
+ throw new Error(
20
+ context.t('error.process-thread not found', {
21
+ processThread: id
22
+ })
23
+ )
24
+ }
25
+
26
+ /*
27
+ Prerequisites for a process thread to Be Aborted.
28
+ - The previous state of the process thread must not be End or Aborted.
29
+ */
30
+ if (
31
+ processThread.state == ProcessThreadStatus.Aborted ||
32
+ processThread.state == ProcessThreadStatus.Ended ||
33
+ processThread.state == ProcessThreadStatus.Delegated
34
+ ) {
35
+ throw new Error(
36
+ context.t(`error.process-thread is already terminated`, {
37
+ id,
38
+ state: processThread.state
39
+ })
40
+ )
41
+ }
42
+
43
+ const result = await _abort({ processThread, reason }, context)
44
+
45
+ await updateProcessInstanceState(processThread.processInstanceId, context)
46
+
47
+ return result
48
+ }
@@ -0,0 +1,54 @@
1
+ import { ProcessThread, ProcessThreadStatus } from '../../service/process-thread/process-thread'
2
+ import { updateProcessInstanceState } from '../common'
3
+
4
+ export async function end(
5
+ { id, output, reason }: { id: string; output?: object; reason?: string },
6
+ context: ResolverContext
7
+ ): Promise<ProcessThread> {
8
+ const { domain, user, tx } = context.state
9
+
10
+ const repository = tx.getRepository(ProcessThread)
11
+
12
+ var processThread = await repository.findOne({
13
+ where: { domain: { id: domain.id }, id }
14
+ })
15
+
16
+ if (!processThread) {
17
+ throw new Error(
18
+ context.t('error.process-thread not found', {
19
+ processThread: id
20
+ })
21
+ )
22
+ }
23
+
24
+ /*
25
+ Prerequisites for a process thread to Be End.
26
+ - The previous state of the process thread must not be End or End.
27
+ */
28
+ if (
29
+ processThread.state == ProcessThreadStatus.Aborted ||
30
+ processThread.state == ProcessThreadStatus.Ended ||
31
+ processThread.state == ProcessThreadStatus.Delegated
32
+ ) {
33
+ throw new Error(
34
+ context.t(`error.process-thread is already terminated`, {
35
+ id,
36
+ actual: processThread.state
37
+ })
38
+ )
39
+ }
40
+
41
+ processThread = await repository.save({
42
+ ...processThread,
43
+ reason,
44
+ output,
45
+ transaction: 'end',
46
+ state: ProcessThreadStatus.Ended,
47
+ updater: user,
48
+ terminatedAt: new Date()
49
+ })
50
+
51
+ await updateProcessInstanceState(processThread.processInstanceId, context)
52
+
53
+ return processThread
54
+ }
@@ -0,0 +1,3 @@
1
+ export * from './abort'
2
+ export * from './end'
3
+ export * from './start'
@@ -0,0 +1,49 @@
1
+ import { ProcessThread, ProcessThreadStatus } from '../../service/process-thread/process-thread'
2
+ import { updateProcessInstanceState } from '../common'
3
+
4
+ export async function start(
5
+ id: string,
6
+ output: object,
7
+ reason: string,
8
+ context: ResolverContext
9
+ ): Promise<ProcessThread> {
10
+ const { domain, user, tx } = context.state
11
+
12
+ const repository = tx.getRepository(ProcessThread)
13
+ const processThread = await repository.findOne({
14
+ where: { domain: { id: domain.id }, id }
15
+ })
16
+
17
+ if (!processThread) {
18
+ throw new Error(
19
+ context.t('error.process-thread not found', {
20
+ processThread: id
21
+ })
22
+ )
23
+ }
24
+
25
+ /*
26
+ Prerequisites for a process thread to Be Started.
27
+ - The previous state of the process thread must not be terminated.
28
+ */
29
+ if (processThread.state !== ProcessThreadStatus.Assigned) {
30
+ throw new Error(
31
+ context.t(`error.process-thread should not be started`, {
32
+ id,
33
+ actual: processThread.state
34
+ })
35
+ )
36
+ }
37
+
38
+ const result = await tx.getRepository(ProcessThread).save({
39
+ ...processThread,
40
+ reason,
41
+ state: ProcessThreadStatus.Started,
42
+ transaction: 'start',
43
+ updater: user
44
+ })
45
+
46
+ await updateProcessInstanceState(processThread.processInstanceId, context)
47
+
48
+ return result
49
+ }
@@ -0,0 +1,4 @@
1
+ export * from './migrations'
2
+ export * from './middlewares'
3
+
4
+ import './routes'
@@ -0,0 +1,3 @@
1
+ export function initMiddlewares(app) {
2
+ /* can add middlewares into app */
3
+ }
@@ -0,0 +1,9 @@
1
+ const glob = require('glob')
2
+ const path = require('path')
3
+
4
+ export var migrations = []
5
+
6
+ glob.sync(path.resolve(__dirname, '.', '**', '*.js')).forEach(function(file) {
7
+ if (file.indexOf('index.js') !== -1) return
8
+ migrations = migrations.concat(Object.values(require(path.resolve(file))) || [])
9
+ })
@@ -0,0 +1,28 @@
1
+ const debug = require('debug')('things-factory:process:routes')
2
+
3
+ process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRouter) => {
4
+ /*
5
+ * can add global public routes to application (auth not required, tenancy not required)
6
+ *
7
+ * ex) routes.get('/path', async(context, next) => {})
8
+ * ex) routes.post('/path', async(context, next) => {})
9
+ */
10
+ })
11
+
12
+ process.on('bootstrap-module-global-private-route' as any, (app, globalPrivateRouter) => {
13
+ /*
14
+ * can add global private routes to application (auth required, tenancy not required)
15
+ */
16
+ })
17
+
18
+ process.on('bootstrap-module-domain-public-route' as any, (app, domainPublicRouter) => {
19
+ /*
20
+ * can add domain public routes to application (auth not required, tenancy required)
21
+ */
22
+ })
23
+
24
+ process.on('bootstrap-module-domain-private-route' as any, (app, domainPrivateRouter) => {
25
+ /*
26
+ * can add domain private routes to application (auth required, tenancy required)
27
+ */
28
+ })
@@ -0,0 +1,32 @@
1
+ /* EXPORT ENTITY TYPES */
2
+ export * from './process-thread/process-thread'
3
+ export * from './process-instance/process-instance'
4
+ export * from './process/process'
5
+
6
+ /* IMPORT ENTITIES AND RESOLVERS */
7
+ import { entities as ProcessThreadEntities, resolvers as ProcessThreadResolvers, subscribers as ProcessThreadSubscribers } from './process-thread'
8
+ import { entities as ProcessInstanceEntities, resolvers as ProcessInstanceResolvers, subscribers as ProcessInstanceSubscribers } from './process-instance'
9
+ import { entities as ProcessEntities, resolvers as ProcessResolvers, subscribers as ProcessSubscribers } from './process'
10
+
11
+ export const entities = [
12
+ /* ENTITIES */
13
+ ...ProcessThreadEntities,
14
+ ...ProcessInstanceEntities,
15
+ ...ProcessEntities,
16
+ ]
17
+
18
+ export const subscribers = [
19
+ /* SUBSCRIBERS */
20
+ ...ProcessThreadSubscribers,
21
+ ...ProcessInstanceSubscribers,
22
+ ...ProcessSubscribers,
23
+ ]
24
+
25
+ export const schema = {
26
+ resolverClasses: [
27
+ /* RESOLVER CLASSES */
28
+ ...ProcessThreadResolvers,
29
+ ...ProcessInstanceResolvers,
30
+ ...ProcessResolvers,
31
+ ]
32
+ }
@@ -0,0 +1,17 @@
1
+ import { EventSubscriber } from 'typeorm'
2
+
3
+ import { HistoryEntitySubscriber } from '@operato/typeorm-history'
4
+
5
+ import { Process } from './process'
6
+ import { ProcessHistory } from './process-history'
7
+
8
+ @EventSubscriber()
9
+ export class ProcessHistoryEntitySubscriber extends HistoryEntitySubscriber<Process, ProcessHistory> {
10
+ public get entity() {
11
+ return Process
12
+ }
13
+
14
+ public get historyEntity() {
15
+ return ProcessHistory
16
+ }
17
+ }
@@ -0,0 +1,9 @@
1
+ import { Process } from './process'
2
+ import { ProcessHistory } from './process-history'
3
+ import { ProcessMutation } from './process-mutation'
4
+ import { ProcessQuery } from './process-query'
5
+ import { ProcessHistoryEntitySubscriber } from './event-subscriber'
6
+
7
+ export const entities = [Process, ProcessHistory]
8
+ export const resolvers = [ProcessQuery, ProcessMutation]
9
+ export const subscribers = [ProcessHistoryEntitySubscriber]
@@ -0,0 +1,102 @@
1
+ import { Field, ID, ObjectType } from 'type-graphql'
2
+ import { Column, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId } from 'typeorm'
3
+
4
+ import {
5
+ HistoryActionColumn,
6
+ HistoryActionType,
7
+ HistoryEntityInterface,
8
+ HistoryOriginalIdColumn
9
+ } from '@operato/typeorm-history'
10
+ import { Role, User } from '@things-factory/auth-base'
11
+ import { config } from '@things-factory/env'
12
+ import { Domain } from '@things-factory/shell'
13
+
14
+ import { Process, ProcessStatus } from './process'
15
+
16
+ const ORMCONFIG = config.get('ormconfig', {})
17
+ const DATABASE_TYPE = ORMCONFIG.type
18
+
19
+ @Entity()
20
+ @Index(
21
+ 'ix_process_history_0',
22
+ (processHistory: ProcessHistory) => [processHistory.originalId, processHistory.version],
23
+ { unique: true }
24
+ )
25
+ @Index(
26
+ 'ix_process_history_1',
27
+ (processHistory: ProcessHistory) => [processHistory.domain, processHistory.originalId, processHistory.version],
28
+ { unique: true }
29
+ )
30
+ @ObjectType({ description: 'History Entity of Process' })
31
+ export class ProcessHistory implements HistoryEntityInterface<Process> {
32
+ @PrimaryGeneratedColumn('uuid')
33
+ @Field(type => ID)
34
+ readonly id: string
35
+
36
+ @Column({ nullable: true, default: 1 })
37
+ @Field({ nullable: true })
38
+ version?: number = 1
39
+
40
+ @ManyToOne(type => Domain)
41
+ @Field({ nullable: true })
42
+ domain?: Domain
43
+
44
+ @RelationId((process: Process) => process.domain)
45
+ domainId?: string
46
+
47
+ @Column()
48
+ @Field({ nullable: true })
49
+ name?: string
50
+
51
+ @Column({ nullable: true })
52
+ @Field({ nullable: true })
53
+ description?: string
54
+
55
+ @Column({ nullable: true })
56
+ @Field({ nullable: true })
57
+ state?: ProcessStatus
58
+
59
+ @ManyToOne(type => Role, { nullable: true })
60
+ @Field(type => Role, { nullable: true })
61
+ supervisoryRole?: Role
62
+
63
+ @RelationId((process: Process) => process.supervisoryRole)
64
+ supervisoryRoleId?: string
65
+
66
+ @Column()
67
+ @Field({ nullable: true })
68
+ createdAt?: Date
69
+
70
+ @Column()
71
+ @Field({ nullable: true })
72
+ updatedAt?: Date
73
+
74
+ @ManyToOne(type => User, { nullable: true })
75
+ @Field({ nullable: true })
76
+ creator?: User
77
+
78
+ @RelationId((process: Process) => process.creator)
79
+ creatorId?: string
80
+
81
+ @ManyToOne(type => User, { nullable: true })
82
+ @Field({ nullable: true })
83
+ updater?: User
84
+
85
+ @RelationId((process: Process) => process.updater)
86
+ updaterId?: string
87
+
88
+ @HistoryOriginalIdColumn()
89
+ public originalId!: string
90
+
91
+ @HistoryActionColumn({
92
+ nullable: false,
93
+ type:
94
+ DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
95
+ ? 'enum'
96
+ : DATABASE_TYPE == 'oracle'
97
+ ? 'varchar2'
98
+ : 'smallint',
99
+ enum: HistoryActionType
100
+ })
101
+ public action!: HistoryActionType
102
+ }
@@ -0,0 +1,210 @@
1
+ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
+ import { In } from 'typeorm'
3
+
4
+ import { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'
5
+ import { Application, CallbackBase, registerSchedule, unregisterSchedule } from '@things-factory/scheduler-client'
6
+
7
+ import { Process } from './process'
8
+ import { ProcessPatch, NewProcess } from './process-type'
9
+
10
+ @Resolver(Process)
11
+ export class ProcessMutation {
12
+ @Directive('@transaction')
13
+ @Directive('@privilege(category: "process", privilege: "mutation", domainOwnerGranted: true)')
14
+ @Mutation(returns => Process, { description: 'To create new Process' })
15
+ async createProcess(@Arg('process') process: NewProcess, @Ctx() context: ResolverContext): Promise<Process> {
16
+ const { domain, user, tx } = context.state
17
+
18
+ const result = await tx.getRepository(Process).save({
19
+ ...process,
20
+ domain,
21
+ creator: user,
22
+ updater: user
23
+ })
24
+
25
+ if (process.thumbnail) {
26
+ await createAttachment(
27
+ null,
28
+ {
29
+ attachment: {
30
+ file: process.thumbnail,
31
+ refType: Process.name,
32
+ refBy: result.id
33
+ }
34
+ },
35
+ context
36
+ )
37
+ }
38
+
39
+ return result
40
+ }
41
+
42
+ @Directive('@transaction')
43
+ @Directive('@privilege(category: "process", privilege: "mutation", domainOwnerGranted: true)')
44
+ @Mutation(returns => Process, { description: 'To modify Process information' })
45
+ async updateProcess(
46
+ @Arg('id') id: string,
47
+ @Arg('patch') patch: ProcessPatch,
48
+ @Ctx() context: ResolverContext
49
+ ): Promise<Process> {
50
+ const { domain, user, tx } = context.state
51
+
52
+ const repository = tx.getRepository(Process)
53
+ const process = await repository.findOne({
54
+ where: { domain: { id: domain.id }, id },
55
+ /* history에 항상 반영될 수 있도록 relations가 있어야 함. */
56
+ relations: ['domain', 'issuerRole', 'supervisoryRole', 'creator', 'updater']
57
+ })
58
+
59
+ const result = await repository.save({
60
+ ...process,
61
+ ...patch,
62
+ updater: user
63
+ })
64
+
65
+ if (patch.thumbnail) {
66
+ await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)
67
+ await createAttachment(
68
+ null,
69
+ {
70
+ attachment: {
71
+ file: patch.thumbnail,
72
+ refType: Process.name,
73
+ refBy: result.id
74
+ }
75
+ },
76
+ context
77
+ )
78
+ }
79
+
80
+ return result
81
+ }
82
+
83
+ @Directive('@transaction')
84
+ @Directive('@privilege(category: "process", privilege: "mutation", domainOwnerGranted: true)')
85
+ @Mutation(returns => [Process], { description: "To modify multiple Processes' information" })
86
+ async updateMultipleProcess(
87
+ @Arg('patches', type => [ProcessPatch]) patches: ProcessPatch[],
88
+ @Ctx() context: ResolverContext
89
+ ): Promise<Process[]> {
90
+ const { domain, user, tx } = context.state
91
+
92
+ let results = []
93
+ const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
94
+ const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
95
+ const processRepo = tx.getRepository(Process)
96
+
97
+ if (_createRecords.length > 0) {
98
+ for (let i = 0; i < _createRecords.length; i++) {
99
+ const newRecord = _createRecords[i]
100
+
101
+ const result = await processRepo.save({
102
+ ...newRecord,
103
+ domain,
104
+ creator: user,
105
+ updater: user
106
+ })
107
+
108
+ if (newRecord.thumbnail) {
109
+ await createAttachment(
110
+ null,
111
+ {
112
+ attachment: {
113
+ file: newRecord.thumbnail,
114
+ refType: Process.name,
115
+ refBy: result.id
116
+ }
117
+ },
118
+ context
119
+ )
120
+ }
121
+
122
+ results.push({ ...result, cuFlag: '+' })
123
+ }
124
+ }
125
+
126
+ if (_updateRecords.length > 0) {
127
+ for (let i = 0; i < _updateRecords.length; i++) {
128
+ const updateRecord = _updateRecords[i]
129
+ const process = await processRepo.findOne({
130
+ where: { id: updateRecord.id },
131
+ /* history에 항상 반영될 수 있도록 relations가 있어야 함. */
132
+ relations: ['domain', 'issuerRole', 'supervisoryRole', 'creator', 'updater']
133
+ })
134
+
135
+ const result = await processRepo.save({
136
+ ...process,
137
+ ...updateRecord,
138
+ updater: user
139
+ })
140
+
141
+ if (updateRecord.thumbnail) {
142
+ await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)
143
+ await createAttachment(
144
+ null,
145
+ {
146
+ attachment: {
147
+ file: updateRecord.thumbnail,
148
+ refType: Process.name,
149
+ refBy: result.id
150
+ }
151
+ },
152
+ context
153
+ )
154
+ }
155
+
156
+ results.push({ ...result, cuFlag: 'M' })
157
+ }
158
+ }
159
+
160
+ return results
161
+ }
162
+
163
+ @Directive('@transaction')
164
+ @Directive('@privilege(category: "process", privilege: "mutation", domainOwnerGranted: true)')
165
+ @Mutation(returns => Boolean, { description: 'To delete Process' })
166
+ async deleteProcess(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
167
+ const { domain, tx } = context.state
168
+
169
+ await tx.getRepository(Process).delete({ domain: { id: domain.id }, id })
170
+ await deleteAttachmentsByRef(null, { refBys: [id] }, context)
171
+
172
+ return true
173
+ }
174
+
175
+ @Directive('@transaction')
176
+ @Mutation(returns => Boolean, { description: 'To delete multiple Processes' })
177
+ async deleteProcesses(
178
+ @Arg('ids', type => [String]) ids: string[],
179
+ @Ctx() context: ResolverContext
180
+ ): Promise<boolean> {
181
+ const { domain, tx } = context.state
182
+
183
+ await tx.getRepository(Process).delete({
184
+ domain: { id: domain.id },
185
+ id: In(ids)
186
+ })
187
+
188
+ await deleteAttachmentsByRef(null, { refBys: ids }, context)
189
+
190
+ return true
191
+ }
192
+
193
+ @Directive('@transaction')
194
+ @Directive('@privilege(category: "process", privilege: "mutation", domainOwnerGranted: true)')
195
+ @Mutation(returns => Boolean, { description: 'To import multiple Processes' })
196
+ async importProcesses(
197
+ @Arg('processes', type => [ProcessPatch]) processes: ProcessPatch[],
198
+ @Ctx() context: ResolverContext
199
+ ): Promise<boolean> {
200
+ const { domain, tx } = context.state
201
+
202
+ await Promise.all(
203
+ processes.map(async (process: ProcessPatch) => {
204
+ const createdProcess: Process = await tx.getRepository(Process).save({ domain, ...process })
205
+ })
206
+ )
207
+
208
+ return true
209
+ }
210
+ }