@things-factory/dataset 8.0.0-beta.1 → 8.0.0-beta.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. package/package.json +13 -13
  2. package/client/activities/activity-data-collect-edit.ts +0 -105
  3. package/client/activities/activity-data-collect-view.ts +0 -91
  4. package/client/activities/activity-data-review-edit.ts +0 -133
  5. package/client/activities/activity-data-review-view.ts +0 -145
  6. package/client/activities/activity-ooc-resolve-edit.ts +0 -195
  7. package/client/activities/activity-ooc-resolve-view.ts +0 -143
  8. package/client/activities/activity-ooc-review-edit.ts +0 -173
  9. package/client/activities/activity-ooc-review-view.ts +0 -129
  10. package/client/bootstrap.ts +0 -35
  11. package/client/components/data-entry-form.ts +0 -109
  12. package/client/index.ts +0 -1
  13. package/client/pages/data-archive/data-archive-list-page.ts +0 -277
  14. package/client/pages/data-archive/data-archive-request-popup.ts +0 -177
  15. package/client/pages/data-entry/data-entry-list-page.ts +0 -464
  16. package/client/pages/data-key-set/data-key-item-list.ts +0 -183
  17. package/client/pages/data-key-set/data-key-set-importer.ts +0 -89
  18. package/client/pages/data-key-set/data-key-set-list-page.ts +0 -413
  19. package/client/pages/data-ooc/data-ooc-list-page.ts +0 -549
  20. package/client/pages/data-ooc/data-ooc-page.ts +0 -164
  21. package/client/pages/data-ooc/data-ooc-view.ts +0 -236
  22. package/client/pages/data-ooc/data-oocs-page.ts +0 -200
  23. package/client/pages/data-report/data-report-embed-page.ts +0 -108
  24. package/client/pages/data-report/data-report-list-page.ts +0 -454
  25. package/client/pages/data-report/data-report-samples-page.ts +0 -174
  26. package/client/pages/data-report/jasper-report-oocs-page.ts +0 -110
  27. package/client/pages/data-report/jasper-report-samples-crosstab-page.ts +0 -110
  28. package/client/pages/data-report/jasper-report-samples-page.ts +0 -110
  29. package/client/pages/data-sample/data-sample-list-page.ts +0 -442
  30. package/client/pages/data-sample/data-sample-page.ts +0 -55
  31. package/client/pages/data-sample/data-sample-search-page.ts +0 -424
  32. package/client/pages/data-sample/data-sample-view.ts +0 -292
  33. package/client/pages/data-sample/data-samples-page.ts +0 -249
  34. package/client/pages/data-sensor/data-sensor-list-page.ts +0 -456
  35. package/client/pages/data-set/data-item-list.ts +0 -304
  36. package/client/pages/data-set/data-set-importer.ts +0 -89
  37. package/client/pages/data-set/data-set-list-page.ts +0 -1078
  38. package/client/pages/data-summary/data-summary-list-page.ts +0 -363
  39. package/client/pages/data-summary/data-summary-period-page.ts +0 -439
  40. package/client/pages/data-summary/data-summary-search-page.ts +0 -426
  41. package/client/pages/data-summary/data-summary-view.ts +0 -133
  42. package/client/route.ts +0 -91
  43. package/client/tsconfig.json +0 -13
  44. package/server/activities/activity-data-collect.ts +0 -100
  45. package/server/activities/activity-data-review.ts +0 -82
  46. package/server/activities/activity-ooc-resolve.ts +0 -123
  47. package/server/activities/activity-ooc-review.ts +0 -144
  48. package/server/activities/index.ts +0 -11
  49. package/server/controllers/create-data-sample.ts +0 -426
  50. package/server/controllers/data-use-case.ts +0 -98
  51. package/server/controllers/finalize-data-collection.ts +0 -388
  52. package/server/controllers/index.ts +0 -3
  53. package/server/controllers/issue-data-collection-task.ts +0 -70
  54. package/server/controllers/jasper-report.ts +0 -186
  55. package/server/controllers/query-data-summary-by-period.ts +0 -178
  56. package/server/controllers/shiny-report.ts +0 -54
  57. package/server/engine/index.ts +0 -1
  58. package/server/engine/task/create-data-sample.ts +0 -100
  59. package/server/engine/task/index.ts +0 -2
  60. package/server/engine/task/issue-collect-data.ts +0 -45
  61. package/server/index.ts +0 -8
  62. package/server/routes.ts +0 -188
  63. package/server/service/data-archive/data-archive-mutation.ts +0 -273
  64. package/server/service/data-archive/data-archive-query.ts +0 -58
  65. package/server/service/data-archive/data-archive-type.ts +0 -48
  66. package/server/service/data-archive/data-archive.ts +0 -69
  67. package/server/service/data-archive/index.ts +0 -6
  68. package/server/service/data-key-set/data-key-item-type.ts +0 -31
  69. package/server/service/data-key-set/data-key-set-mutation.ts +0 -201
  70. package/server/service/data-key-set/data-key-set-query.ts +0 -68
  71. package/server/service/data-key-set/data-key-set-type.ts +0 -70
  72. package/server/service/data-key-set/data-key-set.ts +0 -86
  73. package/server/service/data-key-set/index.ts +0 -6
  74. package/server/service/data-ooc/data-ooc-mutation.ts +0 -154
  75. package/server/service/data-ooc/data-ooc-query.ts +0 -106
  76. package/server/service/data-ooc/data-ooc-subscription.ts +0 -48
  77. package/server/service/data-ooc/data-ooc-type.ts +0 -71
  78. package/server/service/data-ooc/data-ooc.ts +0 -259
  79. package/server/service/data-ooc/index.ts +0 -7
  80. package/server/service/data-sample/data-sample-mutation.ts +0 -18
  81. package/server/service/data-sample/data-sample-query.ts +0 -215
  82. package/server/service/data-sample/data-sample-type.ts +0 -47
  83. package/server/service/data-sample/data-sample.ts +0 -193
  84. package/server/service/data-sample/index.ts +0 -6
  85. package/server/service/data-sensor/data-sensor-mutation.ts +0 -116
  86. package/server/service/data-sensor/data-sensor-query.ts +0 -76
  87. package/server/service/data-sensor/data-sensor-type.ts +0 -104
  88. package/server/service/data-sensor/data-sensor.ts +0 -126
  89. package/server/service/data-sensor/index.ts +0 -6
  90. package/server/service/data-set/data-item-type.ts +0 -155
  91. package/server/service/data-set/data-set-mutation.ts +0 -552
  92. package/server/service/data-set/data-set-query.ts +0 -461
  93. package/server/service/data-set/data-set-type.ts +0 -204
  94. package/server/service/data-set/data-set.ts +0 -326
  95. package/server/service/data-set/index.ts +0 -6
  96. package/server/service/data-set-history/data-set-history-query.ts +0 -126
  97. package/server/service/data-set-history/data-set-history-type.ts +0 -12
  98. package/server/service/data-set-history/data-set-history.ts +0 -217
  99. package/server/service/data-set-history/event-subscriber.ts +0 -17
  100. package/server/service/data-set-history/index.ts +0 -7
  101. package/server/service/data-spec/data-spec-manager.ts +0 -21
  102. package/server/service/data-spec/data-spec-query.ts +0 -21
  103. package/server/service/data-spec/data-spec.ts +0 -45
  104. package/server/service/data-spec/index.ts +0 -5
  105. package/server/service/data-summary/data-summary-mutation.ts +0 -45
  106. package/server/service/data-summary/data-summary-query.ts +0 -179
  107. package/server/service/data-summary/data-summary-type.ts +0 -86
  108. package/server/service/data-summary/data-summary.ts +0 -170
  109. package/server/service/data-summary/index.ts +0 -7
  110. package/server/service/index.ts +0 -57
  111. package/server/tsconfig.json +0 -10
  112. package/server/utils/config-resolver.ts +0 -29
  113. package/server/utils/index.ts +0 -1
