@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.
- package/README.md +13 -0
- package/assets/data-samples.jpg +0 -0
- package/client/bootstrap.js +21 -1
- package/client/pages/{data-entry-form.js → data-entry/data-entry-form.js} +15 -2
- package/client/pages/data-entry/data-entry-list-page.js +423 -0
- package/client/pages/data-ooc/data-ooc-list-page.js +483 -0
- package/client/pages/data-ooc/data-ooc-view.js +182 -0
- package/client/pages/data-report/data-report-embed-page.js +113 -0
- package/client/pages/data-report/data-report-list-page.js +465 -0
- package/client/pages/data-report/jasper-report-oocs-page.js +120 -0
- package/client/pages/data-report/jasper-report-samples-crosstab-page.js +120 -0
- package/client/pages/data-report/jasper-report-samples-page.js +120 -0
- package/client/pages/data-sample/data-sample-list-page.js +386 -0
- package/client/pages/data-sample/data-sample-view.js +97 -0
- package/client/pages/{data-sensor.js → data-sensor/data-sensor-list-page.js} +43 -64
- package/client/pages/{data-item-list.js → data-set/data-item-list.js} +37 -12
- package/client/pages/{data-set-importer.js → data-set/data-set-importer.js} +0 -0
- package/client/pages/data-set/data-set-list-page.js +712 -0
- package/client/route.js +34 -6
- package/config/config.development.js +13 -0
- package/config/config.production.js +1 -0
- package/dist-server/controllers/create-data-sample.js +133 -0
- package/dist-server/controllers/create-data-sample.js.map +1 -0
- package/dist-server/controllers/data-use-case.js +57 -0
- package/dist-server/controllers/data-use-case.js.map +1 -0
- package/dist-server/controllers/index.js +17 -0
- package/dist-server/controllers/index.js.map +1 -1
- package/dist-server/controllers/jasper-report.js +156 -0
- package/dist-server/controllers/jasper-report.js.map +1 -0
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/routes.js +13 -24
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/data-item/data-item-mutation.js +5 -1
- package/dist-server/service/data-item/data-item-mutation.js.map +1 -1
- package/dist-server/service/data-item/data-item-query.js +7 -2
- package/dist-server/service/data-item/data-item-query.js.map +1 -1
- package/dist-server/service/data-item/data-item-type.js +15 -7
- package/dist-server/service/data-item/data-item-type.js.map +1 -1
- package/dist-server/service/data-item/data-item.js +17 -3
- package/dist-server/service/data-item/data-item.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-mutation.js +92 -0
- package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
- package/dist-server/service/data-ooc/data-ooc-query.js +120 -0
- package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
- package/dist-server/service/data-ooc/data-ooc-subscription.js +65 -0
- package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -0
- package/dist-server/service/data-ooc/data-ooc-type.js +107 -0
- package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
- package/dist-server/service/data-ooc/data-ooc.js +237 -0
- package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
- package/dist-server/service/data-ooc/index.js +10 -0
- package/dist-server/service/data-ooc/index.js.map +1 -0
- package/dist-server/service/data-sample/data-sample-mutation.js +2 -138
- package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-query.js +7 -2
- package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-type.js +12 -42
- package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
- package/dist-server/service/data-sample/data-sample.js +34 -3
- package/dist-server/service/data-sample/data-sample.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-query.js +7 -2
- package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
- package/dist-server/service/data-set/data-set-mutation.js +38 -9
- package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
- package/dist-server/service/data-set/data-set-query.js +185 -3
- package/dist-server/service/data-set/data-set-query.js.map +1 -1
- package/dist-server/service/data-set/data-set-type.js +84 -3
- package/dist-server/service/data-set/data-set-type.js.map +1 -1
- package/dist-server/service/data-set/data-set.js +110 -15
- package/dist-server/service/data-set/data-set.js.map +1 -1
- package/dist-server/service/index.js +6 -2
- package/dist-server/service/index.js.map +1 -1
- package/package.json +19 -13
- package/server/controllers/create-data-sample.ts +177 -0
- package/server/controllers/data-use-case.ts +85 -0
- package/server/controllers/index.ts +1 -0
- package/server/controllers/jasper-report.ts +170 -0
- package/server/index.ts +1 -0
- package/server/routes.ts +21 -31
- package/server/service/data-item/data-item-mutation.ts +6 -1
- package/server/service/data-item/data-item-query.ts +9 -3
- package/server/service/data-item/data-item-type.ts +10 -6
- package/server/service/data-item/data-item.ts +15 -4
- package/server/service/data-ooc/data-ooc-mutation.ts +150 -0
- package/server/service/data-ooc/data-ooc-query.ts +69 -0
- package/server/service/data-ooc/data-ooc-subscription.ts +51 -0
- package/server/service/data-ooc/data-ooc-type.ts +68 -0
- package/server/service/data-ooc/data-ooc.ts +204 -0
- package/server/service/data-ooc/index.ts +7 -0
- package/server/service/data-sample/data-sample-mutation.ts +3 -172
- package/server/service/data-sample/data-sample-query.ts +9 -3
- package/server/service/data-sample/data-sample-type.ts +7 -28
- package/server/service/data-sample/data-sample.ts +33 -3
- package/server/service/data-sensor/data-sensor-query.ts +9 -3
- package/server/service/data-set/data-set-mutation.ts +52 -12
- package/server/service/data-set/data-set-query.ts +156 -4
- package/server/service/data-set/data-set-type.ts +65 -4
- package/server/service/data-set/data-set.ts +100 -12
- package/server/service/index.ts +6 -2
- package/things-factory.config.js +35 -7
- package/translations/en.json +46 -3
- package/translations/ko.json +45 -3
- package/translations/ms.json +44 -3
- package/translations/zh.json +44 -3
- package/client/pages/data-sample.js +0 -316
- 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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
173
|
-
|
174
|
-
|
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 {
|
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
|
29
|
-
|
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
|
-
|
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(
|
58
|
-
|
59
|
-
|
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
|
-
|
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
|
})
|
package/server/service/index.ts
CHANGED
@@ -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
|
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
|
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,
|
package/things-factory.config.js
CHANGED
@@ -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
|
}
|