@things-factory/dataset 6.0.138 → 6.0.139
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/dist-server/service/data-set/data-set-mutation.js +68 -7
- package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
- package/dist-server/service/data-set/data-set-query.js +43 -16
- package/dist-server/service/data-set/data-set-query.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/server/service/data-set/data-set-mutation.ts +80 -4
- package/server/service/data-set/data-set-query.ts +43 -21
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@things-factory/dataset",
|
3
|
-
"version": "6.0.
|
3
|
+
"version": "6.0.139",
|
4
4
|
"main": "dist-server/index.js",
|
5
5
|
"browser": "dist-client/index.js",
|
6
6
|
"things-factory": true,
|
@@ -40,15 +40,15 @@
|
|
40
40
|
"@things-factory/aws-base": "^6.0.133",
|
41
41
|
"@things-factory/board-service": "^6.0.133",
|
42
42
|
"@things-factory/env": "^6.0.124",
|
43
|
-
"@things-factory/organization": "^6.0.
|
43
|
+
"@things-factory/organization": "^6.0.139",
|
44
44
|
"@things-factory/scheduler-client": "^6.0.133",
|
45
45
|
"@things-factory/shell": "^6.0.133",
|
46
46
|
"@things-factory/work-shift": "^6.0.133",
|
47
|
-
"@things-factory/worklist": "^6.0.
|
47
|
+
"@things-factory/worklist": "^6.0.139",
|
48
48
|
"cron-parser": "^4.3.0",
|
49
49
|
"moment-timezone": "^0.5.40",
|
50
50
|
"simple-statistics": "^7.8.3",
|
51
51
|
"statistics": "^3.3.0"
|
52
52
|
},
|
53
|
-
"gitHead": "
|
53
|
+
"gitHead": "59efd5d9c1184b4ebd208a4f5dea47d23cf51cf7"
|
54
54
|
}
|
@@ -3,12 +3,80 @@ import { In } from 'typeorm'
|
|
3
3
|
|
4
4
|
import { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'
|
5
5
|
import { Application, CallbackBase, registerSchedule, unregisterSchedule } from '@things-factory/scheduler-client'
|
6
|
+
import { ApprovalLineItem, OrgMemberTargetType } from '@things-factory/organization'
|
7
|
+
import { AssigneeItem } from '@things-factory/worklist'
|
6
8
|
|
7
9
|
import { DataSet } from './data-set'
|
8
10
|
import { DataSetPatch, NewDataSet } from './data-set-type'
|
9
11
|
|
10
12
|
const crypto = require('crypto')
|
11
13
|
|
14
|
+
function getApprovalLineValue(patch: NewDataSet | DataSetPatch): ApprovalLineItem[] {
|
15
|
+
const { approvalLine } = patch
|
16
|
+
|
17
|
+
if (!('approvalLine' in patch)) {
|
18
|
+
/* approvalLine이 언급되지 않았다면, 업데이트하지 않는다. */
|
19
|
+
return
|
20
|
+
}
|
21
|
+
|
22
|
+
if (!approvalLine || !(approvalLine instanceof Array)) {
|
23
|
+
/* approvalLine의 값이 없거나 배열이 아니라면, 클리어시킨다. */
|
24
|
+
return null
|
25
|
+
}
|
26
|
+
|
27
|
+
return approvalLine
|
28
|
+
.map(m => {
|
29
|
+
return {
|
30
|
+
type: m.type,
|
31
|
+
approver: m.approver
|
32
|
+
} as ApprovalLineItem
|
33
|
+
})
|
34
|
+
.filter(m => m.type)
|
35
|
+
.filter(m => {
|
36
|
+
switch (m.type) {
|
37
|
+
case OrgMemberTargetType.Employee:
|
38
|
+
case OrgMemberTargetType.Department:
|
39
|
+
case OrgMemberTargetType.Role:
|
40
|
+
return !!m.approver?.id
|
41
|
+
default:
|
42
|
+
return true
|
43
|
+
}
|
44
|
+
})
|
45
|
+
}
|
46
|
+
|
47
|
+
function getAssigneesValue(patch: NewDataSet | DataSetPatch): AssigneeItem[] {
|
48
|
+
const { assignees } = patch
|
49
|
+
|
50
|
+
if (!('assignees' in patch)) {
|
51
|
+
/* assignees이 언급되지 않았다면, 업데이트하지 않는다. */
|
52
|
+
return
|
53
|
+
}
|
54
|
+
|
55
|
+
if (!assignees || !(assignees instanceof Array)) {
|
56
|
+
/* assignees의 값이 없거나 배열이 아니라면, 클리어시킨다. */
|
57
|
+
return null
|
58
|
+
}
|
59
|
+
|
60
|
+
return assignees
|
61
|
+
.map(m => {
|
62
|
+
return {
|
63
|
+
type: m.type,
|
64
|
+
assignee: m.assignee
|
65
|
+
} as ApprovalLineItem
|
66
|
+
})
|
67
|
+
.filter(m => m.type)
|
68
|
+
.filter(m => {
|
69
|
+
switch (m.type) {
|
70
|
+
case OrgMemberTargetType.Employee:
|
71
|
+
case OrgMemberTargetType.Department:
|
72
|
+
case OrgMemberTargetType.Role:
|
73
|
+
return !!m.assignee?.id
|
74
|
+
default:
|
75
|
+
return true
|
76
|
+
}
|
77
|
+
})
|
78
|
+
}
|
79
|
+
|
12
80
|
@Resolver(DataSet)
|
13
81
|
export class DataSetMutation {
|
14
82
|
@Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
|
@@ -20,6 +88,8 @@ export class DataSetMutation {
|
|
20
88
|
|
21
89
|
const result = await dataSetRepo.save({
|
22
90
|
...dataSet,
|
91
|
+
approvalLine: getApprovalLineValue(dataSet),
|
92
|
+
assignees: getAssigneesValue(dataSet),
|
23
93
|
version: 1,
|
24
94
|
domain,
|
25
95
|
creator: user,
|
@@ -51,6 +121,8 @@ export class DataSetMutation {
|
|
51
121
|
const result = await dataSetRepo.save({
|
52
122
|
...dataSet,
|
53
123
|
...patch,
|
124
|
+
approvalLine: getApprovalLineValue(patch),
|
125
|
+
assignees: getAssigneesValue(patch),
|
54
126
|
updater: user
|
55
127
|
})
|
56
128
|
|
@@ -80,6 +152,8 @@ export class DataSetMutation {
|
|
80
152
|
|
81
153
|
const result = await dataSetRepo.save({
|
82
154
|
...newRecord,
|
155
|
+
approvalLine: getApprovalLineValue(newRecord),
|
156
|
+
assignees: getAssigneesValue(newRecord),
|
83
157
|
domain,
|
84
158
|
creator: user,
|
85
159
|
updater: user
|
@@ -97,20 +171,22 @@ export class DataSetMutation {
|
|
97
171
|
if (_updateRecords.length > 0) {
|
98
172
|
const cuFlag = 'M'
|
99
173
|
for (let i = 0; i < _updateRecords.length; i++) {
|
100
|
-
const
|
174
|
+
const updateRecord = _updateRecords[i]
|
101
175
|
const dataSet = await dataSetRepo.findOne({
|
102
|
-
where: { id:
|
176
|
+
where: { id: updateRecord.id },
|
103
177
|
/* history에 항상 반영될 수 있도록 relations가 있어야 함. */
|
104
178
|
relations: ['domain', 'dataKeySet', 'entryRole', 'supervisoryRole', 'creator', 'updater']
|
105
179
|
})
|
106
180
|
|
107
181
|
const result = await dataSetRepo.save({
|
108
182
|
...dataSet,
|
109
|
-
...
|
183
|
+
...updateRecord,
|
184
|
+
approvalLine: getApprovalLineValue(updateRecord),
|
185
|
+
assignees: getAssigneesValue(updateRecord),
|
110
186
|
updater: user
|
111
187
|
})
|
112
188
|
|
113
|
-
await this._createAttachment(context,
|
189
|
+
await this._createAttachment(context, updateRecord.reportTemplate, { ref: result, cuFlag })
|
114
190
|
|
115
191
|
results.push({
|
116
192
|
...result,
|
@@ -6,6 +6,7 @@ import { Role, User } from '@things-factory/auth-base'
|
|
6
6
|
import { Board } from '@things-factory/board-service'
|
7
7
|
import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
|
8
8
|
import { ApprovalLineItem } from '@things-factory/organization'
|
9
|
+
import { AssigneeItem } from '@things-factory/worklist'
|
9
10
|
|
10
11
|
import { DataKeySet } from '../data-key-set/data-key-set'
|
11
12
|
import { DataSample } from '../data-sample/data-sample'
|
@@ -55,27 +56,6 @@ export class DataSetQuery {
|
|
55
56
|
return { items, total }
|
56
57
|
}
|
57
58
|
|
58
|
-
// @Directive('@privilege(category: "data-set", privilege: "query", domainOwnerGranted: true)')
|
59
|
-
// @Query(returns => DataSetStateList, { description: 'To fetch multiple status of DataSets' })
|
60
|
-
// async dataSetsStatus(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<DataSetStateList> {
|
61
|
-
// const { domain } = context.state
|
62
|
-
|
63
|
-
// // scheduler server에 group내 schedule list를 조회한다.
|
64
|
-
// const queryBuilder = getQueryBuilderFromListParams({
|
65
|
-
// repository: getRepository(DataSet),
|
66
|
-
// params,
|
67
|
-
// domain,
|
68
|
-
// alias: 'dataset',
|
69
|
-
// searchables: ['name', 'description', 'supervisoryRole']
|
70
|
-
// })
|
71
|
-
|
72
|
-
// const [items, total] = await queryBuilder.getManyAndCount()
|
73
|
-
|
74
|
-
// return { items: [{
|
75
|
-
|
76
|
-
// }], total }
|
77
|
-
// }
|
78
|
-
|
79
59
|
@Query(returns => DataSetList, { description: 'To fetch multiple DataSets for data entry manually' })
|
80
60
|
async dataSetsForEntry(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<DataSetList> {
|
81
61
|
var { domain, user } = context.state
|
@@ -177,6 +157,48 @@ export class DataSetQuery {
|
|
177
157
|
)
|
178
158
|
}
|
179
159
|
|
160
|
+
@FieldResolver(type => [AssigneeItem])
|
161
|
+
async assignees(@Root() dataSet: DataSet, @Ctx() context: ResolverContext): Promise<AssigneeItem[]> {
|
162
|
+
const { domain, user } = context.state
|
163
|
+
const { assignees } = dataSet
|
164
|
+
|
165
|
+
if (!assignees || !(assignees instanceof Array)) {
|
166
|
+
return null
|
167
|
+
}
|
168
|
+
|
169
|
+
var assigneeItemList = []
|
170
|
+
|
171
|
+
for (let item of assignees) {
|
172
|
+
// "value" deprecated. to be removed
|
173
|
+
var { type, assignee, value } = item
|
174
|
+
var id = assignee?.id || id
|
175
|
+
var assignee
|
176
|
+
|
177
|
+
switch (type) {
|
178
|
+
case 'Employee':
|
179
|
+
assignee = id && (await getRepository('Employee').findOneBy({ domain: { id: domain.id }, id }))
|
180
|
+
break
|
181
|
+
case 'Department':
|
182
|
+
assignee = id && (await getRepository('Department').findOneBy({ domain: { id: domain.id }, id }))
|
183
|
+
break
|
184
|
+
case 'Role':
|
185
|
+
assignee = id && (await getRepository('Role').findOneBy({ domain: { id: domain.id }, id }))
|
186
|
+
break
|
187
|
+
case 'Myself':
|
188
|
+
assignee = user
|
189
|
+
break
|
190
|
+
case 'MyDepartment':
|
191
|
+
case 'MySupervisor':
|
192
|
+
break
|
193
|
+
default:
|
194
|
+
}
|
195
|
+
|
196
|
+
id ? assigneeItemList.push({ type, assignee }) : assigneeItemList.push({ type })
|
197
|
+
}
|
198
|
+
|
199
|
+
return assigneeItemList
|
200
|
+
}
|
201
|
+
|
180
202
|
@FieldResolver(type => [ApprovalLineItem])
|
181
203
|
async approvalLine(@Root() dataSet: DataSet, @Ctx() context: ResolverContext): Promise<ApprovalLineItem[]> {
|
182
204
|
const { domain, user } = context.state
|