@@ -1,461 +0,0 @@
1
- import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
- import { Brackets, In } from 'typeorm'
3
-
4
- import { Attachment } from '@things-factory/attachment-base'
5
- import { Role, User } from '@things-factory/auth-base'
6
- import { Board } from '@things-factory/board-service'
7
- import { ApprovalLineItem } from '@things-factory/organization'
8
- import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
9
- import { AssigneeItem } from '@things-factory/worklist'
10
- import { Scenario } from '@things-factory/integration-base'
11
-
12
- import { DataKeySet } from '../data-key-set/data-key-set'
13
- import { DataSample } from '../data-sample/data-sample'
14
- import { DataItem } from './data-item-type'
15
- import { DataSet, DataSetState } from './data-set'
16
- import { DataSetList } from './data-set-type'
17
-
18
- var parser = require('cron-parser')
19
-
20
- @Resolver(DataSet)
21
- export class DataSetQuery {
22
- // 데이터셋을 ID로 조회
23
- @Directive('@privilege(category: "data-set", privilege: "query", domainOwnerGranted: true)')
24
- @Query(returns => DataSet, { description: 'To fetch a DataSet' })
25
- async dataSet(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataSet> {
26
- const { domain } = context.state
27
-
28
- return await getRepository(DataSet).findOne({
29
- where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id }
30
- })
31
- }
32
-
33
- // 데이터셋을 이름으로 조회
34
- @Directive('@privilege(category: "data-set", privilege: "query", domainOwnerGranted: true)')
35
- @Query(returns => DataSet, { description: 'To fetch a DataSet by name' })
36
- async dataSetByName(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<DataSet> {
37
- const { domain } = context.state
38
-
39
- return await getRepository(DataSet).findOne({
40
- where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, name }
41
- })
42
- }
43
-
44
- // 여러 데이터셋을 조회
45
- @Directive('@privilege(category: "data-set", privilege: "query", domainOwnerGranted: true)')
46
- @Query(returns => DataSetList, { description: 'To fetch multiple DataSets' })
47
- async dataSets(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<DataSetList> {
48
- const { domain } = context.state
49
-
50
- const queryBuilder = getQueryBuilderFromListParams({
51
- repository: getRepository(DataSet),
52
- params,
53
- domain,
54
- alias: 'dataset',
55
- searchables: ['name', 'description', 'tag', 'supervisoryRole']
56
- })
57
-
58
- const [items, total] = await queryBuilder.getManyAndCount()
59
-
60
- return { items, total }
61
- }
62
-
63
- // 데이터 입력을 위한 데이터셋 조회
64
- @Query(returns => DataSetList, { description: 'To fetch multiple DataSets for data entry manually' })
65
- async dataSetsForEntry(
66
- @Args(type => ListParam) params: ListParam,
67
- @Ctx() context: ResolverContext
68
- ): Promise<DataSetList> {
69
- var { domain, user } = context.state
70
-
71
- // 조회한 사용자가 entry-role을 가진 data-set 리스트만 반환
72
- user = await getRepository(User).findOne({
73
- where: { id: user.id },
74
- relations: ['roles']
75
- })
76
-
77
- const roles = user.roles
78
- .filter(role => role.domainId === domain.id || (domain.parentId && role.domainId === domain.parentId))
79
- .map(role => role.id)
80
-
81
- if (!roles.length) {
82
- return { items: [], total: 0 }
83
- }
84
-
85
- const [items, total] = await getQueryBuilderFromListParams({
86
- repository: getRepository(DataSet),
87
- params,
88
- domain,
89
- alias: 'dataset',
90
- searchables: ['name', 'description']
91
- })
92
- .andWhere('dataset.active = :active', { active: true })
93
- .andWhere(
94
- new Brackets(qb => {
95
- qb.where('dataset.supervisoryRole IN (:...roles)').orWhere('dataset.entryRole IN (:...roles)')
96
- })
97
- )
98
- .setParameter('roles', roles)
99
- .getManyAndCount()
100
-
101
- return {
102
- items,
103
- total
104
- }
105
- }
106
-
107
- // 데이터 보고를 위한 데이터셋 조회
108
- @Query(returns => DataSetList, { description: 'To fetch multiple DataSets to see data report' })
109
- async dataSetsForReport(
110
- @Args(type => ListParam) params: ListParam,
111
- @Ctx() context: ResolverContext
112
- ): Promise<DataSetList> {
113
- var { domain, user } = context.state
114
-
115
- // 조회한 사용자가 supervisory 역할을 가진 data-set 리스트만 반환
116
- user = await getRepository(User).findOne({
117
- where: { id: user.id },
118
- relations: ['roles']
119
- })
120
- const roles = user.roles.filter(role => role.domainId === domain.id).map(role => role.id)
121
-
122
- if (!roles.length) {
123
- return { items: [], total: 0 }
124
- }
125
-
126
- const [items, total] = await getQueryBuilderFromListParams({
127
- repository: getRepository(DataSet),
128
- params,
129
- domain,
130
- alias: 'dataset',
131
- searchables: ['name', 'description']
132
- })
133
- .andWhere(`dataset.active = :active`, { active: true })
134
- .andWhere('dataset.supervisoryRole IN (:...roles)', { roles })
135
- .getManyAndCount()
136
-
137
- return { items, total }
138
- }
139
-
140
- // 데이터셋의 상태를 조회
141
- @FieldResolver(type => DataSetState)
142
- async status(@Root() dataSet: DataSet): Promise<DataSetState> {
143
- // 스케줄러 서비스에서 정보 가져오기
144
- return {
145
- id: '',
146
- scheduleId: '',
147
- state: '',
148
- startedAt: new Date(),
149
- nextSchedule: new Date()
150
- }
151
- }
152
-
153
- // 데이터셋의 데이터 항목을 조회
154
- @FieldResolver(type => [DataItem])
155
- async dataItems(@Root() dataSet: DataSet): Promise<DataItem[]> {
156
- if (dataSet.dataItems instanceof Array) {
157
- return dataSet.dataItems.filter(item => item.name)
158
- }
159
-
160
- return []
161
- }
162
-
163
- // 데이터셋의 entry 역할을 조회
164
- @FieldResolver(type => Role)
165
- async entryRole(@Root() dataSet: DataSet): Promise<Role> {
166
- return (
167
- dataSet.entryRole ||
168
- (dataSet.entryRoleId &&
169
- (await getRepository(Role).findOneBy({
170
- id: dataSet.entryRoleId
171
- })))
172
- )
173
- }
174
-
175
- // 데이터셋의 supervisory 역할을 조회
176
- @FieldResolver(type => Role, { description: 'Retrieves the supervisory role for the dataset' })
177
- async supervisoryRole(@Root() dataSet: DataSet): Promise<Role> {
178
- return (
179
- dataSet.supervisoryRole ||
180
- (dataSet.supervisoryRoleId &&
181
- (await getRepository(Role).findOneBy({
182
- id: dataSet.supervisoryRoleId
183
- })))
184
- )
185
- }
186
-
187
- // 데이터셋의 resolver 역할을 조회
188
- @FieldResolver(type => Role, { description: 'Retrieves the resolver role for the dataset' })
189
- async resolverRole(@Root() dataSet: DataSet): Promise<Role> {
190
- return (
191
- dataSet.resolverRole ||
192
- (dataSet.resolverRoleId &&
193
- (await getRepository(Role).findOneBy({
194
- id: dataSet.resolverRoleId
195
- })))
196
- )
197
- }
198
-
199
- @FieldResolver(type => [AssigneeItem], { description: 'Retrieves the assignee items for the dataset' })
200
- async assignees(@Root() dataSet: DataSet, @Ctx() context: ResolverContext): Promise<AssigneeItem[]> {
201
- const { domain, user } = context.state
202
- const { assignees } = dataSet
203
-
204
- if (!assignees || !(assignees instanceof Array)) {
205
- return null
206
- }
207
-
208
- var assigneeItemList = []
209
-
210
- for (let item of assignees) {
211
- // "value" deprecated. to be removed
212
- var { type, assignee, value } = item
213
- var id = assignee?.id || id
214
-
215
- switch (type) {
216
- case 'Employee':
217
- assignee = id && (await getRepository('Employee').findOneBy({ domain: { id: domain.id }, id }))
218
- break
219
- case 'Department':
220
- assignee = id && (await getRepository('Department').findOneBy({ domain: { id: domain.id }, id }))
221
- break
222
- case 'Role':
223
- assignee = id && (await getRepository('Role').findOneBy({ domain: { id: domain.id }, id }))
224
- break
225
- case 'Myself':
226
- assignee = user
227
- break
228
- case 'MyDepartment':
229
- case 'MySupervisor':
230
- break
231
- default:
232
- }
233
-
234
- id ? assigneeItemList.push({ type, assignee }) : assigneeItemList.push({ type })
235
- }
236
-
237
- return assigneeItemList
238
- }
239
-
240
- @FieldResolver(type => [ApprovalLineItem], { description: 'Retrieves the approval line items for the dataset' })
241
- async approvalLine(@Root() dataSet: DataSet, @Ctx() context: ResolverContext): Promise<ApprovalLineItem[]> {
242
- const { domain, user } = context.state
243
- const { reviewApprovalLine } = dataSet
244
-
245
- if (!reviewApprovalLine || !(reviewApprovalLine instanceof Array)) {
246
- return null
247
- }
248
-
249
- var approvalLineItems = []
250
-
251
- for (let item of reviewApprovalLine) {
252
- // "value" deprecated. to be removed
253
- var { type, approver, value } = item
254
- var id = approver?.id || value
255
- approver = null
256
-
257
- switch (type) {
258
- case 'Employee':
259
- approver = id && (await getRepository('Employee').findOneBy({ domain: { id: domain.id }, id }))
260
- break
261
- case 'Department':
262
- approver = id && (await getRepository('Department').findOneBy({ domain: { id: domain.id }, id }))
263
- break
264
- case 'Role':
265
- approver = id && (await getRepository('Role').findOneBy({ domain: { id: domain.id }, id }))
266
- break
267
- case 'Myself':
268
- approver = user
269
- break
270
- case 'MyDepartment':
271
- case 'MySupervisor':
272
- break
273
- default:
274
- }
275
-
276
- id ? approvalLineItems.push({ type, approver }) : approvalLineItems.push({ type })
277
- }
278
-
279
- return approvalLineItems
280
- }
281
-
282
- @FieldResolver(type => Board, { nullable: true, description: 'Retrieves the entry board for the dataset' })
283
- async entryBoard(@Root() dataSet: DataSet): Promise<Board> {
284
- if (dataSet.entryType == 'board' && dataSet.entryView) {
285
- return await getRepository(Board).findOneBy({ id: dataSet.entryView })
286
- }
287
- }
288
-
289
- @FieldResolver(type => Board, { nullable: true, description: 'Retrieves the monitor board for the dataset' })
290
- async monitorBoard(@Root() dataSet: DataSet): Promise<Board> {
291
- if (dataSet.monitorType == 'board' && dataSet.monitorView) {
292
- return await getRepository(Board).findOneBy({ id: dataSet.monitorView })
293
- }
294
- }
295
-
296
- @FieldResolver(type => DataKeySet, { nullable: true, description: 'Retrieves the data key set for the dataset' })
297
- async dataKeySet(@Root() dataSet: DataSet): Promise<DataKeySet> {
298
- return (
299
- dataSet.dataKeySet ||
300
- (dataSet.dataKeySetId &&
301
- (await getRepository(DataKeySet).findOneBy({
302
- id: dataSet.dataKeySetId
303
- })))
304
- )
305
- }
306
-
307
- @FieldResolver(type => Scenario, { description: 'Retrieves the normal scenario for the dataset.' })
308
- async normalScenario(@Root() dataSet: DataSet): Promise<Scenario> {
309
- return (
310
- dataSet.normalScenario ||
311
- (dataSet.normalScenarioId &&
312
- (await getRepository(Scenario).findOneBy({
313
- id: dataSet.normalScenarioId
314
- })))
315
- )
316
- }
317
-
318
- @FieldResolver(type => Scenario, { description: 'Retrieves the outlier scenario for the dataset.' })
319
- async outlierScenario(@Root() dataSet: DataSet): Promise<Scenario> {
320
- return (
321
- dataSet.outlierScenario ||
322
- (dataSet.outlierScenarioId &&
323
- (await getRepository(Scenario).findOneBy({
324
- id: dataSet.outlierScenarioId
325
- })))
326
- )
327
- }
328
-
329
- // 데이터셋의 도메인을 조회
330
- @FieldResolver(type => Domain)
331
- async domain(@Root() dataSet: DataSet): Promise<Domain> {
332
- return dataSet.domainId && (await getRepository(Domain).findOneBy({ id: dataSet.domainId }))
333
- }
334
-
335
- // 데이터셋의 업데이트한 사용자를 조회
336
- @FieldResolver(type => User)
337
- async updater(@Root() dataSet: DataSet): Promise<User> {
338
- return dataSet.updaterId && (await getRepository(User).findOneBy({ id: dataSet.updaterId }))
339
- }
340
-
341
- // 데이터셋의 생성자를 조회
342
- @FieldResolver(type => User)
343
- async creator(@Root() dataSet: DataSet): Promise<User> {
344
- return dataSet.creatorId && (await getRepository(User).findOneBy({ id: dataSet.creatorId }))
345
- }
346
-
347
- @FieldResolver(type => Date, { nullable: true, description: 'Retrieves the latest collection time for the dataset.' })
348
- async latestCollectedAt(@Root() dataSet: DataSet): Promise<Date> {
349
- const sample = await getRepository(DataSample).findOne({
350
- select: ['id', 'collectedAt'],
351
- where: { dataSet: { id: dataSet.id } },
352
- order: { collectedAt: 'DESC' }
353
- })
354
-
355
- return sample?.collectedAt
356
- }
357
-
358
- @FieldResolver(type => Date, { nullable: true, description: 'Retrieves the next schedule time for the dataset.' })
359
- async nextSchedule(@Root() dataSet: DataSet): Promise<Date> {
360
- const { domainId, schedule, timezone } = dataSet
361
-
362
- if (!schedule) {
363
- return
364
- }
365
-
366
- var interval = parser.parseExpression(schedule, {
367
- tz: timezone || ((await getRepository(Domain).findOneBy({ id: domainId })) as Domain).timezone || 'UTC'
368
- })
369
-
370
- return interval.next().toDate()
371
- }
372
-
373
- @FieldResolver(type => Date, { nullable: true, description: 'Retrieves the previous schedule time for the dataset.' })
374
- async prevSchedule(@Root() dataSet: DataSet): Promise<Date> {
375
- const { domainId, schedule, timezone } = dataSet
376
-
377
- if (!schedule) {
378
- return
379
- }
380
-
381
- var interval = parser.parseExpression(schedule, {
382
- tz: timezone || ((await getRepository(Domain).findOneBy({ id: domainId })) as Domain).timezone || 'UTC'
383
- })
384
-
385
- return interval.prev().toDate()
386
- }
387
-
388
- @FieldResolver(type => Date, {
389
- nullable: true,
390
- description: 'Retrieves the next summary schedule time for the dataset.'
391
- })
392
- async nextSummarySchedule(@Root() dataSet: DataSet): Promise<Date> {
393
- const { domainId, summarySchedule, timezone } = dataSet
394
-
395
- if (!summarySchedule) {
396
- return
397
- }
398
-
399
- var interval = parser.parseExpression(summarySchedule, {
400
- tz: timezone || ((await getRepository(Domain).findOneBy({ id: domainId })) as Domain).timezone || 'UTC'
401
- })
402
-
403
- return interval.next().toDate()
404
-
405
- // FIXME: getSchedules 의 파라미터를 수정해야한다. scheduler 가 없거나 커넥션이 끊겨있어서 오래걸리는 문제는 어떻게 ?? 비동기로 처리한다. 어떻게???
406
- // client: {
407
- // application: Application,
408
- // group: `${domain.id}`,
409
- // type: 'data-set',
410
- // key: dataSet.id,
411
- // operation: 'summary'
412
- // }
413
- // const schedule = getSchedules('name', 'group', false)
414
- // return schedule.nextSchedule
415
- }
416
-
417
- @FieldResolver(type => String, { description: 'Retrieves the report template for the dataset.' })
418
- async reportTemplate(@Root() dataset: DataSet): Promise<string | undefined> {
419
- const attachment: Attachment = await getRepository(Attachment).findOne({
420
- where: {
421
- domain: { id: dataset.domainId },
422
- refType: `${DataSet.name}-report-template`,
423
- refBy: dataset.id
424
- }
425
- })
426
-
427
- return attachment?.path
428
- }
429
-
430
- @FieldResolver(returns => Boolean, { description: 'Whether the user is a supervisor for this dataset' })
431
- async isSupervisor(@Root() dataset: DataSet, @Ctx() context: ResolverContext): Promise<boolean> {
432
- const { user, domain } = context.state
433
-
434
- const foundUser = await getRepository(User).findOne({
435
- where: { id: user.id },
436
- relations: ['roles']
437
- })
438
-
439
- const roles = foundUser.roles
440
- .filter(role => role.domainId === domain.id || (domain.parentId && role.domainId === domain.parentId))
441
- .map(role => role.id)
442
-
443
- return roles.includes(dataset.supervisoryRoleId)
444
- }
445
-
446
- @FieldResolver(returns => Boolean, { description: 'Whether the user is allowed to enter data for this dataset' })
447
- async isEntryAllowed(@Root() dataset: DataSet, @Ctx() context: ResolverContext): Promise<boolean> {
448
- const { user, domain } = context.state
449
-
450
- const foundUser = await getRepository(User).findOne({
451
- where: { id: user.id },
452
- relations: ['roles']
453
- })
454
-
455
- const roles = foundUser.roles
456
- .filter(role => role.domainId === domain.id || (domain.parentId && role.domainId === domain.parentId))
457
- .map(role => role.id)
458
-
459
- return roles.includes(dataset.entryRoleId)
460
- }
461
- }
@@ -1,204 +0,0 @@
1
- import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'
2
- import GraphQLUpload from 'graphql-upload/GraphQLUpload.js'
3
- import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
4
-
5
- import { ApprovalLineItem } from '@things-factory/organization'
6
- import { ObjectRef, ScalarObject } from '@things-factory/shell'
7
-
8
- import { DataItemPatch } from './data-item-type'
9
- import { DataSet, DataSetEntryType, DataSetMonitorType, DataSetReportType, DataSetSummaryPeriodType } from './data-set'
10
-
11
- @InputType()
12
- export class NewDataSet {
13
- @Field()
14
- name: string
15
-
16
- @Field({ nullable: true })
17
- description?: string
18
-
19
- @Field({ nullable: true, description: 'A tag name of data to be published when a data sample created' })
20
- tag?: string
21
-
22
- @Field(type => ObjectRef, { nullable: true })
23
- dataKeySet?: ObjectRef
24
-
25
- @Field(type => ObjectRef, { nullable: true })
26
- entryRole?: ObjectRef
27
-
28
- @Field(type => ObjectRef, { nullable: true })
29
- supervisoryRole?: ObjectRef
30
-
31
- @Field(type => ObjectRef, { nullable: true })
32
- resolverRole?: ObjectRef
33
-
34
- @Field(type => ScalarObject, { nullable: true })
35
- reviewApprovalLine?: ApprovalLineItem[]
36
-
37
- @Field(type => ScalarObject, { nullable: true })
38
- outlierApprovalLine?: ApprovalLineItem[]
39
-
40
- @Field(type => ObjectRef, { nullable: true })
41
- normalScenario?: ObjectRef
42
-
43
- @Field(type => ObjectRef, { nullable: true })
44
- outlierScenario?: ObjectRef
45
-
46
- @Field({ nullable: true })
47
- active?: boolean
48
-
49
- @Field({ nullable: true })
50
- type?: 'manual' | 'automatic' | string
51
-
52
- @Field({ nullable: true })
53
- useCase?: string
54
-
55
- @Field(type => ScalarObject, { nullable: true })
56
- partitionKeys?: { [key: string]: any }
57
-
58
- @Field(type => [DataItemPatch], { nullable: true })
59
- dataItems?: DataItemPatch[]
60
-
61
- @Field({ nullable: true })
62
- schedule?: string
63
-
64
- @Field({ nullable: true })
65
- timezone?: string
66
-
67
- @Field({ nullable: true })
68
- requiresReview?: boolean
69
-
70
- @Field({ nullable: true })
71
- entryType?: DataSetEntryType
72
-
73
- @Field({ nullable: true })
74
- entryView?: string
75
-
76
- @Field({ nullable: true })
77
- monitorType?: DataSetMonitorType
78
-
79
- @Field({ nullable: true })
80
- monitorView?: string
81
-
82
- @Field({ nullable: true })
83
- reportType?: DataSetReportType
84
-
85
- @Field({ nullable: true })
86
- reportView?: string
87
-
88
- @Field(type => GraphQLUpload, { nullable: true })
89
- reportTemplate?: FileUpload
90
-
91
- @Field({ nullable: true })
92
- summaryPeriod?: DataSetSummaryPeriodType
93
-
94
- @Field({
95
- nullable: true,
96
- description: 'The maximum allowed time limit (in seconds) for completing the data entry operation'
97
- })
98
- timeLimit?: number
99
- }
100
-
101
- @InputType()
102
- export class DataSetPatch {
103
- @Field(type => ID, { nullable: true })
104
- id?: string
105
-
106
- @Field({ nullable: true })
107
- name?: string
108
-
109
- @Field({ nullable: true })
110
- description?: string
111
-
112
- @Field({ nullable: true, description: 'A tag name of data to be published when a data sample created' })
113
- tag?: string
114
-
115
- @Field(type => ObjectRef, { nullable: true })
116
- dataKeySet?: ObjectRef
117
-
118
- @Field(type => ObjectRef, { nullable: true })
119
- supervisoryRole?: ObjectRef
120
-
121
- @Field(type => ObjectRef, { nullable: true })
122
- entryRole?: ObjectRef
123
-
124
- @Field(type => ObjectRef, { nullable: true })
125
- resolverRole?: ObjectRef
126
-
127
- @Field(type => ScalarObject, { nullable: true })
128
- reviewApprovalLine?: ApprovalLineItem[]
129
-
130
- @Field(type => ScalarObject, { nullable: true })
131
- outlierApprovalLine?: ApprovalLineItem[]
132
-
133
- @Field(type => ObjectRef, { nullable: true })
134
- normalScenario?: ObjectRef
135
-
136
- @Field(type => ObjectRef, { nullable: true })
137
- outlierScenario?: ObjectRef
138
-
139
- @Field({ nullable: true })
140
- active?: boolean
141
-
142
- @Field({ nullable: true })
143
- type?: 'manual' | 'automatic' | string
144
-
145
- @Field({ nullable: true })
146
- useCase?: string
147
-
148
- @Field(type => ScalarObject, { nullable: true })
149
- partitionKeys?: { [key: string]: any }
150
-
151
- @Field(type => [DataItemPatch], { nullable: true })
152
- dataItems?: DataItemPatch[]
153
-
154
- @Field({ nullable: true })
155
- schedule?: string
156
-
157
- @Field({ nullable: true })
158
- timezone?: string
159
-
160
- @Field({ nullable: true })
161
- requiresReview?: boolean
162
-
163
- @Field({ nullable: true })
164
- entryType?: DataSetEntryType
165
-
166
- @Field({ nullable: true })
167
- entryView?: string
168
-
169
- @Field({ nullable: true })
170
- monitorType?: DataSetMonitorType
171
-
172
- @Field({ nullable: true })
173
- monitorView?: string
174
-
175
- @Field({ nullable: true })
176
- reportType?: DataSetReportType
177
-
178
- @Field({ nullable: true })
179
- reportView?: string
180
-
181
- @Field(type => GraphQLUpload, { nullable: true })
182
- reportTemplate?: FileUpload
183
-
184
- @Field({ nullable: true })
185
- summaryPeriod?: DataSetSummaryPeriodType
186
-
187
- @Field({
188
- nullable: true,
189
- description: 'The maximum allowed time limit (in seconds) for completing the data entry operation'
190
- })
191
- timeLimit?: number
192
-
193
- @Field()
194
- cuFlag: string
195
- }
196
-
197
- @ObjectType()
198
- export class DataSetList {
199
- @Field(type => [DataSet])
200
- items: DataSet[]
201
-
202
- @Field(type => Int)
203
- total: number
204
- }