@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.
- package/README.md +9 -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 -3
- package/client/pages/data-entry/data-entry-list-page.js +390 -0
- package/client/pages/data-ooc/data-ooc-list-page.js +416 -0
- package/client/pages/data-ooc/data-ooc-view.js +183 -0
- package/client/pages/data-report/data-report-embed-page.js +113 -0
- package/client/pages/data-report/data-report-list-page.js +432 -0
- package/client/pages/data-report/jasper-report-oocs-page.js +122 -0
- package/client/pages/data-report/jasper-report-samples-crosstab-page.js +122 -0
- package/client/pages/data-report/jasper-report-samples-page.js +122 -0
- package/client/pages/data-sample/data-sample-list-page.js +372 -0
- package/client/pages/data-sample/data-sample-view.js +98 -0
- package/client/pages/{data-sensor.js → data-sensor/data-sensor-list-page.js} +43 -68
- package/client/pages/{data-item-list.js → data-set/data-item-list.js} +36 -11
- 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 +739 -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 +18 -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 +6 -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 +40 -14
- package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
- package/dist-server/service/data-set/data-set-query.js +190 -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 +2 -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 +8 -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 -168
- 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 +53 -14
- package/server/service/data-set/data-set-query.ts +161 -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 -307
- 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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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 =
|
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
|
-
|
173
|
-
|
174
|
-
|
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 {
|
5
|
-
import {
|
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
|
29
|
-
|
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
|
-
|
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
|
}
|