@things-factory/dataset 5.0.0-alpha.4 → 5.0.0-alpha.42

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 (107) hide show
  1. package/README.md +13 -0
  2. package/assets/data-samples.jpg +0 -0
  3. package/client/bootstrap.js +21 -1
  4. package/client/pages/{data-entry-form.js → data-entry/data-entry-form.js} +15 -2
  5. package/client/pages/data-entry/data-entry-list-page.js +423 -0
  6. package/client/pages/data-ooc/data-ooc-list-page.js +483 -0
  7. package/client/pages/data-ooc/data-ooc-view.js +182 -0
  8. package/client/pages/data-report/data-report-embed-page.js +113 -0
  9. package/client/pages/data-report/data-report-list-page.js +465 -0
  10. package/client/pages/data-report/jasper-report-oocs-page.js +120 -0
  11. package/client/pages/data-report/jasper-report-samples-crosstab-page.js +120 -0
  12. package/client/pages/data-report/jasper-report-samples-page.js +120 -0
  13. package/client/pages/data-sample/data-sample-list-page.js +386 -0
  14. package/client/pages/data-sample/data-sample-view.js +97 -0
  15. package/client/pages/{data-sensor.js → data-sensor/data-sensor-list-page.js} +43 -64
  16. package/client/pages/{data-item-list.js → data-set/data-item-list.js} +37 -12
  17. package/client/pages/{data-set-importer.js → data-set/data-set-importer.js} +0 -0
  18. package/client/pages/data-set/data-set-list-page.js +712 -0
  19. package/client/route.js +34 -6
  20. package/config/config.development.js +13 -0
  21. package/config/config.production.js +1 -0
  22. package/dist-server/controllers/create-data-sample.js +133 -0
  23. package/dist-server/controllers/create-data-sample.js.map +1 -0
  24. package/dist-server/controllers/data-use-case.js +57 -0
  25. package/dist-server/controllers/data-use-case.js.map +1 -0
  26. package/dist-server/controllers/index.js +17 -0
  27. package/dist-server/controllers/index.js.map +1 -1
  28. package/dist-server/controllers/jasper-report.js +156 -0
  29. package/dist-server/controllers/jasper-report.js.map +1 -0
  30. package/dist-server/index.js +1 -0
  31. package/dist-server/index.js.map +1 -1
  32. package/dist-server/routes.js +13 -24
  33. package/dist-server/routes.js.map +1 -1
  34. package/dist-server/service/data-item/data-item-mutation.js +5 -1
  35. package/dist-server/service/data-item/data-item-mutation.js.map +1 -1
  36. package/dist-server/service/data-item/data-item-query.js +7 -2
  37. package/dist-server/service/data-item/data-item-query.js.map +1 -1
  38. package/dist-server/service/data-item/data-item-type.js +15 -7
  39. package/dist-server/service/data-item/data-item-type.js.map +1 -1
  40. package/dist-server/service/data-item/data-item.js +17 -3
  41. package/dist-server/service/data-item/data-item.js.map +1 -1
  42. package/dist-server/service/data-ooc/data-ooc-mutation.js +92 -0
  43. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
  44. package/dist-server/service/data-ooc/data-ooc-query.js +120 -0
  45. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
  46. package/dist-server/service/data-ooc/data-ooc-subscription.js +65 -0
  47. package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -0
  48. package/dist-server/service/data-ooc/data-ooc-type.js +107 -0
  49. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
  50. package/dist-server/service/data-ooc/data-ooc.js +237 -0
  51. package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
  52. package/dist-server/service/data-ooc/index.js +10 -0
  53. package/dist-server/service/data-ooc/index.js.map +1 -0
  54. package/dist-server/service/data-sample/data-sample-mutation.js +2 -138
  55. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
  56. package/dist-server/service/data-sample/data-sample-query.js +7 -2
  57. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  58. package/dist-server/service/data-sample/data-sample-type.js +12 -42
  59. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  60. package/dist-server/service/data-sample/data-sample.js +34 -3
  61. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  62. package/dist-server/service/data-sensor/data-sensor-query.js +7 -2
  63. package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
  64. package/dist-server/service/data-set/data-set-mutation.js +38 -9
  65. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  66. package/dist-server/service/data-set/data-set-query.js +185 -3
  67. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  68. package/dist-server/service/data-set/data-set-type.js +84 -3
  69. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  70. package/dist-server/service/data-set/data-set.js +110 -15
  71. package/dist-server/service/data-set/data-set.js.map +1 -1
  72. package/dist-server/service/index.js +6 -2
  73. package/dist-server/service/index.js.map +1 -1
  74. package/package.json +19 -13
  75. package/server/controllers/create-data-sample.ts +177 -0
  76. package/server/controllers/data-use-case.ts +85 -0
  77. package/server/controllers/index.ts +1 -0
  78. package/server/controllers/jasper-report.ts +170 -0
  79. package/server/index.ts +1 -0
  80. package/server/routes.ts +21 -31
  81. package/server/service/data-item/data-item-mutation.ts +6 -1
  82. package/server/service/data-item/data-item-query.ts +9 -3
  83. package/server/service/data-item/data-item-type.ts +10 -6
  84. package/server/service/data-item/data-item.ts +15 -4
  85. package/server/service/data-ooc/data-ooc-mutation.ts +150 -0
  86. package/server/service/data-ooc/data-ooc-query.ts +69 -0
  87. package/server/service/data-ooc/data-ooc-subscription.ts +51 -0
  88. package/server/service/data-ooc/data-ooc-type.ts +68 -0
  89. package/server/service/data-ooc/data-ooc.ts +204 -0
  90. package/server/service/data-ooc/index.ts +7 -0
  91. package/server/service/data-sample/data-sample-mutation.ts +3 -172
  92. package/server/service/data-sample/data-sample-query.ts +9 -3
  93. package/server/service/data-sample/data-sample-type.ts +7 -28
  94. package/server/service/data-sample/data-sample.ts +33 -3
  95. package/server/service/data-sensor/data-sensor-query.ts +9 -3
  96. package/server/service/data-set/data-set-mutation.ts +52 -12
  97. package/server/service/data-set/data-set-query.ts +156 -4
  98. package/server/service/data-set/data-set-type.ts +65 -4
  99. package/server/service/data-set/data-set.ts +100 -12
  100. package/server/service/index.ts +6 -2
  101. package/things-factory.config.js +35 -7
  102. package/translations/en.json +46 -3
  103. package/translations/ko.json +45 -3
  104. package/translations/ms.json +44 -3
  105. package/translations/zh.json +44 -3
  106. package/client/pages/data-sample.js +0 -316
  107. package/client/pages/data-set.js +0 -457
