@things-factory/dataset 6.0.137 → 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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/dataset",
3
- "version": "6.0.137",
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.137",
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.137",
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": "374fe27c35c1a4dbb305f972032d283a51ac8813"
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 newRecord = _updateRecords[i]
174
+ const updateRecord = _updateRecords[i]
101
175
  const dataSet = await dataSetRepo.findOne({
102
- where: { id: newRecord.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
- ...newRecord,
183
+ ...updateRecord,
184
+ approvalLine: getApprovalLineValue(updateRecord),
185
+ assignees: getAssigneesValue(updateRecord),
110
186
  updater: user
111
187
  })
112
188
 
113
- await this._createAttachment(context, newRecord.reportTemplate, { ref: result, cuFlag })
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