@things-factory/dataset 5.0.0-alpha.13 → 5.0.0-alpha.14

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 (63) hide show
  1. package/client/pages/data-entry-form.js +3 -1
  2. package/client/pages/data-ooc.js +418 -0
  3. package/client/pages/data-sample.js +39 -37
  4. package/client/pages/data-sensor.js +1 -1
  5. package/client/pages/data-set.js +61 -0
  6. package/client/route.js +4 -0
  7. package/dist-server/controllers/data-use-case.js +57 -0
  8. package/dist-server/controllers/data-use-case.js.map +1 -0
  9. package/dist-server/controllers/index.js +17 -0
  10. package/dist-server/controllers/index.js.map +1 -1
  11. package/dist-server/index.js +1 -0
  12. package/dist-server/index.js.map +1 -1
  13. package/dist-server/service/data-item/data-item-type.js +6 -6
  14. package/dist-server/service/data-item/data-item-type.js.map +1 -1
  15. package/dist-server/service/data-item/data-item.js +1 -1
  16. package/dist-server/service/data-item/data-item.js.map +1 -1
  17. package/dist-server/service/data-ooc/data-ooc-mutation.js +130 -0
  18. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
  19. package/dist-server/service/data-ooc/data-ooc-query.js +89 -0
  20. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
  21. package/dist-server/service/data-ooc/data-ooc-type.js +99 -0
  22. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
  23. package/dist-server/service/data-ooc/data-ooc.js +218 -0
  24. package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
  25. package/dist-server/service/data-ooc/index.js +9 -0
  26. package/dist-server/service/data-ooc/index.js.map +1 -0
  27. package/dist-server/service/data-sample/data-sample-mutation.js +28 -88
  28. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
  29. package/dist-server/service/data-sample/data-sample-type.js +5 -43
  30. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  31. package/dist-server/service/data-sample/data-sample.js +20 -6
  32. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  33. package/dist-server/service/data-set/data-set-mutation.js +1 -2
  34. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  35. package/dist-server/service/data-set/data-set-type.js +19 -3
  36. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  37. package/dist-server/service/data-set/data-set.js +24 -12
  38. package/dist-server/service/data-set/data-set.js.map +1 -1
  39. package/dist-server/service/index.js +6 -2
  40. package/dist-server/service/index.js.map +1 -1
  41. package/package.json +14 -14
  42. package/server/controllers/data-use-case.ts +85 -0
  43. package/server/controllers/index.ts +1 -0
  44. package/server/index.ts +1 -0
  45. package/server/service/data-item/data-item-type.ts +3 -4
  46. package/server/service/data-item/data-item.ts +1 -1
  47. package/server/service/data-ooc/data-ooc-mutation.ts +117 -0
  48. package/server/service/data-ooc/data-ooc-query.ts +45 -0
  49. package/server/service/data-ooc/data-ooc-type.ts +62 -0
  50. package/server/service/data-ooc/data-ooc.ts +188 -0
  51. package/server/service/data-ooc/index.ts +6 -0
  52. package/server/service/data-sample/data-sample-mutation.ts +30 -95
  53. package/server/service/data-sample/data-sample-type.ts +3 -31
  54. package/server/service/data-sample/data-sample.ts +22 -7
  55. package/server/service/data-set/data-set-mutation.ts +1 -4
  56. package/server/service/data-set/data-set-type.ts +15 -4
  57. package/server/service/data-set/data-set.ts +18 -9
  58. package/server/service/index.ts +6 -2
  59. package/things-factory.config.js +4 -0
  60. package/translations/en.json +10 -1
  61. package/translations/ko.json +10 -1
  62. package/translations/ms.json +10 -1
  63. package/translations/zh.json +10 -1