@@ -3,6 +3,7 @@ import { EntityManager, In } from 'typeorm'
3
3
  import uuid from 'uuid/v4'
4
4
 
5
5
  import { Domain } from '@things-factory/shell'
6
+ import { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'
6
7
 
7
8
  import { DataItem } from '../data-item/data-item'
8
9
  import { DataSet } from './data-set'
@@ -16,12 +17,16 @@ export class DataSetMutation {
16
17
  async createDataSet(@Arg('dataSet') dataSet: NewDataSet, @Ctx() context: any): Promise<DataSet> {
17
18
  const { domain, user, tx } = context.state
18
19
 
19
- return await tx.getRepository(DataSet).save({
20
+ const result = await tx.getRepository(DataSet).save({
20
21
  ...dataSet,
21
22
  domain,
22
23
  creator: user,
23
24
  updater: user
24
25
  })
26
+
27
+ await this._createAttachment(context, dataSet.reportTemplate, { refId: result.id, cuFlag: '+' })
28
+
29
+ return result
25
30
  }
26
31
 
27
32
  @Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
@@ -35,11 +40,15 @@ export class DataSetMutation {
35
40
  where: { domain, id }
36
41
  })
37
42
 
38
- return await repository.save({
43
+ const result = await repository.save({
39
44
  ...dataSet,
40
45
  ...patch,
41
46
  updater: user
42
47
  })
48
+
49
+ await this._createAttachment(context, dataSet.reportTemplate, { refId: result.id, cuFlag: 'M' })
50
+
51
+ return result
43
52
  }
44
53
 
45
54
  @Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
@@ -57,6 +66,7 @@ export class DataSetMutation {
57
66
  const dataSetRepo = tx.getRepository(DataSet)
58
67
 
59
68
  if (_createRecords.length > 0) {
69
+ const cuFlag = '+'
60
70
  for (let i = 0; i < _createRecords.length; i++) {
61
71
  const newRecord = _createRecords[i]
62
72
 
@@ -67,11 +77,14 @@ export class DataSetMutation {
67
77
  updater: user
68
78
  })
69
79
 
70
- results.push({ ...result, cuFlag: '+' })
80
+ await this._createAttachment(context, newRecord.reportTemplate, { refId: result.id, cuFlag })
81
+
82
+ results.push({ ...result, cuFlag })
71
83
  }
72
84
  }
73
85
 
74
86
  if (_updateRecords.length > 0) {
87
+ const cuFlag = 'M'
75
88
  for (let i = 0; i < _updateRecords.length; i++) {
76
89
  const newRecord = _updateRecords[i]
77
90
  const dataSet = await dataSetRepo.findOne(newRecord.id)
@@ -82,7 +95,9 @@ export class DataSetMutation {
82
95
  updater: user
83
96
  })
84
97
 
85
- results.push({ ...result, cuFlag: 'M' })
98
+ await this._createAttachment(context, newRecord.reportTemplate, { refId: result.id, cuFlag })
99
+
100
+ results.push({ ...result, cuFlag })
86
101
  }
87
102
  }
88
103
 
@@ -96,6 +111,7 @@ export class DataSetMutation {
96
111
  const { domain, tx } = context.state
97
112
 
98
113
  await tx.getRepository(DataSet).delete({ domain, id })
114
+ await deleteAttachmentsByRef(null, { refBys: [`report-${id}`] }, context)
99
115
  return true
100
116
  }
101
117
 
@@ -110,6 +126,8 @@ export class DataSetMutation {
110
126
  id: In(ids)
111
127
  })
112
128
 
129
+ await deleteAttachmentsByRef(null, { refBys: ids.map(id => `report-${id}`) } , context)
130
+
113
131
  return true
114
132
  }
115
133
 
@@ -169,10 +187,16 @@ export class DataSetMutation {
169
187
  name: dataItem.name,
170
188
  description: dataItem.description,
171
189
  sequence: dataItem.sequence,
172
- task: dataItem.task,
173
- connection: dataItem.connection,
174
- params: dataItem.params,
175
-
190
+ tag: dataItem.tag,
191
+ active: dataItem.active,
192
+ type: dataItem.type,
193
+ quota: dataItem.quota,
194
+ spec: dataItem.spec,
195
+ unit: dataItem.unit,
196
+ options: dataItem.options,
197
+ hidden: dataItem.hidden,
198
+ // connection: dataItem.connection,
199
+ // params: dataItem.params,
176
200
  domain,
177
201
  creator: user,
178
202
  updater: user
@@ -200,10 +224,26 @@ export class DataSetMutation {
200
224
 
201
225
  return copiedDataSets.map(dataSet => {
202
226
  dataSet.dataItems = copiedDataItems.filter(dataItem => dataItem.dataSet == dataSet.id)
203
- return {
204
- ...dataSet,
205
- state: 'UNLOADED' // DataSetInstanceStatus.UNLOADED
206
- }
227
+ return dataSet
207
228
  })
208
229
  }
230
+
231
+
232
+ async _createAttachment(context, attachment, { refId, cuFlag }) {
233
+ if (attachment) {
234
+ const attachmentRef = 'report-' + refId
235
+ cuFlag == 'M' && await deleteAttachmentsByRef(null, { refBys: [attachmentRef] }, context)
236
+ await createAttachment(
237
+ null,
238
+ {
239
+ attachment: {
240
+ file: attachment,
241
+ refBy: attachmentRef
242
+ }
243
+ },
244
+ context
245
+ )
246
+ }
247
+ }
209
248
  }
249
+
@@ -1,13 +1,18 @@
1
1
  import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
2
  import { getRepository } from 'typeorm'
3
3
 
4
- import { User } from '@things-factory/auth-base'
5
- import { convertListParams, Domain, ListParam } from '@things-factory/shell'
4
+ import { Role, User } from '@things-factory/auth-base'
5
+ import { Board } from '@things-factory/board-service'
6
+ import { Domain, getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'
7
+ import { Attachment } from '@things-factory/attachment-base'
6
8
 
7
9
  import { DataItem } from '../data-item/data-item'
10
+ import { DataSample } from '../data-sample/data-sample'
8
11
  import { DataSet } from './data-set'
9
12
  import { DataSetList } from './data-set-type'
10
13
 
14
+ var parser = require('cron-parser')
15
+
11
16
  @Resolver(DataSet)
12
17
  export class DataSetQuery {
13
18
  @Directive('@privilege(category: "data-set", privilege: "query", domainOwnerGranted: true)')
@@ -25,8 +30,74 @@ export class DataSetQuery {
25
30
  async dataSets(@Args() params: ListParam, @Ctx() context: any): Promise<DataSetList> {
26
31
  const { domain } = context.state
27
32
 
28
- const convertedParams = convertListParams(params, domain.id)
29
- const [items, total] = await getRepository(DataSet).findAndCount(convertedParams)
33
+ const queryBuilder = getQueryBuilderFromListParams({
34
+ repository: getRepository(DataSet),
35
+ params,
36
+ domain,
37
+ alias: 'dataset'
38
+ })
39
+
40
+ const [items, total] = await queryBuilder.getManyAndCount()
41
+
42
+ return { items, total }
43
+ }
44
+
45
+ @Query(returns => DataSetList, { description: 'To fetch multiple DataSets for data entry manually' })
46
+ async dataSetsForEntry(@Args() params: ListParam, @Ctx() context: any): Promise<DataSetList> {
47
+ var { domain, user } = context.state
48
+
49
+ /* 조회한 사용자가 entry-role을 가진 data-set 리스트만 반환 */
50
+ user = await getRepository(User).findOne({
51
+ where: { id: user.id },
52
+ relations: ['roles']
53
+ })
54
+ const roles = user.roles.filter(role => role.domainId === domain.id).map(role => role.id)
55
+
56
+ if (!roles.length) {
57
+ return { items: [], total: 0 }
58
+ }
59
+
60
+ const queryBuilder = getQueryBuilderFromListParams({
61
+ repository: getRepository(DataSet),
62
+ params,
63
+ domain,
64
+ alias: 'dataset'
65
+ })
66
+
67
+ queryBuilder.andWhere(`dataset.active = :active`, { active: true })
68
+ queryBuilder.andWhere(`dataset.entry_role_id IN (:...roles)`, { roles })
69
+
70
+ const [items, total] = await queryBuilder.getManyAndCount()
71
+
72
+ return { items, total }
73
+ }
74
+
75
+ @Query(returns => DataSetList, { description: 'To fetch multiple DataSets to see data report' })
76
+ async dataSetsForReport(@Args() params: ListParam, @Ctx() context: any): Promise<DataSetList> {
77
+ var { domain, user } = context.state
78
+
79
+ /* 조회한 사용자가 supervisory 역할을 가진 data-set 리스트만 반환 */
80
+ user = await getRepository(User).findOne({
81
+ where: { id: user.id },
82
+ relations: ['roles']
83
+ })
84
+ const roles = user.roles.filter(role => role.domainId === domain.id).map(role => role.id)
85
+
86
+ if (!roles.length) {
87
+ return { items: [], total: 0 }
88
+ }
89
+
90
+ const queryBuilder = getQueryBuilderFromListParams({
91
+ repository: getRepository(DataSet),
92
+ params,
93
+ domain,
94
+ alias: 'dataset'
95
+ })
96
+
97
+ queryBuilder.andWhere(`dataset.active = :active`, { active: true })
98
+ queryBuilder.andWhere(`dataset.supervisory_role_id IN (:...roles)`, { roles })
99
+
100
+ const [items, total] = await queryBuilder.getManyAndCount()
30
101
 
31
102
  return { items, total }
32
103
  }
@@ -38,6 +109,34 @@ export class DataSetQuery {
38
109
  })
39
110
  }
40
111
 
112
+ @FieldResolver(type => Role)
113
+ async entryRole(@Root() dataSet: DataSet): Promise<Role> {
114
+ return await getRepository(Role).findOne({
115
+ id: dataSet.entryRoleId
116
+ })
117
+ }
118
+
119
+ @FieldResolver(type => Role)
120
+ async supervisoryRole(@Root() dataSet: DataSet): Promise<Role> {
121
+ return await getRepository(Role).findOne({
122
+ id: dataSet.supervisoryRoleId
123
+ })
124
+ }
125
+
126
+ @FieldResolver(type => Board, { nullable: true })
127
+ async entryBoard(@Root() dataSet: DataSet) {
128
+ if (dataSet.entryType == 'board' && dataSet.entryView) {
129
+ return await getRepository(Board).findOne({ id: dataSet.entryView })
130
+ }
131
+ }
132
+
133
+ @FieldResolver(type => Board, { nullable: true })
134
+ async monitorBoard(@Root() dataSet: DataSet) {
135
+ if (dataSet.monitorType == 'board' && dataSet.monitorView) {
136
+ return await getRepository(Board).findOne({ id: dataSet.monitorView })
137
+ }
138
+ }
139
+
41
140
  @FieldResolver(type => Domain)
42
141
  async domain(@Root() dataSet: DataSet): Promise<Domain> {
43
142
  return await getRepository(Domain).findOne(dataSet.domainId)
@@ -52,4 +151,57 @@ export class DataSetQuery {
52
151
  async creator(@Root() dataSet: DataSet): Promise<User> {
53
152
  return await getRepository(User).findOne(dataSet.creatorId)
54
153
  }
154
+
155
+ @FieldResolver(type => Date, { nullable: true })
156
+ async latestCollectedAt(@Root() dataSet: DataSet): Promise<Date> {
157
+ const sample = await getRepository(DataSample).findOne({
158
+ select: ['collectedAt'],
159
+ where: { dataSet },
160
+ order: { collectedAt: 'DESC' }
161
+ })
162
+
163
+ return sample?.collectedAt
164
+ }
165
+
166
+ @FieldResolver(type => Date, { nullable: true })
167
+ async nextSchedule(@Root() dataSet: DataSet): Promise<Date> {
168
+ const { domainId, schedule, timezone } = dataSet
169
+
170
+ if (!schedule) {
171
+ return
172
+ }
173
+
174
+ var interval = parser.parseExpression(schedule, {
175
+ tz: timezone || ((await getRepository(Domain).findOne(domainId)) as Domain).timezone || 'UTC'
176
+ })
177
+
178
+ return interval.next().toDate()
179
+ }
180
+
181
+ @FieldResolver(type => Date, { nullable: true })
182
+ async prevSchedule(@Root() dataSet: DataSet): Promise<Date> {
183
+ const { domainId, schedule, timezone } = dataSet
184
+
185
+ if (!schedule) {
186
+ return
187
+ }
188
+
189
+ var interval = parser.parseExpression(schedule, {
190
+ tz: timezone || ((await getRepository(Domain).findOne(domainId)) as Domain).timezone || 'UTC'
191
+ })
192
+
193
+ return interval.prev().toDate()
194
+ }
195
+
196
+ @FieldResolver(type => String)
197
+ async reportTemplate(@Root() dataset: DataSet): Promise<string | undefined> {
198
+ const attachment: Attachment = await getRepository(Attachment).findOne({
199
+ where: {
200
+ domain: dataset.domainId,
201
+ refBy: `report-${dataset.id}`
202
+ }
203
+ })
204
+
205
+ return attachment?.path
206
+ }
55
207
  }
@@ -1,8 +1,9 @@
1
1
  import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
+ import { FileUpload, GraphQLUpload } from 'graphql-upload'
2
3
 
3
- import { ScalarObject } from '@things-factory/shell'
4
+ import { ObjectRef, ScalarObject } from '@things-factory/shell'
4
5
 
5
- import { DataSet } from './data-set'
6
+ import { DataSet, DataSetEntryType, DataSetMonitorType, DataSetReportType } from './data-set'
6
7
 
7
8
  @InputType()
8
9
  export class NewDataSet {
@@ -12,11 +13,20 @@ export class NewDataSet {
12
13
  @Field({ nullable: true })
13
14
  description?: string
14
15
 
16
+ @Field(type => ObjectRef, { nullable: true })
17
+ entryRole?: ObjectRef
18
+
19
+ @Field(type => ObjectRef, { nullable: true })
20
+ supervisoryRole?: ObjectRef
21
+
15
22
  @Field({ nullable: true })
16
23
  active?: boolean
17
24
 
18
25
  @Field({ nullable: true })
19
- type?: string
26
+ type?: 'manual' | 'automatic' | string
27
+
28
+ @Field({ nullable: true })
29
+ useCase?: string
20
30
 
21
31
  @Field(type => ScalarObject, { nullable: true })
22
32
  partitionKeys?: ScalarObject
@@ -26,6 +36,27 @@ export class NewDataSet {
26
36
 
27
37
  @Field({ nullable: true })
28
38
  timezone?: string
39
+
40
+ @Field({ nullable: true })
41
+ entryType?: DataSetEntryType
42
+
43
+ @Field({ nullable: true })
44
+ entryView?: string
45
+
46
+ @Field({ nullable: true })
47
+ monitorType?: DataSetMonitorType
48
+
49
+ @Field({ nullable: true })
50
+ monitorView?: string
51
+
52
+ @Field({ nullable: true })
53
+ reportType?: DataSetReportType
54
+
55
+ @Field({ nullable: true })
56
+ reportView?: string
57
+
58
+ @Field(type => GraphQLUpload, { nullable: true })
59
+ reportTemplate?: FileUpload
29
60
  }
30
61
 
31
62
  @InputType()
@@ -39,11 +70,20 @@ export class DataSetPatch {
39
70
  @Field({ nullable: true })
40
71
  description?: string
41
72
 
73
+ @Field(type => ObjectRef, { nullable: true })
74
+ supervisoryRole?: ObjectRef
75
+
76
+ @Field(type => ObjectRef, { nullable: true })
77
+ entryRole?: ObjectRef
78
+
42
79
  @Field({ nullable: true })
43
80
  active?: boolean
44
81
 
45
82
  @Field({ nullable: true })
46
- type?: string
83
+ type?: 'manual' | 'automatic' | string
84
+
85
+ @Field({ nullable: true })
86
+ useCase?: string
47
87
 
48
88
  @Field(type => ScalarObject, { nullable: true })
49
89
  partitionKeys?: ScalarObject
@@ -54,6 +94,27 @@ export class DataSetPatch {
54
94
  @Field({ nullable: true })
55
95
  timezone?: string
56
96
 
97
+ @Field({ nullable: true })
98
+ entryType?: DataSetEntryType
99
+
100
+ @Field({ nullable: true })
101
+ entryView?: string
102
+
103
+ @Field({ nullable: true })
104
+ monitorType?: DataSetMonitorType
105
+
106
+ @Field({ nullable: true })
107
+ monitorView?: string
108
+
109
+ @Field({ nullable: true })
110
+ reportType?: DataSetReportType
111
+
112
+ @Field({ nullable: true })
113
+ reportView?: string
114
+
115
+ @Field(type => GraphQLUpload, { nullable: true })
116
+ reportTemplate?: FileUpload
117
+
57
118
  @Field()
58
119
  cuFlag: string
59
120
  }
@@ -1,4 +1,4 @@
1
- import { Field, ID, ObjectType } from 'type-graphql'
1
+ import { Field, ID, ObjectType, registerEnumType } from 'type-graphql'
2
2
  import {
3
3
  Column,
4
4
  CreateDateColumn,
@@ -11,11 +11,46 @@ import {
11
11
  UpdateDateColumn
12
12
  } from 'typeorm'
13
13
 
14
- import { User } from '@things-factory/auth-base'
14
+ import { Role, User } from '@things-factory/auth-base'
15
15
  import { Domain, ScalarObject } from '@things-factory/shell'
16
16
 
17
17
  import { DataItem } from '../data-item/data-item'
18
- import { DataSample } from '../data-sample/data-sample'
18
+
19
+ export enum DataSetEntryType {
20
+ Generated = 'generated',
21
+ Board = 'board',
22
+ Page = 'page',
23
+ ExternalURL = 'external'
24
+ }
25
+
26
+ registerEnumType(DataSetEntryType, {
27
+ name: 'DataSetEntryType',
28
+ description: 'entry type enumeration for data-set'
29
+ })
30
+
31
+ export enum DataSetMonitorType {
32
+ Generated = 'generated',
33
+ Board = 'board',
34
+ Page = 'page',
35
+ ExternalURL = 'external'
36
+ }
37
+
38
+ registerEnumType(DataSetMonitorType, {
39
+ name: 'DataSetMonitorType',
40
+ description: 'monitor type enumeration for data-set'
41
+ })
42
+
43
+ export enum DataSetReportType {
44
+ Generated = 'generated',
45
+ Board = 'board',
46
+ Page = 'page',
47
+ ExternalURL = 'external'
48
+ }
49
+
50
+ registerEnumType(DataSetReportType, {
51
+ name: 'DataSetReportType',
52
+ description: 'report type enumeration for data-set'
53
+ })
19
54
 
20
55
  @Entity()
21
56
  @Index('ix_data_set_0', (dataSet: DataSet) => [dataSet.domain, dataSet.name], { unique: true })
@@ -48,30 +83,83 @@ export class DataSet {
48
83
  @Field({ nullable: true })
49
84
  active?: boolean
50
85
 
86
+ @ManyToOne(type => Role, {
87
+ nullable: true
88
+ })
89
+ @Field(type => Role, { nullable: true })
90
+ entryRole?: Role
91
+
92
+ @RelationId((dataSet: DataSet) => dataSet.entryRole)
93
+ entryRoleId?: string
94
+
95
+ @ManyToOne(type => Role, {
96
+ nullable: true
97
+ })
98
+ @Field(type => Role, { nullable: true })
99
+ supervisoryRole?: Role
100
+
101
+ @RelationId((dataSet: DataSet) => dataSet.supervisoryRole)
102
+ supervisoryRoleId?: string
103
+
51
104
  @Column({
52
105
  nullable: true
53
106
  })
54
107
  @Field({ nullable: true })
55
- type?: string
108
+ type?: 'manual' | 'automatic' | string
56
109
 
57
- @Column('simple-json', { nullable: true })
58
- @Field(type => ScalarObject, { nullable: true })
59
- partitionKeys?: ScalarObject
110
+ @Column({
111
+ nullable: true
112
+ })
113
+ @Field({ nullable: true })
114
+ entryType?: DataSetEntryType
115
+
116
+ @Column({
117
+ nullable: true
118
+ })
119
+ @Field({ nullable: true })
120
+ entryView?: string
121
+
122
+ @Column({
123
+ nullable: true
124
+ })
125
+ @Field({ nullable: true })
126
+ monitorType?: DataSetMonitorType
127
+
128
+ @Column({
129
+ nullable: true
130
+ })
131
+ @Field({ nullable: true })
132
+ monitorView?: string
133
+
134
+ @Column({
135
+ nullable: true
136
+ })
137
+ @Field({ nullable: true })
138
+ reportType?: DataSetReportType
139
+
140
+ @Column({
141
+ nullable: true
142
+ })
143
+ @Field({ nullable: true })
144
+ reportView?: string
145
+
146
+ @Field({ nullable: true })
147
+ reportTemplate?: string
60
148
 
61
149
  @Column({
62
150
  nullable: true
63
151
  })
64
152
  @Field({ nullable: true })
65
- slugger?: string
153
+ useCase?: string
154
+
155
+ @Column('simple-json', { nullable: true })
156
+ @Field(type => ScalarObject, { nullable: true })
157
+ partitionKeys?: ScalarObject
66
158
 
67
159
  @OneToMany(type => DataItem, dataItem => dataItem.dataSet)
68
160
  @Field(type => [DataItem], { nullable: true })
69
161
  dataItems: DataItem[]
70
162
 
71
- @OneToMany(type => DataSample, dataSample => dataSample.dataSet)
72
- @Field(type => [DataSample], { nullable: true })
73
- dataSamples: DataSample[]
74
-
75
163
  @Column({
76
164
  nullable: true
77
165
  })
@@ -1,11 +1,13 @@
1
+ import { entities as DataItemEntities, resolvers as DataItemResolvers } from './data-item'
1
2
  /* IMPORT ENTITIES AND RESOLVERS */
2
- import { entities as DataSensorEntities, resolvers as DataSensorResolvers } from './data-sensor'
3
+ import { entities as DataOocEntities, resolvers as DataOocResolvers } from './data-ooc'
3
4
  import { entities as DataSampleEntities, resolvers as DataSampleResolvers } from './data-sample'
4
- import { entities as DataItemEntities, resolvers as DataItemResolvers } from './data-item'
5
+ import { entities as DataSensorEntities, resolvers as DataSensorResolvers } from './data-sensor'
5
6
  import { entities as DataSetEntities, resolvers as DataSetResolvers } from './data-set'
6
7
  import { entities as DataSpecEntities, resolvers as DataSpecResolvers } from './data-spec'
7
8
 
8
9
  /* EXPORT ENTITY TYPES */
10
+ export * from './data-ooc/data-ooc'
9
11
  export * from './data-sensor/data-sensor'
10
12
  export * from './data-sample/data-sample'
11
13
  export * from './data-item/data-item'
@@ -14,6 +16,7 @@ export * from './data-spec/data-spec'
14
16
 
15
17
  export const entities = [
16
18
  /* ENTITIES */
19
+ ...DataOocEntities,
17
20
  ...DataSensorEntities,
18
21
  ...DataSampleEntities,
19
22
  ...DataItemEntities,
@@ -24,6 +27,7 @@ export const entities = [
24
27
  export const schema = {
25
28
  resolverClasses: [
26
29
  /* RESOLVER CLASSES */
30
+ ...DataOocResolvers,
27
31
  ...DataSensorResolvers,
28
32
  ...DataSampleResolvers,
29
33
  ...DataItemResolvers,
@@ -5,17 +5,45 @@ export default {
5
5
  route,
6
6
  routes: [
7
7
  {
8
- tagname: 'data-set-page',
9
- page: 'data-set'
8
+ tagname: 'data-set-list-page',
9
+ page: 'data-set-list'
10
10
  },
11
11
  {
12
- tagname: 'data-sensor-page',
13
- page: 'data-sensor'
12
+ tagname: 'data-sensor-list-page',
13
+ page: 'data-sensor-list'
14
14
  },
15
15
  {
16
- tagname: 'data-sample-page',
17
- page: 'data-sample'
18
- }
16
+ tagname: 'data-sample-list-page',
17
+ page: 'data-sample-list'
18
+ },
19
+ {
20
+ tagname: 'data-ooc-list-page',
21
+ page: 'data-ooc-list'
22
+ },
23
+ {
24
+ tagname: 'data-entry-list-page',
25
+ page: 'data-entry-list'
26
+ },
27
+ {
28
+ tagname: 'data-report-list-page',
29
+ page: 'data-report-list'
30
+ },
31
+ {
32
+ tagname: 'jasper-report-samples-page',
33
+ page: 'jasper-report-samples'
34
+ },
35
+ {
36
+ tagname: 'jasper-report-samples-crosstab-page',
37
+ page: 'jasper-report-samples-crosstab'
38
+ },
39
+ {
40
+ tagname: 'jasper-report-oocs-page',
41
+ page: 'jasper-report-oocs'
42
+ },
43
+ {
44
+ tagname: 'data-report-embed-page',
45
+ page: 'data-report-embed'
46
+ },
19
47
  ],
20
48
  bootstrap
21
49
  }