@things-factory/dataset 5.0.0-zeta.8 → 5.0.1
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 +25 -0
- package/assets/data-samples.jpg +0 -0
- package/client/bootstrap.js +2 -3
- package/client/{pages/data-entry → components}/data-entry-form.js +1 -1
- package/client/index.js +1 -0
- package/client/pages/data-entry/data-entry-list-page.js +2 -3
- package/client/pages/data-ooc/data-ooc-list-page.js +13 -18
- package/client/pages/data-ooc/data-ooc-view.js +19 -14
- package/client/pages/data-report/data-report-list-page.js +1 -2
- package/client/pages/data-sample/data-sample-list-page.js +12 -13
- package/client/pages/data-sample/data-sample-view.js +3 -2
- package/client/pages/data-sensor/data-sensor-list-page.js +1 -1
- package/client/pages/data-set/data-item-list.js +32 -98
- package/client/pages/data-set/data-set-list-page.js +3 -3
- package/config/config.development.js +1 -1
- package/config/config.production.js +13 -1
- package/dist-server/controllers/create-data-sample.js +10 -44
- package/dist-server/controllers/create-data-sample.js.map +1 -1
- package/dist-server/controllers/data-use-case.js +11 -5
- package/dist-server/controllers/data-use-case.js.map +1 -1
- package/dist-server/controllers/index.js +1 -1
- package/dist-server/controllers/index.js.map +1 -1
- package/dist-server/controllers/jasper-report.js +14 -9
- package/dist-server/controllers/jasper-report.js.map +1 -1
- package/dist-server/service/data-item/index.js +1 -4
- package/dist-server/service/data-item/index.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-query.js +15 -10
- package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-type.js +4 -0
- package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc.js +11 -14
- package/dist-server/service/data-ooc/data-ooc.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-query.js +18 -0
- package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-type.js +4 -0
- package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
- package/dist-server/service/data-sample/data-sample.js +12 -3
- package/dist-server/service/data-sample/data-sample.js.map +1 -1
- package/dist-server/service/{data-item → data-set}/data-item-type.js +60 -33
- package/dist-server/service/data-set/data-item-type.js.map +1 -0
- package/dist-server/service/data-set/data-set-mutation.js +21 -61
- package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
- package/dist-server/service/data-set/data-set-query.js +4 -0
- package/dist-server/service/data-set/data-set-query.js.map +1 -1
- package/dist-server/service/data-set/data-set-type.js +21 -9
- package/dist-server/service/data-set/data-set-type.js.map +1 -1
- package/dist-server/service/data-set/data-set.js +11 -3
- package/dist-server/service/data-set/data-set.js.map +1 -1
- package/dist-server/service/data-set-history/data-set-history-query.js +173 -0
- package/dist-server/service/data-set-history/data-set-history-query.js.map +1 -0
- package/dist-server/service/data-set-history/data-set-history-type.js +29 -0
- package/dist-server/service/data-set-history/data-set-history-type.js.map +1 -0
- package/dist-server/service/data-set-history/data-set-history.js +196 -0
- package/dist-server/service/data-set-history/data-set-history.js.map +1 -0
- package/dist-server/service/data-set-history/event-subscriber.js +26 -0
- package/dist-server/service/data-set-history/event-subscriber.js.map +1 -0
- package/dist-server/service/data-set-history/index.js +10 -0
- package/dist-server/service/data-set-history/index.js.map +1 -0
- package/dist-server/service/index.js +11 -4
- package/dist-server/service/index.js.map +1 -1
- package/package.json +18 -17
- package/server/controllers/create-data-sample.ts +13 -50
- package/server/controllers/data-use-case.ts +19 -7
- package/server/controllers/index.ts +1 -1
- package/server/controllers/jasper-report.ts +58 -48
- package/server/service/data-item/index.ts +0 -3
- package/server/service/data-ooc/data-ooc-query.ts +13 -8
- package/server/service/data-ooc/data-ooc-type.ts +3 -0
- package/server/service/data-ooc/data-ooc.ts +9 -14
- package/server/service/data-sample/data-sample-query.ts +14 -1
- package/server/service/data-sample/data-sample-type.ts +3 -0
- package/server/service/data-sample/data-sample.ts +10 -3
- package/server/service/data-set/data-item-type.ts +82 -0
- package/server/service/data-set/data-set-mutation.ts +33 -60
- package/server/service/data-set/data-set-query.ts +5 -0
- package/server/service/data-set/data-set-type.ts +9 -1
- package/server/service/data-set/data-set.ts +8 -4
- package/server/service/data-set-history/data-set-history-query.ts +110 -0
- package/server/service/data-set-history/data-set-history-type.ts +12 -0
- package/server/service/data-set-history/data-set-history.ts +161 -0
- package/server/service/data-set-history/event-subscriber.ts +17 -0
- package/server/service/data-set-history/index.ts +7 -0
- package/server/service/index.ts +16 -4
- package/translations/en.json +5 -5
- package/translations/ko.json +10 -10
- package/translations/ms.json +5 -5
- package/translations/zh.json +5 -5
- package/dist-server/service/data-item/data-item-mutation.js +0 -73
- package/dist-server/service/data-item/data-item-mutation.js.map +0 -1
- package/dist-server/service/data-item/data-item-query.js +0 -104
- package/dist-server/service/data-item/data-item-query.js.map +0 -1
- package/dist-server/service/data-item/data-item-type.js.map +0 -1
- package/server/service/data-item/data-item-mutation.ts +0 -61
- package/server/service/data-item/data-item-query.ts +0 -58
- package/server/service/data-item/data-item-type.ts +0 -57
@@ -1,10 +1,8 @@
|
|
1
1
|
import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
|
2
|
-
import {
|
2
|
+
import { In } from 'typeorm'
|
3
3
|
|
4
4
|
import { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'
|
5
|
-
import { Domain } from '@things-factory/shell'
|
6
5
|
|
7
|
-
import { DataItem } from '../data-item/data-item'
|
8
6
|
import { DataSet } from './data-set'
|
9
7
|
import { DataSetPatch, NewDataSet } from './data-set-type'
|
10
8
|
|
@@ -17,9 +15,11 @@ export class DataSetMutation {
|
|
17
15
|
@Mutation(returns => DataSet, { description: 'To create new DataSet' })
|
18
16
|
async createDataSet(@Arg('dataSet') dataSet: NewDataSet, @Ctx() context: any): Promise<DataSet> {
|
19
17
|
const { domain, user, tx } = context.state
|
18
|
+
const dataSetRepo = tx.getRepository(DataSet)
|
20
19
|
|
21
|
-
const result = await
|
20
|
+
const result = await dataSetRepo.save({
|
22
21
|
...dataSet,
|
22
|
+
version: 1,
|
23
23
|
domain,
|
24
24
|
creator: user,
|
25
25
|
updater: user
|
@@ -35,13 +35,13 @@ export class DataSetMutation {
|
|
35
35
|
@Mutation(returns => DataSet, { description: 'To modify DataSet information' })
|
36
36
|
async updateDataSet(@Arg('id') id: string, @Arg('patch') patch: DataSetPatch, @Ctx() context: any): Promise<DataSet> {
|
37
37
|
const { domain, user, tx } = context.state
|
38
|
+
const dataSetRepo = tx.getRepository(DataSet)
|
38
39
|
|
39
|
-
const
|
40
|
-
const dataSet = await repository.findOne({
|
40
|
+
const dataSet = await dataSetRepo.findOne({
|
41
41
|
where: { domain, id }
|
42
42
|
})
|
43
43
|
|
44
|
-
const result = await
|
44
|
+
const result = await dataSetRepo.save({
|
45
45
|
...dataSet,
|
46
46
|
...patch,
|
47
47
|
updater: user
|
@@ -60,11 +60,11 @@ export class DataSetMutation {
|
|
60
60
|
@Ctx() context: any
|
61
61
|
): Promise<DataSet[]> {
|
62
62
|
const { domain, user, tx } = context.state
|
63
|
+
const dataSetRepo = tx.getRepository(DataSet)
|
63
64
|
|
64
65
|
let results = []
|
65
66
|
const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
|
66
67
|
const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
|
67
|
-
const dataSetRepo = tx.getRepository(DataSet)
|
68
68
|
|
69
69
|
if (_createRecords.length > 0) {
|
70
70
|
const cuFlag = '+'
|
@@ -80,7 +80,12 @@ export class DataSetMutation {
|
|
80
80
|
|
81
81
|
await this._createAttachment(context, newRecord.reportTemplate, { refId: result.id, cuFlag })
|
82
82
|
|
83
|
-
results.push({
|
83
|
+
results.push({
|
84
|
+
...(await dataSetRepo.findOne(result.id, {
|
85
|
+
relations: ['domain', 'creator', 'updater', 'supervisoryRole', 'entryRole']
|
86
|
+
})),
|
87
|
+
cuFlag
|
88
|
+
})
|
84
89
|
}
|
85
90
|
}
|
86
91
|
|
@@ -98,7 +103,12 @@ export class DataSetMutation {
|
|
98
103
|
|
99
104
|
await this._createAttachment(context, newRecord.reportTemplate, { refId: result.id, cuFlag })
|
100
105
|
|
101
|
-
results.push({
|
106
|
+
results.push({
|
107
|
+
...(await dataSetRepo.findOne(result.id, {
|
108
|
+
relations: ['domain', 'creator', 'updater', 'supervisoryRole', 'entryRole']
|
109
|
+
})),
|
110
|
+
cuFlag
|
111
|
+
})
|
102
112
|
}
|
103
113
|
}
|
104
114
|
|
@@ -139,20 +149,15 @@ export class DataSetMutation {
|
|
139
149
|
@Arg('dataSets', type => [DataSetPatch]) dataSets: DataSet[],
|
140
150
|
@Ctx() context: any
|
141
151
|
): Promise<boolean> {
|
142
|
-
const tx
|
143
|
-
const
|
152
|
+
const { domain, tx } = context.state
|
153
|
+
const dataSetRepo = tx.getRepository(DataSet)
|
154
|
+
|
144
155
|
await Promise.all(
|
145
156
|
dataSets.map(async (dataSet: DataSet) => {
|
146
|
-
const createdDataSet: DataSet = await
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
dataItem.domain = domain
|
151
|
-
dataItem.dataSet = createdDataSet
|
152
|
-
return dataItem
|
153
|
-
})
|
154
|
-
)
|
155
|
-
}
|
157
|
+
const createdDataSet: DataSet = await dataSetRepo.save({
|
158
|
+
domain,
|
159
|
+
...dataSet
|
160
|
+
})
|
156
161
|
})
|
157
162
|
)
|
158
163
|
|
@@ -164,69 +169,37 @@ export class DataSetMutation {
|
|
164
169
|
@Mutation(returns => [DataSet], { description: 'To copy multiple data-sets' })
|
165
170
|
async copyDataSets(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<DataSet[]> {
|
166
171
|
const { domain, user, tx } = context.state
|
172
|
+
const dataSetRepo = tx.getRepository(DataSet)
|
167
173
|
|
168
|
-
const originals = await
|
174
|
+
const originals = await dataSetRepo.find({
|
169
175
|
where: {
|
170
176
|
id: In(ids),
|
171
177
|
domain
|
172
178
|
},
|
173
|
-
relations: ['domain', '
|
179
|
+
relations: ['domain', 'supervisoryRole', 'entryRole']
|
174
180
|
})
|
175
181
|
|
176
182
|
if (originals.length == 0) {
|
177
183
|
return []
|
178
184
|
}
|
179
185
|
|
180
|
-
var newDataItems = []
|
181
|
-
|
182
186
|
var newCopys = originals.map(dataSet => {
|
183
187
|
let dataSetId = crypto.randomUUID()
|
184
|
-
newDataItems.push(
|
185
|
-
...dataSet.dataItems.map(dataItem => {
|
186
|
-
return {
|
187
|
-
dataSet: dataSetId,
|
188
|
-
name: dataItem.name,
|
189
|
-
description: dataItem.description,
|
190
|
-
sequence: dataItem.sequence,
|
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,
|
201
|
-
domain,
|
202
|
-
creator: user,
|
203
|
-
updater: user
|
204
|
-
}
|
205
|
-
})
|
206
|
-
)
|
207
188
|
|
208
189
|
return {
|
190
|
+
...dataSet,
|
209
191
|
id: dataSetId,
|
210
192
|
name: dataSet.name + ' (' + dataSetId + ')',
|
211
|
-
type: dataSet.type,
|
212
|
-
description: dataSet.description,
|
213
193
|
active: false,
|
214
|
-
schedule: dataSet.schedule,
|
215
|
-
timezone: dataSet.timezone,
|
216
|
-
|
217
194
|
domain,
|
218
195
|
creator: user,
|
219
196
|
updater: user
|
220
197
|
}
|
221
198
|
})
|
222
199
|
|
223
|
-
var copiedDataSets = await
|
224
|
-
var copiedDataItems = await tx.getRepository(DataItem).save(newDataItems)
|
200
|
+
var copiedDataSets = await dataSetRepo.save(newCopys)
|
225
201
|
|
226
|
-
return copiedDataSets
|
227
|
-
dataSet.dataItems = copiedDataItems.filter(dataItem => dataItem.dataSet == dataSet.id)
|
228
|
-
return dataSet
|
229
|
-
})
|
202
|
+
return copiedDataSets
|
230
203
|
}
|
231
204
|
|
232
205
|
async _createAttachment(context, attachment, { refId, cuFlag }) {
|
@@ -103,6 +103,11 @@ export class DataSetQuery {
|
|
103
103
|
|
104
104
|
@FieldResolver(type => [DataItem])
|
105
105
|
async dataItems(@Root() dataSet: DataSet): Promise<DataItem[]> {
|
106
|
+
/* TODO this fieldResolver should be removed. This is only for migration temporarily */
|
107
|
+
if (dataSet.dataItems) {
|
108
|
+
return dataSet.dataItems as DataItem[]
|
109
|
+
}
|
110
|
+
|
106
111
|
return await getRepository(DataItem).find({
|
107
112
|
dataSet
|
108
113
|
})
|
@@ -1,8 +1,10 @@
|
|
1
|
+
import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'
|
2
|
+
import GraphQLUpload from 'graphql-upload/GraphQLUpload.js'
|
1
3
|
import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
|
2
|
-
import { FileUpload, GraphQLUpload } from 'graphql-upload'
|
3
4
|
|
4
5
|
import { ObjectRef, ScalarObject } from '@things-factory/shell'
|
5
6
|
|
7
|
+
import { DataItemPatch } from './data-item-type'
|
6
8
|
import { DataSet, DataSetEntryType, DataSetMonitorType, DataSetReportType } from './data-set'
|
7
9
|
|
8
10
|
@InputType()
|
@@ -31,6 +33,9 @@ export class NewDataSet {
|
|
31
33
|
@Field(type => ScalarObject, { nullable: true })
|
32
34
|
partitionKeys?: ScalarObject
|
33
35
|
|
36
|
+
@Field(type => [DataItemPatch], { nullable: true })
|
37
|
+
dataItems?: DataItemPatch[]
|
38
|
+
|
34
39
|
@Field({ nullable: true })
|
35
40
|
schedule?: string
|
36
41
|
|
@@ -88,6 +93,9 @@ export class DataSetPatch {
|
|
88
93
|
@Field(type => ScalarObject, { nullable: true })
|
89
94
|
partitionKeys?: ScalarObject
|
90
95
|
|
96
|
+
@Field(type => [DataItemPatch], { nullable: true })
|
97
|
+
dataItems?: DataItemPatch[]
|
98
|
+
|
91
99
|
@Field({ nullable: true })
|
92
100
|
schedule?: string
|
93
101
|
|
@@ -5,16 +5,16 @@ import {
|
|
5
5
|
Entity,
|
6
6
|
Index,
|
7
7
|
ManyToOne,
|
8
|
-
OneToMany,
|
9
8
|
PrimaryGeneratedColumn,
|
10
9
|
RelationId,
|
11
|
-
UpdateDateColumn
|
10
|
+
UpdateDateColumn,
|
11
|
+
VersionColumn
|
12
12
|
} from 'typeorm'
|
13
13
|
|
14
14
|
import { Role, User } from '@things-factory/auth-base'
|
15
15
|
import { Domain, ScalarObject } from '@things-factory/shell'
|
16
16
|
|
17
|
-
import { DataItem } from '
|
17
|
+
import { DataItem } from './data-item-type'
|
18
18
|
|
19
19
|
export enum DataSetEntryType {
|
20
20
|
Generated = 'generated',
|
@@ -77,6 +77,10 @@ export class DataSet {
|
|
77
77
|
@Field({ nullable: true })
|
78
78
|
description?: string
|
79
79
|
|
80
|
+
@VersionColumn({ nullable: true, default: 1 })
|
81
|
+
@Field({ nullable: true })
|
82
|
+
version?: number = 1
|
83
|
+
|
80
84
|
@Column({
|
81
85
|
nullable: true
|
82
86
|
})
|
@@ -156,7 +160,7 @@ export class DataSet {
|
|
156
160
|
@Field(type => ScalarObject, { nullable: true })
|
157
161
|
partitionKeys?: ScalarObject
|
158
162
|
|
159
|
-
@
|
163
|
+
@Column('simple-json', { nullable: true })
|
160
164
|
@Field(type => [DataItem], { nullable: true })
|
161
165
|
dataItems: DataItem[]
|
162
166
|
|
@@ -0,0 +1,110 @@
|
|
1
|
+
import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
|
2
|
+
import { getRepository } from 'typeorm'
|
3
|
+
|
4
|
+
import { Attachment } from '@things-factory/attachment-base'
|
5
|
+
import { Role, User } from '@things-factory/auth-base'
|
6
|
+
import { Board } from '@things-factory/board-service'
|
7
|
+
import { Domain, getQueryBuilderFromListParams, ListParam, ScalarDate } from '@things-factory/shell'
|
8
|
+
|
9
|
+
import { DataSetHistory } from './data-set-history'
|
10
|
+
import { DataSetHistoryList } from './data-set-history-type'
|
11
|
+
|
12
|
+
@Resolver(DataSetHistory)
|
13
|
+
export class DataSetHistoryQuery {
|
14
|
+
@Directive('@privilege(category: "data-set-history", privilege: "query", domainOwnerGranted: true)')
|
15
|
+
@Query(returns => DataSetHistory, { description: 'To fetch a DataSetHistory' })
|
16
|
+
async dataSetHistory(
|
17
|
+
@Arg('id') id: string,
|
18
|
+
@Arg('timestamp', type => ScalarDate) timestamp: ScalarDate,
|
19
|
+
@Ctx() context: any
|
20
|
+
): Promise<DataSetHistory> {
|
21
|
+
const { domain } = context.state
|
22
|
+
|
23
|
+
return await getRepository(DataSetHistory).findOne({
|
24
|
+
where: { domain, originalId: id, updatedAt: timestamp }
|
25
|
+
})
|
26
|
+
}
|
27
|
+
|
28
|
+
@Directive('@privilege(category: "data-set-history", privilege: "query", domainOwnerGranted: true)')
|
29
|
+
@Query(returns => DataSetHistoryList, { description: 'To fetch multiple DataSetHistories' })
|
30
|
+
async dataSetHistories(@Args() params: ListParam, @Ctx() context: any): Promise<DataSetHistoryList> {
|
31
|
+
const { domain } = context.state
|
32
|
+
|
33
|
+
const queryBuilder = getQueryBuilderFromListParams({
|
34
|
+
repository: getRepository(DataSetHistory),
|
35
|
+
params,
|
36
|
+
domain,
|
37
|
+
searchables: ['name', 'description', 'supervisoryRole']
|
38
|
+
})
|
39
|
+
|
40
|
+
const [items, total] = await queryBuilder.getManyAndCount()
|
41
|
+
|
42
|
+
return { items, total }
|
43
|
+
}
|
44
|
+
|
45
|
+
@FieldResolver(type => Role)
|
46
|
+
async entryRole(@Root() dataSetHistory: DataSetHistory): Promise<Role> {
|
47
|
+
return (
|
48
|
+
dataSetHistory.entryRole ||
|
49
|
+
(await getRepository(Role).findOne({
|
50
|
+
id: dataSetHistory.entryRoleId
|
51
|
+
}))
|
52
|
+
)
|
53
|
+
}
|
54
|
+
|
55
|
+
@FieldResolver(type => Role)
|
56
|
+
async supervisoryRole(@Root() dataSetHistory: DataSetHistory): Promise<Role> {
|
57
|
+
return (
|
58
|
+
dataSetHistory.supervisoryRole ||
|
59
|
+
(await getRepository(Role).findOne({
|
60
|
+
id: dataSetHistory.supervisoryRoleId
|
61
|
+
}))
|
62
|
+
)
|
63
|
+
}
|
64
|
+
|
65
|
+
@FieldResolver(type => Board, { nullable: true })
|
66
|
+
async entryBoard(@Root() dataSetHistory: DataSetHistory) {
|
67
|
+
if (dataSetHistory.entryType == 'board' && dataSetHistory.entryView) {
|
68
|
+
return await getRepository(Board).findOne({ id: dataSetHistory.entryView })
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
72
|
+
@FieldResolver(type => Board, { nullable: true })
|
73
|
+
async monitorBoard(@Root() dataSetHistory: DataSetHistory) {
|
74
|
+
if (dataSetHistory.monitorType == 'board' && dataSetHistory.monitorView) {
|
75
|
+
return await getRepository(Board).findOne({ id: dataSetHistory.monitorView })
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
@FieldResolver(type => User)
|
80
|
+
async timestamp(@Root() dataSetHistory: DataSetHistory): Promise<User> {
|
81
|
+
return dataSetHistory.updatedAt
|
82
|
+
}
|
83
|
+
|
84
|
+
@FieldResolver(type => Domain)
|
85
|
+
async domain(@Root() dataSetHistory: DataSetHistory): Promise<Domain> {
|
86
|
+
return await getRepository(Domain).findOne(dataSetHistory.domainId)
|
87
|
+
}
|
88
|
+
|
89
|
+
@FieldResolver(type => User)
|
90
|
+
async updater(@Root() dataSetHistory: DataSetHistory): Promise<User> {
|
91
|
+
return await getRepository(User).findOne(dataSetHistory.updaterId)
|
92
|
+
}
|
93
|
+
|
94
|
+
@FieldResolver(type => User)
|
95
|
+
async creator(@Root() dataSetHistory: DataSetHistory): Promise<User> {
|
96
|
+
return await getRepository(User).findOne(dataSetHistory.creatorId)
|
97
|
+
}
|
98
|
+
|
99
|
+
@FieldResolver(type => String)
|
100
|
+
async reportTemplate(@Root() dataSetHistory: DataSetHistory): Promise<string | undefined> {
|
101
|
+
const attachment: Attachment = await getRepository(Attachment).findOne({
|
102
|
+
where: {
|
103
|
+
domain: dataSetHistory.domainId,
|
104
|
+
refBy: `report-${dataSetHistory.originalId}`
|
105
|
+
}
|
106
|
+
})
|
107
|
+
|
108
|
+
return attachment?.path
|
109
|
+
}
|
110
|
+
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { Field, Int, ObjectType } from 'type-graphql'
|
2
|
+
|
3
|
+
import { DataSetHistory } from '../data-set-history/data-set-history'
|
4
|
+
|
5
|
+
@ObjectType()
|
6
|
+
export class DataSetHistoryList {
|
7
|
+
@Field(type => [DataSetHistory])
|
8
|
+
items: DataSetHistory[]
|
9
|
+
|
10
|
+
@Field(type => Int)
|
11
|
+
total: number
|
12
|
+
}
|
@@ -0,0 +1,161 @@
|
|
1
|
+
import { Field, ID, ObjectType } from 'type-graphql'
|
2
|
+
import { Column, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId } from 'typeorm'
|
3
|
+
|
4
|
+
import {
|
5
|
+
HistoryActionColumn,
|
6
|
+
HistoryActionType,
|
7
|
+
HistoryEntityInterface,
|
8
|
+
HistoryOriginalIdColumn
|
9
|
+
} from '@anchan828/typeorm-history'
|
10
|
+
import { Role, User } from '@things-factory/auth-base'
|
11
|
+
import { config } from '@things-factory/env'
|
12
|
+
import { Domain, ScalarObject } from '@things-factory/shell'
|
13
|
+
|
14
|
+
import { DataItem } from '../data-set/data-item-type'
|
15
|
+
import { DataSet, DataSetEntryType, DataSetMonitorType, DataSetReportType } from '../data-set/data-set'
|
16
|
+
|
17
|
+
const ORMCONFIG = config.get('ormconfig', {})
|
18
|
+
const DATABASE_TYPE = ORMCONFIG.type
|
19
|
+
|
20
|
+
@Entity()
|
21
|
+
@Index(
|
22
|
+
'ix_data_set_history_0',
|
23
|
+
(dataSetHistory: DataSetHistory) => [dataSetHistory.originalId, dataSetHistory.version],
|
24
|
+
{ unique: true }
|
25
|
+
)
|
26
|
+
@Index(
|
27
|
+
'ix_data_set_history_1',
|
28
|
+
(dataSetHistory: DataSetHistory) => [dataSetHistory.domain, dataSetHistory.originalId, dataSetHistory.version],
|
29
|
+
{ unique: true }
|
30
|
+
)
|
31
|
+
@ObjectType({ description: 'Entity for DataSetHistory' })
|
32
|
+
export class DataSetHistory implements HistoryEntityInterface<DataSet> {
|
33
|
+
@PrimaryGeneratedColumn('uuid')
|
34
|
+
@Field(type => ID)
|
35
|
+
readonly id: string
|
36
|
+
|
37
|
+
@Column({ default: 1 })
|
38
|
+
@Field({ nullable: true })
|
39
|
+
readonly version: number = 1
|
40
|
+
|
41
|
+
@ManyToOne(type => Domain)
|
42
|
+
@Field({ nullable: true })
|
43
|
+
domain?: Domain
|
44
|
+
|
45
|
+
@RelationId((dataSetHistory: DataSetHistory) => dataSetHistory.domain)
|
46
|
+
domainId?: string
|
47
|
+
|
48
|
+
@Column()
|
49
|
+
@Field()
|
50
|
+
name: string
|
51
|
+
|
52
|
+
@Column({ nullable: true })
|
53
|
+
@Field({ nullable: true })
|
54
|
+
description?: string
|
55
|
+
|
56
|
+
@Column({ nullable: true })
|
57
|
+
@Field({ nullable: true })
|
58
|
+
active?: boolean
|
59
|
+
|
60
|
+
@ManyToOne(type => Role, { nullable: true })
|
61
|
+
@Field(type => Role, { nullable: true })
|
62
|
+
entryRole?: Role
|
63
|
+
|
64
|
+
@RelationId((dataSetHistory: DataSetHistory) => dataSetHistory.entryRole)
|
65
|
+
entryRoleId?: string
|
66
|
+
|
67
|
+
@ManyToOne(type => Role, { nullable: true })
|
68
|
+
@Field(type => Role, { nullable: true })
|
69
|
+
supervisoryRole?: Role
|
70
|
+
|
71
|
+
@RelationId((dataSetHistory: DataSetHistory) => dataSetHistory.supervisoryRole)
|
72
|
+
supervisoryRoleId?: string
|
73
|
+
|
74
|
+
@Column({ nullable: true })
|
75
|
+
@Field({ nullable: true })
|
76
|
+
type?: 'manual' | 'automatic' | string
|
77
|
+
|
78
|
+
@Column({ nullable: true })
|
79
|
+
@Field({ nullable: true })
|
80
|
+
entryType?: DataSetEntryType
|
81
|
+
|
82
|
+
@Column({ nullable: true })
|
83
|
+
@Field({ nullable: true })
|
84
|
+
entryView?: string
|
85
|
+
|
86
|
+
@Column({ nullable: true })
|
87
|
+
@Field({ nullable: true })
|
88
|
+
monitorType?: DataSetMonitorType
|
89
|
+
|
90
|
+
@Column({ nullable: true })
|
91
|
+
@Field({ nullable: true })
|
92
|
+
monitorView?: string
|
93
|
+
|
94
|
+
@Column({ nullable: true })
|
95
|
+
@Field({ nullable: true })
|
96
|
+
reportType?: DataSetReportType
|
97
|
+
|
98
|
+
@Column({ nullable: true })
|
99
|
+
@Field({ nullable: true })
|
100
|
+
reportView?: string
|
101
|
+
|
102
|
+
@Field({ nullable: true })
|
103
|
+
reportTemplate?: string
|
104
|
+
|
105
|
+
@Column({ nullable: true })
|
106
|
+
@Field({ nullable: true })
|
107
|
+
useCase?: string
|
108
|
+
|
109
|
+
@Column('simple-json', { nullable: true })
|
110
|
+
@Field(type => ScalarObject, { nullable: true })
|
111
|
+
partitionKeys?: ScalarObject
|
112
|
+
|
113
|
+
@Column('simple-json', { nullable: true })
|
114
|
+
@Field(type => [DataItem], { nullable: true })
|
115
|
+
dataItems: DataItem[]
|
116
|
+
|
117
|
+
@Column({ nullable: true })
|
118
|
+
@Field({ nullable: true })
|
119
|
+
schedule?: string
|
120
|
+
|
121
|
+
@Column({ nullable: true })
|
122
|
+
@Field({ nullable: true })
|
123
|
+
timezone?: string
|
124
|
+
|
125
|
+
@Column({ nullable: true })
|
126
|
+
@Field({ nullable: true })
|
127
|
+
createdAt?: Date
|
128
|
+
|
129
|
+
@Column({ nullable: true })
|
130
|
+
@Field({ nullable: true })
|
131
|
+
updatedAt?: Date
|
132
|
+
|
133
|
+
@ManyToOne(type => User, { nullable: true })
|
134
|
+
@Field({ nullable: true })
|
135
|
+
creator?: User
|
136
|
+
|
137
|
+
@RelationId((dataSetHistory: DataSetHistory) => dataSetHistory.creator)
|
138
|
+
creatorId?: string
|
139
|
+
|
140
|
+
@ManyToOne(type => User, { nullable: true })
|
141
|
+
@Field({ nullable: true })
|
142
|
+
updater?: User
|
143
|
+
|
144
|
+
@RelationId((dataSetHistory: DataSetHistory) => dataSetHistory.creator)
|
145
|
+
updaterId?: string
|
146
|
+
|
147
|
+
@HistoryOriginalIdColumn({ nullable: true })
|
148
|
+
public originalId!: string
|
149
|
+
|
150
|
+
@HistoryActionColumn({
|
151
|
+
nullable: false,
|
152
|
+
type:
|
153
|
+
DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
|
154
|
+
? 'enum'
|
155
|
+
: DATABASE_TYPE == 'oracle'
|
156
|
+
? 'varchar2'
|
157
|
+
: 'smallint',
|
158
|
+
enum: HistoryActionType
|
159
|
+
})
|
160
|
+
public action!: HistoryActionType
|
161
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { EventSubscriber } from 'typeorm'
|
2
|
+
|
3
|
+
import { HistoryEntitySubscriber } from '@anchan828/typeorm-history'
|
4
|
+
|
5
|
+
import { DataSet } from '../data-set/data-set'
|
6
|
+
import { DataSetHistory } from './data-set-history'
|
7
|
+
|
8
|
+
@EventSubscriber()
|
9
|
+
export class DataSetHistoryEntitySubscriber extends HistoryEntitySubscriber<DataSet, DataSetHistory> {
|
10
|
+
public get entity() {
|
11
|
+
return DataSet
|
12
|
+
}
|
13
|
+
|
14
|
+
public get historyEntity() {
|
15
|
+
return DataSetHistory
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import { DataSetHistory } from './data-set-history'
|
2
|
+
import { DataSetHistoryQuery } from './data-set-history-query'
|
3
|
+
import { DataSetHistoryEntitySubscriber } from './event-subscriber'
|
4
|
+
|
5
|
+
export const entities = [DataSetHistory]
|
6
|
+
export const resolvers = [DataSetHistoryQuery]
|
7
|
+
export const subscribers = [DataSetHistoryEntitySubscriber]
|
package/server/service/index.ts
CHANGED
@@ -1,37 +1,49 @@
|
|
1
|
-
import { entities as DataItemEntities
|
1
|
+
import { entities as DataItemEntities } from './data-item'
|
2
2
|
/* IMPORT ENTITIES AND RESOLVERS */
|
3
3
|
import { entities as DataOocEntities, resolvers as DataOocResolvers } from './data-ooc'
|
4
4
|
import { entities as DataSampleEntities, resolvers as DataSampleResolvers } from './data-sample'
|
5
5
|
import { entities as DataSensorEntities, resolvers as DataSensorResolvers } from './data-sensor'
|
6
6
|
import { entities as DataSetEntities, resolvers as DataSetResolvers } from './data-set'
|
7
|
+
import {
|
8
|
+
entities as DataSetHistoryEntities,
|
9
|
+
resolvers as DataSetHistoryResolvers,
|
10
|
+
subscribers as DataSetHistorySubscribers
|
11
|
+
} from './data-set-history'
|
7
12
|
import { entities as DataSpecEntities, resolvers as DataSpecResolvers } from './data-spec'
|
8
13
|
|
9
14
|
/* EXPORT ENTITY TYPES */
|
10
15
|
export * from './data-ooc/data-ooc'
|
11
16
|
export * from './data-sensor/data-sensor'
|
12
17
|
export * from './data-sample/data-sample'
|
13
|
-
export * from './data-item/data-item'
|
14
18
|
export * from './data-set/data-set'
|
19
|
+
export * from './data-set-history/data-set-history'
|
20
|
+
export * from './data-set/data-item-type'
|
15
21
|
export * from './data-spec/data-spec'
|
16
22
|
|
17
23
|
export const entities = [
|
18
24
|
/* ENTITIES */
|
25
|
+
...DataItemEntities,
|
19
26
|
...DataOocEntities,
|
20
27
|
...DataSensorEntities,
|
21
28
|
...DataSampleEntities,
|
22
|
-
...DataItemEntities,
|
23
29
|
...DataSetEntities,
|
30
|
+
...DataSetHistoryEntities,
|
24
31
|
...DataSpecEntities
|
25
32
|
]
|
26
33
|
|
34
|
+
export const subscribers = [
|
35
|
+
/* SUBSCRIBERS */
|
36
|
+
...DataSetHistorySubscribers
|
37
|
+
]
|
38
|
+
|
27
39
|
export const schema = {
|
28
40
|
resolverClasses: [
|
29
41
|
/* RESOLVER CLASSES */
|
30
42
|
...DataOocResolvers,
|
31
43
|
...DataSensorResolvers,
|
32
44
|
...DataSampleResolvers,
|
33
|
-
...DataItemResolvers,
|
34
45
|
...DataSetResolvers,
|
46
|
+
...DataSetHistoryResolvers,
|
35
47
|
...DataSpecResolvers
|
36
48
|
]
|
37
49
|
}
|
package/translations/en.json
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
"field.report-view": "report view",
|
33
33
|
"field.serial-no": "serial #",
|
34
34
|
"field.spec": "spec",
|
35
|
-
"field.
|
35
|
+
"field.status": "status",
|
36
36
|
"field.supervisory-role": "supervisory role",
|
37
37
|
"field.tag": "tag name",
|
38
38
|
"field.unit": "unit",
|
@@ -40,11 +40,11 @@
|
|
40
40
|
"field.work-date": "work date",
|
41
41
|
"field.work-shift": "work shift",
|
42
42
|
"label.acceptables": "acceptables",
|
43
|
-
"label.critical
|
43
|
+
"label.critical-limits": "critical limits",
|
44
44
|
"label.minimum value": "minimum value",
|
45
45
|
"label.maximum value": "maximum value",
|
46
|
-
"label.pass
|
47
|
-
"label.target
|
46
|
+
"label.pass-limits": "pass limits",
|
47
|
+
"label.target-limits": "target limits",
|
48
48
|
"text.automatically collected": "automatically collected",
|
49
49
|
"text.data sample created successfully": "a data sample created successfully",
|
50
50
|
"text.data ooc updated successfully": "a data ooc updated successfully",
|
@@ -61,4 +61,4 @@
|
|
61
61
|
"title.data-sensor list": "data sensor list",
|
62
62
|
"title.data-set list": "data set list",
|
63
63
|
"title.edit code": "edit code"
|
64
|
-
}
|
64
|
+
}
|