@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.
- package/CHANGELOG.md +8 -0
- package/assets/images/hatiolab-logo.png +0 -0
- package/client/actions/main.ts +1 -0
- package/client/bootstrap.ts +8 -0
- package/client/index.ts +1 -0
- package/client/pages/main.ts +25 -0
- package/client/pages/process/process-importer.ts +97 -0
- package/client/pages/process/process-list-page.ts +348 -0
- package/client/pages/process-instance/process-instance-importer.ts +97 -0
- package/client/pages/process-instance/process-instance-list-page.ts +348 -0
- package/client/pages/process-thread/process-thread-importer.ts +97 -0
- package/client/pages/process-thread/process-thread-list-page.ts +348 -0
- package/client/reducers/main.ts +17 -0
- package/client/route.ts +19 -0
- package/client/tsconfig.json +11 -0
- package/dist-client/actions/main.d.ts +1 -0
- package/dist-client/actions/main.js +2 -0
- package/dist-client/actions/main.js.map +1 -0
- package/dist-client/bootstrap.d.ts +1 -0
- package/dist-client/bootstrap.js +8 -0
- package/dist-client/bootstrap.js.map +1 -0
- package/dist-client/index.d.ts +1 -0
- package/dist-client/index.js +2 -0
- package/dist-client/index.js.map +1 -0
- package/dist-client/pages/main.d.ts +1 -0
- package/dist-client/pages/main.js +27 -0
- package/dist-client/pages/main.js.map +1 -0
- package/dist-client/pages/process/process-importer.d.ts +22 -0
- package/dist-client/pages/process/process-importer.js +100 -0
- package/dist-client/pages/process/process-importer.js.map +1 -0
- package/dist-client/pages/process/process-list-page.d.ts +62 -0
- package/dist-client/pages/process/process-list-page.js +326 -0
- package/dist-client/pages/process/process-list-page.js.map +1 -0
- package/dist-client/pages/process-instance/process-instance-importer.d.ts +22 -0
- package/dist-client/pages/process-instance/process-instance-importer.js +100 -0
- package/dist-client/pages/process-instance/process-instance-importer.js.map +1 -0
- package/dist-client/pages/process-instance/process-instance-list-page.d.ts +62 -0
- package/dist-client/pages/process-instance/process-instance-list-page.js +326 -0
- package/dist-client/pages/process-instance/process-instance-list-page.js.map +1 -0
- package/dist-client/pages/process-thread/process-thread-importer.d.ts +22 -0
- package/dist-client/pages/process-thread/process-thread-importer.js +100 -0
- package/dist-client/pages/process-thread/process-thread-importer.js.map +1 -0
- package/dist-client/pages/process-thread/process-thread-list-page.d.ts +62 -0
- package/dist-client/pages/process-thread/process-thread-list-page.js +326 -0
- package/dist-client/pages/process-thread/process-thread-list-page.js.map +1 -0
- package/dist-client/reducers/main.d.ts +6 -0
- package/dist-client/reducers/main.js +14 -0
- package/dist-client/reducers/main.js.map +1 -0
- package/dist-client/route.d.ts +1 -0
- package/dist-client/route.js +17 -0
- package/dist-client/route.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -0
- package/dist-server/controllers/common.js +70 -0
- package/dist-server/controllers/common.js.map +1 -0
- package/dist-server/controllers/index.js +1 -0
- package/dist-server/controllers/index.js.map +1 -0
- package/dist-server/controllers/process-instance/abort.js +54 -0
- package/dist-server/controllers/process-instance/abort.js.map +1 -0
- package/dist-server/controllers/process-instance/assign.js +41 -0
- package/dist-server/controllers/process-instance/assign.js.map +1 -0
- package/dist-server/controllers/process-instance/draft.js +74 -0
- package/dist-server/controllers/process-instance/draft.js.map +1 -0
- package/dist-server/controllers/process-instance/end.js +54 -0
- package/dist-server/controllers/process-instance/end.js.map +1 -0
- package/dist-server/controllers/process-instance/index.js +6 -0
- package/dist-server/controllers/process-instance/index.js.map +1 -0
- package/dist-server/controllers/process-instance/issue.js +105 -0
- package/dist-server/controllers/process-instance/issue.js.map +1 -0
- package/dist-server/controllers/process-instance/pick.js +33 -0
- package/dist-server/controllers/process-instance/pick.js.map +1 -0
- package/dist-server/controllers/process-thread/_abort.js +11 -0
- package/dist-server/controllers/process-thread/_abort.js.map +1 -0
- package/dist-server/controllers/process-thread/abort.js +36 -0
- package/dist-server/controllers/process-thread/abort.js.map +1 -0
- package/dist-server/controllers/process-thread/delegate.js +36 -0
- package/dist-server/controllers/process-thread/delegate.js.map +1 -0
- package/dist-server/controllers/process-thread/end.js +35 -0
- package/dist-server/controllers/process-thread/end.js.map +1 -0
- package/dist-server/controllers/process-thread/index.js +7 -0
- package/dist-server/controllers/process-thread/index.js.map +1 -0
- package/dist-server/controllers/process-thread/restart.js +36 -0
- package/dist-server/controllers/process-thread/restart.js.map +1 -0
- package/dist-server/controllers/process-thread/save.js +38 -0
- package/dist-server/controllers/process-thread/save.js.map +1 -0
- package/dist-server/controllers/process-thread/start.js +32 -0
- package/dist-server/controllers/process-thread/start.js.map +1 -0
- package/dist-server/controllers/process-thread/submit.js +37 -0
- package/dist-server/controllers/process-thread/submit.js.map +1 -0
- package/dist-server/index.js +7 -0
- package/dist-server/index.js.map +1 -0
- package/dist-server/middlewares/index.js +8 -0
- package/dist-server/middlewares/index.js.map +1 -0
- package/dist-server/migrations/index.js +12 -0
- package/dist-server/migrations/index.js.map +1 -0
- package/dist-server/routes.js +25 -0
- package/dist-server/routes.js.map +1 -0
- package/dist-server/service/index.js +33 -0
- package/dist-server/service/index.js.map +1 -0
- package/dist-server/service/process/event-subscriber.js +21 -0
- package/dist-server/service/process/event-subscriber.js.map +1 -0
- package/dist-server/service/process/index.js +12 -0
- package/dist-server/service/process/index.js.map +1 -0
- package/dist-server/service/process/process-history.js +113 -0
- package/dist-server/service/process/process-history.js.map +1 -0
- package/dist-server/service/process/process-model-type.js +138 -0
- package/dist-server/service/process/process-model-type.js.map +1 -0
- package/dist-server/service/process/process-mutation.js +179 -0
- package/dist-server/service/process/process-mutation.js.map +1 -0
- package/dist-server/service/process/process-query.js +160 -0
- package/dist-server/service/process/process-query.js.map +1 -0
- package/dist-server/service/process/process-search-key-item-type.js +28 -0
- package/dist-server/service/process/process-search-key-item-type.js.map +1 -0
- package/dist-server/service/process/process-type.js +91 -0
- package/dist-server/service/process/process-type.js.map +1 -0
- package/dist-server/service/process/process.js +112 -0
- package/dist-server/service/process/process.js.map +1 -0
- package/dist-server/service/process-instance/event-subscriber.js +43 -0
- package/dist-server/service/process-instance/event-subscriber.js.map +1 -0
- package/dist-server/service/process-instance/index.js +13 -0
- package/dist-server/service/process-instance/index.js.map +1 -0
- package/dist-server/service/process-instance/process-instance-history.js +173 -0
- package/dist-server/service/process-instance/process-instance-history.js.map +1 -0
- package/dist-server/service/process-instance/process-instance-mutation.js +44 -0
- package/dist-server/service/process-instance/process-instance-mutation.js.map +1 -0
- package/dist-server/service/process-instance/process-instance-query.js +176 -0
- package/dist-server/service/process-instance/process-instance-query.js.map +1 -0
- package/dist-server/service/process-instance/process-instance-subscription.js +54 -0
- package/dist-server/service/process-instance/process-instance-subscription.js.map +1 -0
- package/dist-server/service/process-instance/process-instance-type.js +103 -0
- package/dist-server/service/process-instance/process-instance-type.js.map +1 -0
- package/dist-server/service/process-instance/process-instance.js +177 -0
- package/dist-server/service/process-instance/process-instance.js.map +1 -0
- package/dist-server/service/process-stats/index.js +6 -0
- package/dist-server/service/process-stats/index.js.map +1 -0
- package/dist-server/service/process-stats/process-stats-query.js +61 -0
- package/dist-server/service/process-stats/process-stats-query.js.map +1 -0
- package/dist-server/service/process-stats/process-stats-type.js +43 -0
- package/dist-server/service/process-stats/process-stats-type.js.map +1 -0
- package/dist-server/service/process-summary/index.js +8 -0
- package/dist-server/service/process-summary/index.js.map +1 -0
- package/dist-server/service/process-summary/process-summary-query.js +109 -0
- package/dist-server/service/process-summary/process-summary-query.js.map +1 -0
- package/dist-server/service/process-summary/process-summary.js +28 -0
- package/dist-server/service/process-summary/process-summary.js.map +1 -0
- package/dist-server/service/process-thread/event-subscriber.js +31 -0
- package/dist-server/service/process-thread/event-subscriber.js.map +1 -0
- package/dist-server/service/process-thread/index.js +12 -0
- package/dist-server/service/process-thread/index.js.map +1 -0
- package/dist-server/service/process-thread/process-thread-history.js +194 -0
- package/dist-server/service/process-thread/process-thread-history.js.map +1 -0
- package/dist-server/service/process-thread/process-thread-mutation.js +45 -0
- package/dist-server/service/process-thread/process-thread-mutation.js.map +1 -0
- package/dist-server/service/process-thread/process-thread-query.js +92 -0
- package/dist-server/service/process-thread/process-thread-query.js.map +1 -0
- package/dist-server/service/process-thread/process-thread-subscription.js +45 -0
- package/dist-server/service/process-thread/process-thread-subscription.js.map +1 -0
- package/dist-server/service/process-thread/process-thread-type.js +21 -0
- package/dist-server/service/process-thread/process-thread-type.js.map +1 -0
- package/dist-server/service/process-thread/process-thread.js +101 -0
- package/dist-server/service/process-thread/process-thread.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -0
- package/helps/process/process-instance.md +160 -0
- package/helps/process/process-thread.md +160 -0
- package/helps/process/process.md +160 -0
- package/package.json +44 -0
- package/server/controllers/common.ts +90 -0
- package/server/controllers/index.ts +0 -0
- package/server/controllers/process-instance/abort.ts +75 -0
- package/server/controllers/process-instance/end.ts +74 -0
- package/server/controllers/process-instance/index.ts +2 -0
- package/server/controllers/process-thread/_abort.ts +20 -0
- package/server/controllers/process-thread/abort.ts +48 -0
- package/server/controllers/process-thread/end.ts +54 -0
- package/server/controllers/process-thread/index.ts +3 -0
- package/server/controllers/process-thread/start.ts +49 -0
- package/server/index.ts +4 -0
- package/server/middlewares/index.ts +3 -0
- package/server/migrations/index.ts +9 -0
- package/server/routes.ts +28 -0
- package/server/service/index.ts +32 -0
- package/server/service/process/event-subscriber.ts +17 -0
- package/server/service/process/index.ts +9 -0
- package/server/service/process/process-history.ts +102 -0
- package/server/service/process/process-mutation.ts +210 -0
- package/server/service/process/process-query.ts +117 -0
- package/server/service/process/process-search-key-item-type.ts +16 -0
- package/server/service/process/process-type.ts +65 -0
- package/server/service/process/process.ts +97 -0
- package/server/service/process-instance/event-subscriber.ts +44 -0
- package/server/service/process-instance/index.ts +10 -0
- package/server/service/process-instance/process-instance-history.ts +148 -0
- package/server/service/process-instance/process-instance-mutation.ts +33 -0
- package/server/service/process-instance/process-instance-query.ts +138 -0
- package/server/service/process-instance/process-instance-subscription.ts +52 -0
- package/server/service/process-instance/process-instance-type.ts +71 -0
- package/server/service/process-instance/process-instance.ts +147 -0
- package/server/service/process-stats/index.ts +3 -0
- package/server/service/process-stats/process-stats-query.ts +57 -0
- package/server/service/process-stats/process-stats-type.ts +31 -0
- package/server/service/process-thread/event-subscriber.ts +31 -0
- package/server/service/process-thread/index.ts +9 -0
- package/server/service/process-thread/process-thread-mutation.ts +34 -0
- package/server/service/process-thread/process-thread-query.ts +58 -0
- package/server/service/process-thread/process-thread-subscription.ts +41 -0
- package/server/service/process-thread/process-thread-type.ts +15 -0
- package/server/service/process-thread/process-thread.ts +90 -0
- package/server/tsconfig.json +10 -0
- package/things-factory.config.js +13 -0
- package/translations/en.json +1 -0
- package/translations/ko.json +1 -0
- package/translations/ms.json +1 -0
- 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,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,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
|
+
}
|
package/server/index.ts
ADDED
|
@@ -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
|
+
})
|
package/server/routes.ts
ADDED
|
@@ -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
|
+
}
|