@things-factory/dataset 5.0.0-alpha.8 → 5.0.0-zeta.0

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 +9 -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 -3
  5. package/client/pages/data-entry/data-entry-list-page.js +390 -0
  6. package/client/pages/data-ooc/data-ooc-list-page.js +416 -0
  7. package/client/pages/data-ooc/data-ooc-view.js +183 -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 +432 -0
  10. package/client/pages/data-report/jasper-report-oocs-page.js +122 -0
  11. package/client/pages/data-report/jasper-report-samples-crosstab-page.js +122 -0
  12. package/client/pages/data-report/jasper-report-samples-page.js +122 -0
  13. package/client/pages/data-sample/data-sample-list-page.js +372 -0
  14. package/client/pages/data-sample/data-sample-view.js +98 -0
  15. package/client/pages/{data-sensor.js → data-sensor/data-sensor-list-page.js} +43 -68
  16. package/client/pages/{data-item-list.js → data-set/data-item-list.js} +36 -11
  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 +739 -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 +18 -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 +6 -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 +40 -14
  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 +190 -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 +2 -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 +8 -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 -168
  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 +53 -14
  97. package/server/service/data-set/data-set-query.ts +161 -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 -307
  107. package/client/pages/data-set.js +0 -457
@@ -1,13 +1,15 @@
1
1
  import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
2
  import { EntityManager, In } from 'typeorm'
3
- import uuid from 'uuid/v4'
4
3
 