@@ -0,0 +1,188 @@
1
+ import {
2
+ Column,
3
+ CreateDateColumn,
4
+ Entity,
5
+ Index,
6
+ JoinColumn,
7
+ ManyToOne,
8
+ OneToOne,
9
+ PrimaryGeneratedColumn,
10
+ RelationId,
11
+ UpdateDateColumn
12
+ } from 'typeorm'
13
+ import { Domain, ScalarObject } from '@things-factory/shell'
14
+ import { Field, ID, Int, ObjectType, registerEnumType } from 'type-graphql'
15
+
16
+ import { DataSample } from '../data-sample/data-sample'
17
+ import { DataSet } from '../data-set/data-set'
18
+ import { User } from '@things-factory/auth-base'
19
+ import { config } from '@things-factory/env'
20
+
21
+ const ORMCONFIG = config.get('ormconfig', {})
22
+ const DATABASE_TYPE = ORMCONFIG.type
23
+
24
+ export enum DataOocStatus {
25
+ CREATED = 'CREATED',
26
+ REVIEWED = 'REVIEWED',
27
+ CORRECTED = 'CORRECTED',
28
+ SUBMITTED = 'SUBMITTED',
29
+ APPROVED = 'APPROVED',
30
+ REJECTED = 'REJECTED'
31
+ }
32
+
33
+ registerEnumType(DataOocStatus, {
34
+ name: 'DataOocStatus',
35
+ description: 'Out of control data corrective action process progress status'
36
+ })
37
+
38
+ @Entity()
39
+ @Index('ix_data_ooc_0', (dataOoc: DataOoc) => [dataOoc.domain, dataOoc.dataSet], { unique: false })
40
+ @Index('ix_data_ooc_1', (dataOoc: DataOoc) => [dataOoc.domain, dataOoc.dataSample], { unique: true })
41
+ @Index('ix_data_ooc_2', (dataOoc: DataOoc) => [dataOoc.domain, dataOoc.collectedAt], { unique: false })
42
+ @ObjectType({ description: 'Entity for Out of control data' })
43
+ export class DataOoc {
44
+ @PrimaryGeneratedColumn('uuid')
45
+ @Field(type => ID)
46
+ readonly id: string
47
+
48
+ @ManyToOne(type => Domain)
49
+ @Field({ nullable: true })
50
+ domain?: Domain
51
+
52
+ @RelationId((dataOoc: DataOoc) => dataOoc.domain)
53
+ domainId?: string
54
+
55
+ @Column()
56
+ @Field()
57
+ name: string
58
+
59
+ @Column({
60
+ nullable: true
61
+ })
62
+ @Field({ nullable: true })
63
+ description?: string
64
+
65
+ @ManyToOne(type => DataSet)
66
+ @Field(type => DataSet, { nullable: true })
67
+ dataSet?: DataSet
68
+
69
+ @RelationId((dataOoc: DataOoc) => dataOoc.dataSet)
70
+ dataSetId?: string
71
+
72
+ @OneToOne(type => DataSample)
73
+ @JoinColumn()
74
+ @Field(type => DataSample, { nullable: true })
75
+ dataSample?: DataSample
76
+
77
+ @RelationId((dataOoc: DataOoc) => dataOoc.dataSample)
78
+ dataSampleId?: string
79
+
80
+ @Column({
81
+ nullable: true
82
+ })
83
+ @Field({ nullable: true })
84
+ ooc?: boolean
85
+
86
+ @Column({
87
+ nullable: true
88
+ })
89
+ @Field({ nullable: true })
90
+ oos?: boolean
91
+
92
+ @Column({
93
+ nullable: true
94
+ })
95
+ @Field({ nullable: true })
96
+ state?: DataOocStatus
97
+
98
+ @Column({
99
+ nullable: true,
100
+ type:
101
+ DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
102
+ ? 'longtext'
103
+ : DATABASE_TYPE == 'oracle'
104
+ ? 'clob'
105
+ : 'varchar'
106
+ })
107
+ @Field({ nullable: true })
108
+ correctiveAction?: string
109
+
110
+ @Column({
111
+ nullable: true
112
+ })
113
+ @Field({ nullable: true })
114
+ type?: string
115
+
116
+ @Column('simple-json', { nullable: true })
117
+ @Field(type => ScalarObject, { nullable: true })
118
+ partitionKeys?: ScalarObject
119
+
120
+ @Column('simple-json', { nullable: true })
121
+ @Field(type => ScalarObject, { nullable: true })
122
+ data?: ScalarObject
123
+
124
+ @Column('simple-json', { nullable: true })
125
+ @Field(type => ScalarObject, { nullable: true })
126
+ spec?: ScalarObject
127
+
128
+ @Column({
129
+ nullable: true,
130
+ type:
131
+ DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
132
+ ? 'longtext'
133
+ : DATABASE_TYPE == 'oracle'
134
+ ? 'clob'
135
+ : 'varchar'
136
+ })
137
+ @Field({ nullable: true })
138
+ rawData?: string
139
+
140
+ @Column({
141
+ nullable: true
142
+ })
143
+ @Field({ nullable: true })
144
+ source?: string
145
+
146
+ @Column({ nullable: true })
147
+ @Field({ nullable: true })
148
+ collectedAt?: Date
149
+
150
+ @Column({ nullable: true })
151
+ @Field({ nullable: true })
152
+ correctedAt?: Date
153
+
154
+ @CreateDateColumn()
155
+ @Field({ nullable: true })
156
+ createdAt?: Date
157
+
158
+ @UpdateDateColumn()
159
+ @Field({ nullable: true })
160
+ updatedAt?: Date
161
+
162
+ @ManyToOne(type => User, {
163
+ nullable: true
164
+ })
165
+ @Field({ nullable: true })
166
+ corrector?: User
167
+
168
+ @RelationId((dataOoc: DataOoc) => dataOoc.corrector)
169
+ correctorId?: string
170
+
171
+ @ManyToOne(type => User, {
172
+ nullable: true
173
+ })
174
+ @Field({ nullable: true })
175
+ creator?: User
176
+
177
+ @RelationId((dataOoc: DataOoc) => dataOoc.creator)
178
+ creatorId?: string
179
+
180
+ @ManyToOne(type => User, {
181
+ nullable: true
182
+ })
183
+ @Field({ nullable: true })
184
+ updater?: User
185
+
186
+ @RelationId((dataOoc: DataOoc) => dataOoc.creator)
187
+ updaterId?: string
188
+ }
@@ -0,0 +1,6 @@
1
+ import { DataOoc } from './data-ooc'
2
+ import { DataOocMutation } from './data-ooc-mutation'
3
+ import { DataOocQuery } from './data-ooc-query'
4
+
5
+ export const entities = [DataOoc]
6
+ export const resolvers = [DataOocQuery, DataOocMutation]
@@ -1,12 +1,13 @@
1
1
  import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
