@things-factory/dataset 5.0.0-zeta.2 → 5.0.0-zeta.20

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 (90) hide show
  1. package/client/bootstrap.js +2 -3
  2. package/client/{pages/data-entry → components}/data-entry-form.js +1 -1
  3. package/client/index.js +1 -0
  4. package/client/pages/data-entry/data-entry-list-page.js +2 -3
  5. package/client/pages/data-ooc/data-ooc-list-page.js +13 -18
  6. package/client/pages/data-ooc/data-ooc-view.js +19 -14
  7. package/client/pages/data-report/data-report-list-page.js +1 -2
  8. package/client/pages/data-sample/data-sample-list-page.js +12 -13
  9. package/client/pages/data-sample/data-sample-view.js +3 -2
  10. package/client/pages/data-sensor/data-sensor-list-page.js +1 -1
  11. package/client/pages/data-set/data-item-list.js +32 -98
  12. package/client/pages/data-set/data-set-list-page.js +2 -3
  13. package/config/config.development.js +1 -1
  14. package/config/config.production.js +13 -1
  15. package/dist-server/controllers/create-data-sample.js +10 -44
  16. package/dist-server/controllers/create-data-sample.js.map +1 -1
  17. package/dist-server/controllers/data-use-case.js +11 -5
  18. package/dist-server/controllers/data-use-case.js.map +1 -1
  19. package/dist-server/controllers/index.js +1 -1
  20. package/dist-server/controllers/index.js.map +1 -1
  21. package/dist-server/service/data-item/index.js +1 -4
  22. package/dist-server/service/data-item/index.js.map +1 -1
  23. package/dist-server/service/data-ooc/data-ooc-query.js +15 -10
  24. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -1
  25. package/dist-server/service/data-ooc/data-ooc-type.js +4 -0
  26. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -1
  27. package/dist-server/service/data-ooc/data-ooc.js +11 -14
  28. package/dist-server/service/data-ooc/data-ooc.js.map +1 -1
  29. package/dist-server/service/data-sample/data-sample-query.js +18 -0
  30. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  31. package/dist-server/service/data-sample/data-sample-type.js +4 -0
  32. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  33. package/dist-server/service/data-sample/data-sample.js +12 -3
  34. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  35. package/dist-server/service/{data-item → data-set}/data-item-type.js +60 -33
  36. package/dist-server/service/data-set/data-item-type.js.map +1 -0
  37. package/dist-server/service/data-set/data-set-mutation.js +21 -61
  38. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  39. package/dist-server/service/data-set/data-set-query.js +4 -0
  40. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  41. package/dist-server/service/data-set/data-set-type.js +10 -1
  42. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  43. package/dist-server/service/data-set/data-set.js +11 -3
  44. package/dist-server/service/data-set/data-set.js.map +1 -1
  45. package/dist-server/service/data-set-history/data-set-history-query.js +173 -0
  46. package/dist-server/service/data-set-history/data-set-history-query.js.map +1 -0
  47. package/dist-server/service/data-set-history/data-set-history-type.js +29 -0
  48. package/dist-server/service/data-set-history/data-set-history-type.js.map +1 -0
  49. package/dist-server/service/data-set-history/data-set-history.js +196 -0
  50. package/dist-server/service/data-set-history/data-set-history.js.map +1 -0
  51. package/dist-server/service/data-set-history/event-subscriber.js +26 -0
  52. package/dist-server/service/data-set-history/event-subscriber.js.map +1 -0
  53. package/dist-server/service/data-set-history/index.js +10 -0
  54. package/dist-server/service/data-set-history/index.js.map +1 -0
  55. package/dist-server/service/index.js +11 -4
  56. package/dist-server/service/index.js.map +1 -1
  57. package/package.json +18 -17
  58. package/server/controllers/create-data-sample.ts +13 -50
  59. package/server/controllers/data-use-case.ts +19 -7
  60. package/server/controllers/index.ts +1 -1
  61. package/server/service/data-item/index.ts +0 -3
  62. package/server/service/data-ooc/data-ooc-query.ts +13 -8
  63. package/server/service/data-ooc/data-ooc-type.ts +3 -0
  64. package/server/service/data-ooc/data-ooc.ts +9 -14
  65. package/server/service/data-sample/data-sample-query.ts +14 -1
  66. package/server/service/data-sample/data-sample-type.ts +3 -0
  67. package/server/service/data-sample/data-sample.ts +10 -3
  68. package/server/service/data-set/data-item-type.ts +82 -0
  69. package/server/service/data-set/data-set-mutation.ts +33 -60
  70. package/server/service/data-set/data-set-query.ts +5 -0
  71. package/server/service/data-set/data-set-type.ts +8 -1
  72. package/server/service/data-set/data-set.ts +8 -4
  73. package/server/service/data-set-history/data-set-history-query.ts +110 -0
  74. package/server/service/data-set-history/data-set-history-type.ts +12 -0
  75. package/server/service/data-set-history/data-set-history.ts +161 -0
  76. package/server/service/data-set-history/event-subscriber.ts +17 -0
  77. package/server/service/data-set-history/index.ts +7 -0
  78. package/server/service/index.ts +16 -4
  79. package/translations/en.json +5 -5
  80. package/translations/ko.json +10 -10
  81. package/translations/ms.json +5 -5
  82. package/translations/zh.json +5 -5
  83. package/dist-server/service/data-item/data-item-mutation.js +0 -73
  84. package/dist-server/service/data-item/data-item-mutation.js.map +0 -1
  85. package/dist-server/service/data-item/data-item-query.js +0 -104
  86. package/dist-server/service/data-item/data-item-query.js.map +0 -1
  87. package/dist-server/service/data-item/data-item-type.js.map +0 -1
  88. package/server/service/data-item/data-item-mutation.ts +0 -61
  89. package/server/service/data-item/data-item-query.ts +0 -58
  90. package/server/service/data-item/data-item-type.ts +0 -57