4
+ import { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'
5
5
  import { Domain } from '@things-factory/shell'
6
6
 
7
7
  import { DataItem } from '../data-item/data-item'
8
8
  import { DataSet } from './data-set'
9
9
  import { DataSetPatch, NewDataSet } from './data-set-type'
10
10
 
11
+ const crypto = require('crypto')
12
+
11
13
  @Resolver(DataSet)
12
14
  export class DataSetMutation {
13
15
  @Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
@@ -16,12 +18,16 @@ export class DataSetMutation {
16
18
  async createDataSet(@Arg('dataSet') dataSet: NewDataSet, @Ctx() context: any): Promise<DataSet> {
17
19
  const { domain, user, tx } = context.state
18
20
 
19
- return await tx.getRepository(DataSet).save({
21
+ const result = await tx.getRepository(DataSet).save({
20
22
  ...dataSet,
21
23
  domain,
22
24
  creator: user,
23
25
  updater: user
24
26
  })
27
+
28
+ await this._createAttachment(context, dataSet.reportTemplate, { refId: result.id, cuFlag: '+' })
29
+
30
+ return result
25
31
  }
26
32
 
27
33
  @Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
@@ -35,11 +41,15 @@ export class DataSetMutation {
35
41
  where: { domain, id }
36
42
  })
37
43
 
38
- return await repository.save({
44
+ const result = await repository.save({
39
45
  ...dataSet,
40
46
  ...patch,
41
47
  updater: user
42
48
  })
49
+
50
+ await this._createAttachment(context, dataSet.reportTemplate, { refId: result.id, cuFlag: 'M' })
51
+
52
+ return result
43
53
  }
44
54
 
45
55
  @Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
@@ -57,6 +67,7 @@ export class DataSetMutation {
57
67
  const dataSetRepo = tx.getRepository(DataSet)
58
68
 
59
69
  if (_createRecords.length > 0) {
70
+ const cuFlag = '+'
60
71
  for (let i = 0; i < _createRecords.length; i++) {
61
72
  const newRecord = _createRecords[i]
62
73
 
@@ -67,11 +78,14 @@ export class DataSetMutation {
67
78
  updater: user
68
79
  })
69
80
 
70
- results.push({ ...result, cuFlag: '+' })
81
+ await this._createAttachment(context, newRecord.reportTemplate, { refId: result.id, cuFlag })
82
+
83
+ results.push({ ...result, cuFlag })
71
84
  }
72
85
  }
73
86
 
74
87
  if (_updateRecords.length > 0) {
88
+ const cuFlag = 'M'
75
89
  for (let i = 0; i < _updateRecords.length; i++) {
76
90
  const newRecord = _updateRecords[i]
77
91
  const dataSet = await dataSetRepo.findOne(newRecord.id)
@@ -82,7 +96,9 @@ export class DataSetMutation {
82
96
  updater: user
83
97
  })
84
98
 
85
- results.push({ ...result, cuFlag: 'M' })
99
+ await this._createAttachment(context, newRecord.reportTemplate, { refId: result.id, cuFlag })
100
+
101
+ results.push({ ...result, cuFlag })
86
102
  }
87
103
  }
88
104
 
@@ -96,6 +112,7 @@ export class DataSetMutation {
96
112
  const { domain, tx } = context.state
97
113
 
98
114
  await tx.getRepository(DataSet).delete({ domain, id })
115
+ await deleteAttachmentsByRef(null, { refBys: [`report-${id}`] }, context)
99
116
  return true
100
117
  }
101
118
 
@@ -110,6 +127,8 @@ export class DataSetMutation {
110
127
  id: In(ids)
111
128
  })
112
129
 
130
+ await deleteAttachmentsByRef(null, { refBys: ids.map(id => `report-${id}`) }, context)
131
+
113
132
  return true
114
133
  }
115
134
 
@@ -161,7 +180,7 @@ export class DataSetMutation {
161
180
  var newDataItems = []
162
181
 
163
182
  var newCopys = originals.map(dataSet => {
164
- let dataSetId = uuid()
183
+ let dataSetId = crypto.randomUUID()
165
184
  newDataItems.push(
166
185
  ...dataSet.dataItems.map(dataItem => {
167
186
  return {
@@ -169,10 +188,16 @@ export class DataSetMutation {
169
188
  name: dataItem.name,
170
189
  description: dataItem.description,
171
190
  sequence: dataItem.sequence,
172
- task: dataItem.task,
173
- connection: dataItem.connection,
174
- params: dataItem.params,
175
-
191
+ tag: dataItem.tag,
192
+ active: dataItem.active,
193
+ type: dataItem.type,
194
+ quota: dataItem.quota,
195
+ spec: dataItem.spec,
196
+ unit: dataItem.unit,
197
+ options: dataItem.options,
198
+ hidden: dataItem.hidden,
199
+ // connection: dataItem.connection,
200
+ // params: dataItem.params,
176
201
  domain,
177
202
  creator: user,
178
203
  updater: user
@@ -200,10 +225,24 @@ export class DataSetMutation {
200
225
 
201
226
  return copiedDataSets.map(dataSet => {
202
227
  dataSet.dataItems = copiedDataItems.filter(dataItem => dataItem.dataSet == dataSet.id)
203
- return {
204
- ...dataSet,
205
- state: 'UNLOADED' // DataSetInstanceStatus.UNLOADED
206
- }
228
+ return dataSet
207
229
  })
208
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
  }
@@ -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 { 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 { Domain, getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'
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,73 @@ 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
+ searchables: ['name', 'description', 'supervisoryRole']
39
+ })
40
+
41
+ const [items, total] = await queryBuilder.getManyAndCount()
42
+
43
+ return { items, total }
44
+ }
45
+
46
+ @Query(returns => DataSetList, { description: 'To fetch multiple DataSets for data entry manually' })
47
+ async dataSetsForEntry(@Args() params: ListParam, @Ctx() context: any): Promise<DataSetList> {
48
+ var { domain, user } = context.state
49
+
50
+ /* 조회한 사용자가 entry-role을 가진 data-set 리스트만 반환 */
51
+ user = await getRepository(User).findOne({
52
+ where: { id: user.id },
53
+ relations: ['roles']
54
+ })
55
+ const roles = user.roles.filter(role => role.domainId === domain.id).map(role => role.id)
56
+
57
+ if (!roles.length) {
58
+ return { items: [], total: 0 }
59
+ }
60
+
61
+ const [items, total] = await getQueryBuilderFromListParams({
62
+ repository: getRepository(DataSet),
63
+ params,
64
+ domain,
65
+ alias: 'dataset',
66
+ searchables: ['name', 'description']
67
+ })
68
+ .andWhere(`dataset.active = :active`, { active: true })
69
+ .andWhere('dataset.entryRole IN (:...roles)', { roles })
70
+ .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 [items, total] = await getQueryBuilderFromListParams({
91
+ repository: getRepository(DataSet),
92
+ params,
93
+ domain,
94
+ alias: 'dataset',
95
+ searchables: ['name', 'description']
96
+ })
97
+ .andWhere(`dataset.active = :active`, { active: true })
98
+ .andWhere('dataset.supervisoryRole IN (:...roles)', { roles })
99
+ .getManyAndCount()
30
100
 
31
101
  return { items, total }
32
102
  }
@@ -38,6 +108,40 @@ export class DataSetQuery {
38
108
  })
39
109
  }
40
110
 
111
+ @FieldResolver(type => Role)
112
+ async entryRole(@Root() dataSet: DataSet): Promise<Role> {
113
+ return (
114
+ dataSet.entryRole ||
115
+ (await getRepository(Role).findOne({
116
+ id: dataSet.entryRoleId
117
+ }))
118
+ )
119
+ }
120
+
121
+ @FieldResolver(type => Role)
122
+ async supervisoryRole(@Root() dataSet: DataSet): Promise<Role> {
123
+ return (
124
+ dataSet.supervisoryRole ||
125
+ (await getRepository(Role).findOne({
126
+ id: dataSet.supervisoryRoleId
127
+ }))
128
+ )
129
+ }
130
+
131
+ @FieldResolver(type => Board, { nullable: true })
132
+ async entryBoard(@Root() dataSet: DataSet) {
133
+ if (dataSet.entryType == 'board' && dataSet.entryView) {
134
+ return await getRepository(Board).findOne({ id: dataSet.entryView })
135
+ }
136
+ }
137
+
138
+ @FieldResolver(type => Board, { nullable: true })
139
+ async monitorBoard(@Root() dataSet: DataSet) {
140
+ if (dataSet.monitorType == 'board' && dataSet.monitorView) {
141
+ return await getRepository(Board).findOne({ id: dataSet.monitorView })
142
+ }
143
+ }
144
+
41
145
  @FieldResolver(type => Domain)
42
146
  async domain(@Root() dataSet: DataSet): Promise<Domain> {
43
147
  return await getRepository(Domain).findOne(dataSet.domainId)
@@ -52,4 +156,57 @@ export class DataSetQuery {
52
156
  async creator(@Root() dataSet: DataSet): Promise<User> {
53
157
  return await getRepository(User).findOne(dataSet.creatorId)
54
158
  }
159
+
160
+ @FieldResolver(type => Date, { nullable: true })
161
+ async latestCollectedAt(@Root() dataSet: DataSet): Promise<Date> {
162
+ const sample = await getRepository(DataSample).findOne({
163
+ select: ['collectedAt'],
164
+ where: { dataSet },
165
+ order: { collectedAt: 'DESC' }
166
+ })
167
+
168
+ return sample?.collectedAt
169
+ }
170
+
171
+ @FieldResolver(type => Date, { nullable: true })
172
+ async nextSchedule(@Root() dataSet: DataSet): Promise<Date> {
173
+ const { domainId, schedule, timezone } = dataSet
174
+
175
+ if (!schedule) {
176
+ return
177
+ }
178
+
179
+ var interval = parser.parseExpression(schedule, {
180
+ tz: timezone || ((await getRepository(Domain).findOne(domainId)) as Domain).timezone || 'UTC'
181
+ })
182
+
183
+ return interval.next().toDate()
184
+ }
185
+
186
+ @FieldResolver(type => Date, { nullable: true })
187
+ async prevSchedule(@Root() dataSet: DataSet): Promise<Date> {
188
+ const { domainId, schedule, timezone } = dataSet
189
+
190
+ if (!schedule) {
191
+ return
192
+ }
193
+
194
+ var interval = parser.parseExpression(schedule, {
195
+ tz: timezone || ((await getRepository(Domain).findOne(domainId)) as Domain).timezone || 'UTC'
196
+ })
197
+
198
+ return interval.prev().toDate()
199
+ }
200
+
201
+ @FieldResolver(type => String)
202
+ async reportTemplate(@Root() dataset: DataSet): Promise<string | undefined> {
203
+ const attachment: Attachment = await getRepository(Attachment).findOne({
204
+ where: {
205
+ domain: dataset.domainId,
206
+ refBy: `report-${dataset.id}`
207
+ }
208
+ })
209
+
210
+ return attachment?.path
211
+ }
55
212
  }
@@ -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
  }