- import { In } from 'typeorm'
3
2
 
4
3
  import { DataItem } from '../data-item/data-item'
5
4
  import { DataSet } from '../data-set/data-set'
6
5
  import { DataSample } from './data-sample'
7
- import { DataSamplePatch, NewDataSample } from './data-sample-type'
6
+ import { NewDataSample } from './data-sample-type'
8
7
 
9
8
  import moment from 'moment'
9
+ import { DataUseCase } from '../../controllers'
10
+ import { DataOoc, DataOocStatus } from '../data-ooc/data-ooc'
10
11
 
11
12
  const debug = require('debug')('things-factory:dataset:data-sample:data-sample-mutation')
12
13
 
@@ -43,7 +44,9 @@ export class DataSampleMutation {
43
44
  async createDataSample(@Arg('dataSample') dataSample: NewDataSample, @Ctx() context: any): Promise<DataSample> {
44
45
  const { domain, user, tx } = context.state
45
46
 
46
- const dataSet = await tx.getRepository(DataSet).findOne({ id: dataSample.dataSetId })
47
+ const dataSet = await tx.getRepository(DataSet).findOne({
48
+ where: { id: dataSample.dataSet.id }
49
+ })
47
50
  const dataItems = await tx.getRepository(DataItem).find({
48
51
  where: {
49
52
  domain,
@@ -74,113 +77,45 @@ export class DataSampleMutation {
74
77
  partitionKeys = formatDate(partitionKeys, moment(collectedAt).utc())
75
78
  partitionKeys = replaceVariables(partitionKeys, {
76
79
  domain: domain.subdomain,
77
- dataSetId: dataSample.dataSetId,
80
+ dataSetId: dataSample.dataSet.id,
78
81
  ...dataSample.data
79
82
  })
80
83
 
81
- return await tx.getRepository(DataSample).save({
84
+ const { ooc, oos } = DataUseCase.evaluate(dataSet, dataItems, dataSample.data) || {}
85
+
86
+ const result = await tx.getRepository(DataSample).save({
82
87
  name: dataSet.name,
83
88
  description: dataSet.description,
84
89
  ...dataSample,
85
90
  domain,
86
91
  partitionKeys,
87
92
  spec,
93
+ ooc,
94
+ oos,
88
95
  collectedAt,
89
96
  creator: user,
90
97
  updater: user
91
98
  })
92
- }
93
-
94
- @Directive('@privilege(category: "data-sample", privilege: "mutation", domainOwnerGranted: true)')
95
- @Directive('@transaction')
96
- @Mutation(returns => DataSample, { description: 'To modify data sample information' })
97
- async updateDataSample(
98
- @Arg('id') id: string,
99
- @Arg('patch') patch: DataSamplePatch,
100
- @Ctx() context: any
101
- ): Promise<DataSample> {
102
- const { domain, user, tx } = context.state
103
-
104
- const repository = tx.getRepository(DataSample)
105
- const dataSample = await repository.findOne({
106
- where: { domain, id }
107
- })
108
-
109
- return await repository.save({
110
- ...dataSample,
111
- ...patch,
112
- updater: user
113
- })
114
- }
115
-
116
- @Directive('@privilege(category: "data-sample", privilege: "mutation", domainOwnerGranted: true)')
117
- @Directive('@transaction')
118
- @Mutation(returns => [DataSample], { description: "To modify multiple data samples' information" })
119
- async updateMultipleDataSample(
120
- @Arg('patches', type => [DataSamplePatch]) patches: DataSamplePatch[],
121
- @Ctx() context: any
122
- ): Promise<DataSample[]> {
123
- const { domain, user, tx } = context.state
124
-
125
- let results = []
126
- const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
127
- const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
128
- const dataSampleRepo = tx.getRepository(DataSample)
129
-
130
- if (_createRecords.length > 0) {
131
- for (let i = 0; i < _createRecords.length; i++) {
132
- const newRecord = _createRecords[i]
133
-
134
- const result = await dataSampleRepo.save({
135
- ...newRecord,
136
- domain,
137
- creator: user,
138
- updater: user
139
- })
140
99
 
141
- results.push({ ...result, cuFlag: '+' })
142
- }
143
- }
144
-
145
- if (_updateRecords.length > 0) {
146
- for (let i = 0; i < _updateRecords.length; i++) {
147
- const newRecord = _updateRecords[i]
148
- const dataSample = await dataSampleRepo.findOne(newRecord.id)
149
-
150
- const result = await dataSampleRepo.save({
151
- ...dataSample,
152
- ...newRecord,
153
- updater: user
154
- })
155
-
156
- results.push({ ...result, cuFlag: 'M' })
157
- }
100
+ if (ooc || oos) {
101
+ await tx.getRepository(DataOoc).save({
102
+ name: dataSet.name,
103
+ description: dataSet.description,
104
+ dataSet,
105
+ dataSample: result,
106
+ data: dataSample.data,
107
+ domain,
108
+ partitionKeys,
109
+ spec,
110
+ ooc,
111
+ oos,
112
+ state: DataOocStatus.CREATED,
113
+ collectedAt,
114
+ creator: user,
115
+ updater: user
116
+ })
158
117
  }
159
118
 
160
- return results
161
- }
162
-
163
- @Directive('@privilege(category: "data-sample", privilege: "mutation", domainOwnerGranted: true)')
164
- @Directive('@transaction')
165
- @Mutation(returns => Boolean, { description: 'To delete a data sample' })
166
- async deleteDataSample(@Arg('id') id: string, @Ctx() context: any): Promise<boolean> {
167
- const { domain, tx } = context.state
168
-
169
- await tx.getRepository(DataSample).delete({ domain, id })
170
- return true
171
- }
172
-
173
- @Directive('@privilege(category: "data-sample", privilege: "mutation", domainOwnerGranted: true)')
174
- @Directive('@transaction')
175
- @Mutation(returns => Boolean, { description: 'To delete multiple data samples' })
176
- async deleteDataSamples(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<boolean> {
177
- const { domain, tx } = context.state
178
-
179
- await tx.getRepository(DataSample).delete({
180
- domain,
181
- id: In(ids)
182
- })
183
-
184
- return true
119
+ return result
185
120
  }
186
121
  }
@@ -1,6 +1,5 @@
1
1
  import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
-
3
- import { ScalarObject } from '@things-factory/shell'
2
+ import { ObjectRef, ScalarObject } from '@things-factory/shell'
4
3
 
5
4
  import { DataSample } from './data-sample'
6
5
 
@@ -12,8 +11,8 @@ export class NewDataSample {
12
11
  @Field({ nullable: true })
13
12
  description?: string
14
13
 
15
- @Field({ nullable: true })
16
- dataSetId?: string
14
+ @Field(type => ObjectRef, { nullable: true })
15
+ dataSet?: ObjectRef
17
16
 
18
17
  @Field(type => ScalarObject, { nullable: true })
19
18
  data?: ScalarObject
@@ -28,33 +27,6 @@ export class NewDataSample {
28
27
  collectedAt?: Date
29
28
  }
30
29
 
31
- @InputType()
32
- export class DataSamplePatch {
33
- @Field(type => ID, { nullable: true })
34
- id?: string
35
-
36
- @Field({ nullable: true })
37
- name?: string
38
-
39
- @Field({ nullable: true })
40
- description?: string
41
-
42
- @Field({ nullable: true })
43
- dataSetId?: string
44
-
45
- @Field(type => ScalarObject, { nullable: true })
46
- data?: ScalarObject
47
-
48
- @Field({ nullable: true })
49
- rawData?: string
50
-
51
- @Field({ nullable: true })
52
- source?: string
53
-
54
- @Field()
55
- cuFlag: string
56
- }
57
-
58
30
  @ObjectType()
59
31
  export class DataSampleList {
60
32
  @Field(type => [DataSample])
@@ -1,4 +1,3 @@
1
- import { Field, ID, ObjectType } from 'type-graphql'
2
1
  import {
3
2
  Column,
4
3
  CreateDateColumn,
@@ -9,17 +8,22 @@ import {
9
8
  RelationId,
10
9
  UpdateDateColumn
11
10
  } from 'typeorm'
12
-
13
- import { User } from '@things-factory/auth-base'
14
- import { config } from '@things-factory/env'
15
11
  import { Domain, ScalarObject } from '@things-factory/shell'
12
+ import { Field, ID, ObjectType } from 'type-graphql'
16
13
 
17
14
  import { DataSet } from '../data-set/data-set'
15
+ import { User } from '@things-factory/auth-base'
16
+ import { config } from '@things-factory/env'
18
17
 
19
18
  const ORMCONFIG = config.get('ormconfig', {})
20
19
  const DATABASE_TYPE = ORMCONFIG.type
21
20
  @Entity()
22
21
  @Index('ix_data_sample_0', (dataSample: DataSample) => [dataSample.domain, dataSample.dataSet], { unique: false })
22
+ @Index(
23
+ 'ix_data_sample_2',
24
+ (dataSample: DataSample) => [dataSample.domain, dataSample.dataSet, dataSample.collectedAt],
25
+ { unique: false }
26
+ )
23
27
  @ObjectType({ description: 'Entity for DataSample' })
24
28
  export class DataSample {
25
29
  @PrimaryGeneratedColumn('uuid')
@@ -53,12 +57,11 @@ export class DataSample {
53
57
  @Field(type => ScalarObject, { nullable: true })
54
58
  partitionKeys?: ScalarObject
55
59
 
56
- @ManyToOne(type => DataSet, dataSet => dataSet.dataSamples)
57
- @Field(type => DataSet, { nullable: true })
60
+ @ManyToOne(type => DataSet)
61
+ @Field(type => DataSet, { nullable: false })
58
62
  dataSet?: DataSet
59
63
 
60
64
  @RelationId((dataSample: DataSample) => dataSample.dataSet)
61
- @Field({ nullable: true })
62
65
  dataSetId?: string
63
66
 
64
67
  @Column('simple-json', { nullable: true })
@@ -87,6 +90,18 @@ export class DataSample {
87
90
  @Field({ nullable: true })
88
91
  source?: string
89
92
 
93
+ @Column({
94
+ nullable: true
95
+ })
96
+ @Field({ nullable: true })
97
+ ooc?: boolean
98
+
99
+ @Column({
100
+ nullable: true
101
+ })
102
+ @Field({ nullable: true })
103
+ oos?: boolean
104
+
90
105
  @Column({ nullable: true })
91
106
  @Field({ nullable: true })
92
107
  collectedAt?: Date
@@ -200,10 +200,7 @@ export class DataSetMutation {
200
200
 
201
201
  return copiedDataSets.map(dataSet => {
202
202
  dataSet.dataItems = copiedDataItems.filter(dataItem => dataItem.dataSet == dataSet.id)
203
- return {
204
- ...dataSet,
205
- state: 'UNLOADED' // DataSetInstanceStatus.UNLOADED
206
- }
203
+ return dataSet
207
204
  })
208
205
  }
209
206
  }
@@ -1,6 +1,5 @@
1
1
  import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
-
3
- import { ScalarObject } from '@things-factory/shell'
2
+ import { ObjectRef, ScalarObject } from '@things-factory/shell'
4
3
 
5
4
  import { DataSet } from './data-set'
6
5
 
@@ -12,11 +11,17 @@ export class NewDataSet {
12
11
  @Field({ nullable: true })
13
12
  description?: string
14
13
 
14
+ @Field(type => ObjectRef, { nullable: true })
15
+ supervisoryRole?: ObjectRef
16
+
15
17
  @Field({ nullable: true })
16
18
  active?: boolean
17
19
 
18
20
  @Field({ nullable: true })
19
- type?: string
21
+ type?: 'manual' | 'automatic' | string
22
+
23
+ @Field({ nullable: true })
24
+ useCase?: string
20
25
 
21
26
  @Field(type => ScalarObject, { nullable: true })
22
27
  partitionKeys?: ScalarObject
@@ -39,11 +44,17 @@ export class DataSetPatch {
39
44
  @Field({ nullable: true })
40
45
  description?: string
41
46
 
47
+ @Field(type => ObjectRef, { nullable: true })
48
+ supervisoryRole?: ObjectRef
49
+
42
50
  @Field({ nullable: true })
43
51
  active?: boolean
44
52
 
45
53
  @Field({ nullable: true })
46
- type?: string
54
+ type?: 'manual' | 'automatic' | string
55
+
56
+ @Field({ nullable: true })
57
+ useCase?: string
47
58
 
48
59
  @Field(type => ScalarObject, { nullable: true })
49
60
  partitionKeys?: ScalarObject
@@ -1,4 +1,3 @@
1
- import { Field, ID, ObjectType } from 'type-graphql'
2
1
  import {
3
2
  Column,
4
3
  CreateDateColumn,
@@ -10,12 +9,11 @@ import {
10
9
  RelationId,
11
10
  UpdateDateColumn
12
11
  } from 'typeorm'
13
-
14
- import { User } from '@things-factory/auth-base'
15
12
  import { Domain, ScalarObject } from '@things-factory/shell'
13
+ import { Field, ID, ObjectType } from 'type-graphql'
14
+ import { Role, User } from '@things-factory/auth-base'
16
15
 
17
16
  import { DataItem } from '../data-item/data-item'
18
- import { DataSample } from '../data-sample/data-sample'
19
17
 
20
18
  @Entity()
21
19
  @Index('ix_data_set_0', (dataSet: DataSet) => [dataSet.domain, dataSet.name], { unique: true })
@@ -48,11 +46,26 @@ export class DataSet {
48
46
  @Field({ nullable: true })
49
47
  active?: boolean
50
48
 
49
+ @ManyToOne(type => Role, {
50
+ nullable: true
51
+ })
52
+ @Field({ nullable: true })
53
+ supervisoryRole?: Role
54
+
55
+ @RelationId((dataSet: DataSet) => dataSet.supervisoryRole)
56
+ supervisoryRoleId?: string
57
+
51
58
  @Column({
52
59
  nullable: true
53
60
  })
54
61
  @Field({ nullable: true })
55
- type?: string
62
+ type?: 'manual' | 'automatic' | string
63
+
64
+ @Column({
65
+ nullable: true
66
+ })
67
+ @Field({ nullable: true })
68
+ useCase?: string
56
69
 
57
70
  @Column('simple-json', { nullable: true })
58
71
  @Field(type => ScalarObject, { nullable: true })
@@ -68,10 +81,6 @@ export class DataSet {
68
81
  @Field(type => [DataItem], { nullable: true })
69
82
  dataItems: DataItem[]
70
83
 
71
- @OneToMany(type => DataSample, dataSample => dataSample.dataSet)
72
- @Field(type => [DataSample], { nullable: true })
73
- dataSamples: DataSample[]
74
-
75
84
  @Column({
76
85
  nullable: true
77
86
  })
@@ -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,
@@ -15,6 +15,10 @@ export default {
15
15
  {
16
16
  tagname: 'data-sample-page',
17
17
  page: 'data-sample'
18
+ },
19
+ {
20
+ tagname: 'data-ooc-page',
21
+ page: 'data-ooc'
18
22
  }
19
23
  ],
20
24
  bootstrap
@@ -1,10 +1,16 @@
1
1
  {
2
2
  "field.appliance": "appliance",
3
3
  "field.collected_at": "collected at",
4
+ "field.corrective-action": "corrective action",
5
+ "field.corrector": "corrector",
6
+ "field.corrected-at": "corrected at",
4
7
  "field.data": "data",
5
- "field.dataSet": "data set",
8
+ "field.data-sample": "data sample",
9
+ "field.data-set": "data set",
6
10
  "field.device-id": "device id",
7
11
  "field.netmask": "network mask",
12
+ "field.oos": "out of critical limit",
13
+ "field.ooc": "out of control limit",
8
14
  "field.options": "options",
9
15
  "field.partition-keys": "partition keys",
10
16
  "field.quota": "sampling #",
@@ -12,8 +18,11 @@
12
18
  "field.ref-by": "ref. by",
13
19
  "field.serial-no": "serial #",
14
20
  "field.spec": "spec",
21
+ "field.state": "state",
22
+ "field.supervisory-role": "supervisory role",
15
23
  "field.tag": "tag name",
16
24
  "field.unit": "unit",
25
+ "field.use-case": "use case",
17
26
  "text.data sample created successfully": "a data sample created successfully",
18
27
  "title.data-entry-form": "data entry form",
19
28
  "title.data-item list": "data item list",