@@ -4,9 +4,7 @@ import {
4
4
  CreateDateColumn,
5
5
  Entity,
6
6
  Index,
7
- JoinColumn,
8
7
  ManyToOne,
9
- OneToOne,
10
8
  PrimaryGeneratedColumn,
11
9
  RelationId,
12
10
  UpdateDateColumn
@@ -16,7 +14,7 @@ import { User } from '@things-factory/auth-base'
16
14
  import { config } from '@things-factory/env'
17
15
  import { Domain, ScalarObject } from '@things-factory/shell'
18
16
 
19
- import { DataSample } from '../data-sample/data-sample'
17
+ import { DataItem } from '../data-set/data-item-type'
20
18
  import { DataSet } from '../data-set/data-set'
21
19
 
22
20
  const ORMCONFIG = config.get('ormconfig', {})
@@ -34,9 +32,7 @@ registerEnumType(DataOocStatus, {
34
32
  })
35
33
 
36
34
  @Entity()
37
- @Index('ix_data_ooc_0', (dataOoc: DataOoc) => [dataOoc.domain, dataOoc.dataSet], { unique: false })
38
- @Index('ix_data_ooc_1', (dataOoc: DataOoc) => [dataOoc.domain, dataOoc.dataSample], { unique: true })
39
- @Index('ix_data_ooc_2', (dataOoc: DataOoc) => [dataOoc.domain, dataOoc.collectedAt], { unique: false })
35
+ @Index('ix_data_ooc_0', (dataOoc: DataOoc) => [dataOoc.domain, dataOoc.dataSet, dataOoc.collectedAt], { unique: false })
40
36
  @ObjectType({ description: 'Entity for Out of control data' })
41
37
  export class DataOoc {
42
38
  @PrimaryGeneratedColumn('uuid')
@@ -67,13 +63,9 @@ export class DataOoc {
67
63
  @RelationId((dataOoc: DataOoc) => dataOoc.dataSet)
68
64
  dataSetId?: string
69
65
 
70
- @OneToOne(type => DataSample)
71
- @JoinColumn()
72
- @Field(type => DataSample, { nullable: true })
73
- dataSample?: DataSample
74
-
75
- @RelationId((dataOoc: DataOoc) => dataOoc.dataSample)
76
- dataSampleId?: string
66
+ @Column({ nullable: true })
67
+ @Field({ nullable: true })
68
+ dataSetVersion?: number
77
69
 
78
70
  @Column({
79
71
  nullable: true
@@ -127,7 +119,10 @@ export class DataOoc {
127
119
 
128
120
  @Column('simple-json', { nullable: true })
129
121
  @Field(type => ScalarObject, { nullable: true })
130
- spec?: ScalarObject
122
+ judgment?: ScalarObject
123
+
124
+ @Field(type => [DataItem], { nullable: true })
125
+ dataItems?: DataItem[]
131
126
 
132
127
  @Column('simple-json', { nullable: true })
133
128
  @Field(type => ScalarObject, { nullable: true })
@@ -4,6 +4,8 @@ import { getRepository } from 'typeorm'
4
4
  import { User } from '@things-factory/auth-base'
5
5
  import { Domain, getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'
6
6
 
7
+ import { DataSetHistory } from '../data-set-history/data-set-history'
8
+ import { DataItem } from '../data-set/data-item-type'
7
9
  import { DataSet } from '../data-set/data-set'
8
10
  import { DataSample } from './data-sample'
9
11
  import { DataSampleList } from './data-sample-type'
@@ -37,8 +39,19 @@ export class DataSampleQuery {
37
39
  return { items, total }
38
40
  }
39
41
 
42
+ @FieldResolver(type => [DataItem])
43
+ async dataItems(@Root() dataSample: DataSample): Promise<DataItem[]> {
44
+ const dataSetHistory: DataSetHistory = await getRepository(DataSetHistory).findOne({
45
+ where: {
46
+ originalId: dataSample.dataSetId,
47
+ version: dataSample.dataSetVersion
48
+ }
49
+ })
50
+ return dataSetHistory?.dataItems || []
51
+ }
52
+
40
53
  @FieldResolver(type => DataSet)
41
- async dataSet(@Root() dataSample: DataSample): Promise<Domain> {
54
+ async dataSet(@Root() dataSample: DataSample): Promise<DataSet> {
42
55
  return await getRepository(DataSet).findOne(dataSample.dataSetId)
43
56
  }
44
57
 
@@ -15,6 +15,9 @@ export class NewDataSample {
15
15
  @Field(type => ObjectRef, { nullable: true })
16
16
  dataSet?: ObjectRef
17
17
 
18
+ @Field({ nullable: true })
19
+ dataSetVersion?: number
20
+
18
21
  @Field(type => ScalarObject, { nullable: true })
19
22
  data?: ScalarObject
20
23
 
@@ -14,14 +14,14 @@ import { User } from '@things-factory/auth-base'
14
14
  import { config } from '@things-factory/env'
15
15
  import { Domain, ScalarObject } from '@things-factory/shell'
16
16
 
17
+ import { DataItem } from '../data-set/data-item-type'
17
18
  import { DataSet } from '../data-set/data-set'
18
19
 
19
20
  const ORMCONFIG = config.get('ormconfig', {})
20
21
  const DATABASE_TYPE = ORMCONFIG.type
21
22
  @Entity()
22
- @Index('ix_data_sample_0', (dataSample: DataSample) => [dataSample.domain, dataSample.dataSet], { unique: false })
23
23
  @Index(
24
- 'ix_data_sample_2',
24
+ 'ix_data_sample_0',
25
25
  (dataSample: DataSample) => [dataSample.domain, dataSample.dataSet, dataSample.collectedAt],
26
26
  { unique: false }
27
27
  )
@@ -71,13 +71,20 @@ export class DataSample {
71
71
  @RelationId((dataSample: DataSample) => dataSample.dataSet)
72
72
  dataSetId?: string
73
73
 
74
+ @Column({ nullable: true })
75
+ @Field({ nullable: true })
76
+ dataSetVersion?: number
77
+
74
78
  @Column('simple-json', { nullable: true })
75
79
  @Field(type => ScalarObject, { nullable: true })
76
80
  data?: ScalarObject
77
81
 
78
82
  @Column('simple-json', { nullable: true })
79
83
  @Field(type => ScalarObject, { nullable: true })
80
- spec?: ScalarObject
84
+ judgment?: ScalarObject
85
+
86
+ @Field(type => [DataItem], { nullable: true })
87
+ dataItems?: DataItem[]
81
88
 
82
89
  @Column({
83
90
  nullable: true,
@@ -0,0 +1,82 @@
1
+ import { Field, InputType, Int, ObjectType, registerEnumType } from 'type-graphql'
2
+
3
+ import { ScalarObject } from '@things-factory/shell'
4
+
5
+ export enum DataItemType {
6
+ number = 'number',
7
+ text = 'text',
8
+ boolean = 'boolean',
9
+ select = 'select',
10
+ file = 'file'
11
+ }
12
+
13
+ registerEnumType(DataItemType, {
14
+ name: 'DataItemType',
15
+ description: 'state enumeration of a data-item'
16
+ })
17
+
18
+ @ObjectType({ description: 'Entity for DataItem' })
19
+ export class DataItem {
20
+ @Field()
21
+ name: string
22
+
23
+ @Field({ nullable: true })
24
+ description?: string
25
+
26
+ @Field({ nullable: true })
27
+ tag?: string
28
+
29
+ @Field({ nullable: true })
30
+ active?: boolean
31
+
32
+ @Field({ nullable: true })
33
+ hidden?: boolean
34
+
35
+ @Field({ nullable: true })
36
+ type?: DataItemType
37
+
38
+ @Field(type => ScalarObject, { nullable: true })
39
+ options?: ScalarObject
40
+
41
+ @Field({ nullable: true })
42
+ unit?: string
43
+
44
+ @Field(type => Int, { nullable: true })
45
+ quota: number
46
+
47
+ @Field(type => ScalarObject, { nullable: true })
48
+ spec?: ScalarObject
49
+ }
50
+
51
+ @InputType()
52
+ export class DataItemPatch {
53
+ @Field({ nullable: true })
54
+ name?: string
55
+
56
+ @Field({ nullable: true })
57
+ description?: string
58
+
59
+ @Field({ nullable: true })
60
+ tag?: string
61
+
62
+ @Field(type => DataItemType, { nullable: true })
63
+ type?: DataItemType
64
+
65
+ @Field(type => ScalarObject, { nullable: true })
66
+ options?: ScalarObject
67
+
68
+ @Field({ nullable: true })
69
+ unit?: string
70
+
71
+ @Field(type => Int, { nullable: true })
72
+ quota?: number
73
+
74
+ @Field({ nullable: true })
75
+ active?: boolean
76
+
77
+ @Field({ nullable: true })
78
+ hidden?: boolean
79
+
80
+ @Field(type => ScalarObject, { nullable: true })
81
+ spec?: ScalarObject
82
+ }
@@ -1,10 +1,8 @@
1
1
  import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
- import { EntityManager, In } from 'typeorm'
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 tx.getRepository(DataSet).save({
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 repository = tx.getRepository(DataSet)
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 repository.save({
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({ ...result, cuFlag })
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({ ...result, cuFlag })
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: EntityManager = context.state.tx
143
- const domain: Domain = context.state.domain
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 tx.getRepository(DataSet).save({ domain, ...dataSet })
147
- if (dataSet.dataItems?.length) {
148
- await tx.getRepository(DataItem).save(
149
- dataSet.dataItems.map((dataItem: DataItem) => {
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 tx.getRepository(DataSet).find({
174
+ const originals = await dataSetRepo.find({
169
175
  where: {
170
176
  id: In(ids),
171
177
  domain
172
178
  },
173
- relations: ['domain', 'dataItems']
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 tx.getRepository(DataSet).save(newCopys)
224
- var copiedDataItems = await tx.getRepository(DataItem).save(newDataItems)
200
+ var copiedDataSets = await dataSetRepo.save(newCopys)
225
201
 
226
- return copiedDataSets.map(dataSet => {
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,9 @@
1
- import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
1
  import { FileUpload, GraphQLUpload } from 'graphql-upload'
2
+ import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
3
3
 
4
4
  import { ObjectRef, ScalarObject } from '@things-factory/shell'
5
5
 
6
+ import { DataItemPatch } from './data-item-type'
6
7
  import { DataSet, DataSetEntryType, DataSetMonitorType, DataSetReportType } from './data-set'
7
8
 
8
9
  @InputType()
@@ -31,6 +32,9 @@ export class NewDataSet {
31
32
  @Field(type => ScalarObject, { nullable: true })
32
33
  partitionKeys?: ScalarObject
33
34
 
35
+ @Field(type => [DataItemPatch], { nullable: true })
36
+ dataItems?: DataItemPatch[]
37
+
34
38
  @Field({ nullable: true })
35
39
  schedule?: string
36
40
 
@@ -88,6 +92,9 @@ export class DataSetPatch {
88
92
  @Field(type => ScalarObject, { nullable: true })
89
93
  partitionKeys?: ScalarObject
90
94
 
95
+ @Field(type => [DataItemPatch], { nullable: true })
96
+ dataItems?: DataItemPatch[]
97
+
91
98
  @Field({ nullable: true })
92
99
  schedule?: string
93
100
 
@@ -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 '../data-item/data-item'
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
- @OneToMany(type => DataItem, dataItem => dataItem.dataSet)
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
+ }