@things-factory/dataset 5.0.0-alpha.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.
Files changed (79) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE.md +21 -0
  3. package/client/bootstrap.js +3 -0
  4. package/client/index.js +0 -0
  5. package/client/pages/data-item-list.js +280 -0
  6. package/client/pages/data-sample.js +272 -0
  7. package/client/pages/data-set-importer.js +103 -0
  8. package/client/pages/data-set.js +418 -0
  9. package/client/route.js +11 -0
  10. package/dist-server/controllers/index.js +1 -0
  11. package/dist-server/controllers/index.js.map +1 -0
  12. package/dist-server/index.js +21 -0
  13. package/dist-server/index.js.map +1 -0
  14. package/dist-server/middlewares/index.js +8 -0
  15. package/dist-server/middlewares/index.js.map +1 -0
  16. package/dist-server/migrations/index.js +12 -0
  17. package/dist-server/migrations/index.js.map +1 -0
  18. package/dist-server/routes.js +25 -0
  19. package/dist-server/routes.js.map +1 -0
  20. package/dist-server/service/data-item/data-item-mutation.js +69 -0
  21. package/dist-server/service/data-item/data-item-mutation.js.map +1 -0
  22. package/dist-server/service/data-item/data-item-query.js +100 -0
  23. package/dist-server/service/data-item/data-item-query.js.map +1 -0
  24. package/dist-server/service/data-item/data-item-type.js +80 -0
  25. package/dist-server/service/data-item/data-item-type.js.map +1 -0
  26. package/dist-server/service/data-item/data-item.js +136 -0
  27. package/dist-server/service/data-item/data-item.js.map +1 -0
  28. package/dist-server/service/data-item/index.js +9 -0
  29. package/dist-server/service/data-item/index.js.map +1 -0
  30. package/dist-server/service/data-sample/data-sample-mutation.js +142 -0
  31. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -0
  32. package/dist-server/service/data-sample/data-sample-query.js +100 -0
  33. package/dist-server/service/data-sample/data-sample-query.js.map +1 -0
  34. package/dist-server/service/data-sample/data-sample-type.js +82 -0
  35. package/dist-server/service/data-sample/data-sample-type.js.map +1 -0
  36. package/dist-server/service/data-sample/data-sample.js +105 -0
  37. package/dist-server/service/data-sample/data-sample.js.map +1 -0
  38. package/dist-server/service/data-sample/index.js +9 -0
  39. package/dist-server/service/data-sample/index.js.map +1 -0
  40. package/dist-server/service/data-set/data-set-mutation.js +216 -0
  41. package/dist-server/service/data-set/data-set-mutation.js.map +1 -0
  42. package/dist-server/service/data-set/data-set-query.js +102 -0
  43. package/dist-server/service/data-set/data-set-query.js.map +1 -0
  44. package/dist-server/service/data-set/data-set-type.js +89 -0
  45. package/dist-server/service/data-set/data-set-type.js.map +1 -0
  46. package/dist-server/service/data-set/data-set.js +117 -0
  47. package/dist-server/service/data-set/data-set.js.map +1 -0
  48. package/dist-server/service/data-set/index.js +9 -0
  49. package/dist-server/service/data-set/index.js.map +1 -0
  50. package/dist-server/service/index.js +40 -0
  51. package/dist-server/service/index.js.map +1 -0
  52. package/package.json +38 -0
  53. package/server/controllers/index.ts +0 -0
  54. package/server/index.ts +5 -0
  55. package/server/middlewares/index.ts +3 -0
  56. package/server/migrations/index.ts +9 -0
  57. package/server/routes.ts +28 -0
  58. package/server/service/data-item/data-item-mutation.ts +56 -0
  59. package/server/service/data-item/data-item-query.ts +53 -0
  60. package/server/service/data-item/data-item-type.ts +50 -0
  61. package/server/service/data-item/data-item.ts +113 -0
  62. package/server/service/data-item/index.ts +6 -0
  63. package/server/service/data-sample/data-sample-mutation.ts +137 -0
  64. package/server/service/data-sample/data-sample-query.ts +53 -0
  65. package/server/service/data-sample/data-sample-type.ts +50 -0
  66. package/server/service/data-sample/data-sample.ts +84 -0
  67. package/server/service/data-sample/index.ts +6 -0
  68. package/server/service/data-set/data-set-mutation.ts +209 -0
  69. package/server/service/data-set/data-set-query.ts +55 -0
  70. package/server/service/data-set/data-set-type.ts +54 -0
  71. package/server/service/data-set/data-set.ts +96 -0
  72. package/server/service/data-set/index.ts +6 -0
  73. package/server/service/index.ts +25 -0
  74. package/things-factory.config.js +17 -0
  75. package/translations/en.json +8 -0
  76. package/translations/ko.json +8 -0
  77. package/translations/ms.json +8 -0
  78. package/translations/zh.json +8 -0
  79. package/tsconfig.json +9 -0
@@ -0,0 +1,137 @@
1
+ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
+ import { In } from 'typeorm'
3
+
4
+ import { DataItem } from '../data-item/data-item'
5
+ import { DataSet } from '../data-set/data-set'
6
+ import { DataSample } from './data-sample'
7
+ import { DataSamplePatch, NewDataSample } from './data-sample-type'
8
+
9
+ @Resolver(DataSample)
10
+ export class DataSampleMutation {
11
+ @Directive('@privilege(category: "data-sample", privilege: "mutation", domainOwnerGranted: true)')
12
+ @Directive('@transaction')
13
+ @Mutation(returns => DataSample, { description: 'To create new data sample' })
14
+ async createDataSample(@Arg('dataSample') dataSample: NewDataSample, @Ctx() context: any): Promise<DataSample> {
15
+ const { domain, user, tx } = context.state
16
+
17
+ const dataSet = await tx.getRepository(DataSet).findOne({ id: dataSample.dataSetId })
18
+ const dataItems = await tx.getRepository(DataItem).find({
19
+ select: {
20
+ domain,
21
+ dataSetId: dataSample.dataSetId
22
+ },
23
+ order: {
24
+ sequence: 'DESC'
25
+ }
26
+ })
27
+
28
+ var spec = {} as any
29
+
30
+ dataItems.sortforEach(dataItem => {
31
+ spec[dataItem.name] = dataItem.spec
32
+ })
33
+
34
+ return await tx.getRepository(DataSample).save({
35
+ name: dataSet.name,
36
+ description: dataSet.description,
37
+ ...dataSample,
38
+ domain,
39
+ spec,
40
+ creator: user,
41
+ updater: user
42
+ })
43
+ }
44
+
45
+ @Directive('@privilege(category: "data-sample", privilege: "mutation", domainOwnerGranted: true)')
46
+ @Directive('@transaction')
47
+ @Mutation(returns => DataSample, { description: 'To modify data sample information' })
48
+ async updateDataSample(
49
+ @Arg('id') id: string,
50
+ @Arg('patch') patch: DataSamplePatch,
51
+ @Ctx() context: any
52
+ ): Promise<DataSample> {
53
+ const { domain, user, tx } = context.state
54
+
55
+ const repository = tx.getRepository(DataSample)
56
+ const dataSample = await repository.findOne({
57
+ where: { domain, id }
58
+ })
59
+
60
+ return await repository.save({
61
+ ...dataSample,
62
+ ...patch,
63
+ updater: user
64
+ })
65
+ }
66
+
67
+ @Directive('@privilege(category: "data-sample", privilege: "mutation", domainOwnerGranted: true)')
68
+ @Directive('@transaction')
69
+ @Mutation(returns => [DataSample], { description: "To modify multiple data samples' information" })
70
+ async updateMultipleDataSample(
71
+ @Arg('patches', type => [DataSamplePatch]) patches: DataSamplePatch[],
72
+ @Ctx() context: any
73
+ ): Promise<DataSample[]> {
74
+ const { domain, user, tx } = context.state
75
+
76
+ let results = []
77
+ const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
78
+ const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
79
+ const dataSampleRepo = tx.getRepository(DataSample)
80
+
81
+ if (_createRecords.length > 0) {
82
+ for (let i = 0; i < _createRecords.length; i++) {
83
+ const newRecord = _createRecords[i]
84
+
85
+ const result = await dataSampleRepo.save({
86
+ ...newRecord,
87
+ domain,
88
+ creator: user,
89
+ updater: user
90
+ })
91
+
92
+ results.push({ ...result, cuFlag: '+' })
93
+ }
94
+ }
95
+
96
+ if (_updateRecords.length > 0) {
97
+ for (let i = 0; i < _updateRecords.length; i++) {
98
+ const newRecord = _updateRecords[i]
99
+ const dataSample = await dataSampleRepo.findOne(newRecord.id)
100
+
101
+ const result = await dataSampleRepo.save({
102
+ ...dataSample,
103
+ ...newRecord,
104
+ updater: user
105
+ })
106
+
107
+ results.push({ ...result, cuFlag: 'M' })
108
+ }
109
+ }
110
+
111
+ return results
112
+ }
113
+
114
+ @Directive('@privilege(category: "data-sample", privilege: "mutation", domainOwnerGranted: true)')
115
+ @Directive('@transaction')
116
+ @Mutation(returns => Boolean, { description: 'To delete a data sample' })
117
+ async deleteDataSample(@Arg('id') id: string, @Ctx() context: any): Promise<boolean> {
118
+ const { domain, tx } = context.state
119
+
120
+ await tx.getRepository(DataSample).delete({ domain, id })
121
+ return true
122
+ }
123
+
124
+ @Directive('@privilege(category: "data-sample", privilege: "mutation", domainOwnerGranted: true)')
125
+ @Directive('@transaction')
126
+ @Mutation(returns => Boolean, { description: 'To delete multiple data samples' })
127
+ async deleteDataSamples(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<boolean> {
128
+ const { domain, tx } = context.state
129
+
130
+ await tx.getRepository(DataSample).delete({
131
+ domain,
132
+ id: In(ids)
133
+ })
134
+
135
+ return true
136
+ }
137
+ }
@@ -0,0 +1,53 @@
1
+ import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
+ import { getRepository } from 'typeorm'
3
+
4
+ import { User } from '@things-factory/auth-base'
5
+ import { convertListParams, Domain, ListParam } from '@things-factory/shell'
6
+
7
+ import { DataSet } from '../data-set/data-set'
8
+ import { DataSample } from './data-sample'
9
+ import { DataSampleList } from './data-sample-type'
10
+
11
+ @Resolver(DataSample)
12
+ export class DataSampleQuery {
13
+ @Directive('@privilege(category: "data-sample", privilege: "query", domainOwnerGranted: true)')
14
+ @Query(returns => DataSample, { description: 'To fetch a data sample' })
15
+ async dataSample(@Arg('id') id: string, @Ctx() context: any): Promise<DataSample> {
16
+ const { domain } = context.state
17
+
18
+ return await getRepository(DataSample).findOne({
19
+ where: { domain, id }
20
+ })
21
+ }
22
+
23
+ @Directive('@privilege(category: "data-sample", privilege: "query", domainOwnerGranted: true)')
24
+ @Query(returns => DataSampleList, { description: 'To fetch multiple data samples' })
25
+ async dataSamples(@Args() params: ListParam, @Ctx() context: any): Promise<DataSampleList> {
26
+ const { domain } = context.state
27
+
28
+ const convertedParams = convertListParams(params, domain.id)
29
+ const [items, total] = await getRepository(DataSample).findAndCount(convertedParams)
30
+
31
+ return { items, total }
32
+ }
33
+
34
+ @FieldResolver(type => DataSet)
35
+ async dataSet(@Root() dataSample: DataSample): Promise<Domain> {
36
+ return await getRepository(DataSet).findOne(dataSample.dataSetId)
37
+ }
38
+
39
+ @FieldResolver(type => Domain)
40
+ async domain(@Root() dataSample: DataSample): Promise<Domain> {
41
+ return await getRepository(Domain).findOne(dataSample.domainId)
42
+ }
43
+
44
+ @FieldResolver(type => User)
45
+ async updater(@Root() dataSample: DataSample): Promise<User> {
46
+ return await getRepository(User).findOne(dataSample.updaterId)
47
+ }
48
+
49
+ @FieldResolver(type => User)
50
+ async creator(@Root() dataSample: DataSample): Promise<User> {
51
+ return await getRepository(User).findOne(dataSample.creatorId)
52
+ }
53
+ }
@@ -0,0 +1,50 @@
1
+ import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
+
3
+ import { ScalarObject } from '@things-factory/shell'
4
+
5
+ import { DataSample } from './data-sample'
6
+
7
+ @InputType()
8
+ export class NewDataSample {
9
+ @Field({ nullable: true })
10
+ name?: string
11
+
12
+ @Field({ nullable: true })
13
+ description?: string
14
+
15
+ @Field({ nullable: true })
16
+ dataSetId?: string
17
+
18
+ @Field(type => ScalarObject, { nullable: true })
19
+ data?: object
20
+ }
21
+
22
+ @InputType()
23
+ export class DataSamplePatch {
24
+ @Field(type => ID, { nullable: true })
25
+ id?: string
26
+
27
+ @Field({ nullable: true })
28
+ name?: string
29
+
30
+ @Field({ nullable: true })
31
+ description?: string
32
+
33
+ @Field({ nullable: true })
34
+ dataSetId?: string
35
+
36
+ @Field(type => ScalarObject, { nullable: true })
37
+ data?: object
38
+
39
+ @Field()
40
+ cuFlag: string
41
+ }
42
+
43
+ @ObjectType()
44
+ export class DataSampleList {
45
+ @Field(type => [DataSample])
46
+ items: DataSample[]
47
+
48
+ @Field(type => Int)
49
+ total: number
50
+ }
@@ -0,0 +1,84 @@
1
+ import { Field, ID, ObjectType } from 'type-graphql'
2
+ import {
3
+ Column,
4
+ CreateDateColumn,
5
+ Entity,
6
+ Index,
7
+ ManyToOne,
8
+ PrimaryGeneratedColumn,
9
+ RelationId,
10
+ UpdateDateColumn
11
+ } from 'typeorm'
12
+
13
+ import { User } from '@things-factory/auth-base'
14
+ import { Domain, ScalarObject } from '@things-factory/shell'
15
+
16
+ import { DataSet } from '../data-set/data-set'
17
+
18
+ @Entity()
19
+ @Index('ix_data_sample_0', (dataSample: DataSample) => [dataSample.domain, dataSample.dataSet], { unique: false })
20
+ @ObjectType({ description: 'Entity for DataSample' })
21
+ export class DataSample {
22
+ @PrimaryGeneratedColumn('uuid')
23
+ @Field(type => ID)
24
+ readonly id: string
25
+
26
+ @ManyToOne(type => Domain)
27
+ @Field({ nullable: true })
28
+ domain?: Domain
29
+
30
+ @RelationId((dataSample: DataSample) => dataSample.domain)
31
+ domainId?: string
32
+
33
+ @Column()
34
+ @Field()
35
+ name: string
36
+
37
+ @Column({
38
+ nullable: true
39
+ })
40
+ @Field({ nullable: true })
41
+ description?: string
42
+
43
+ @ManyToOne(type => DataSet, dataSet => dataSet.dataSamples)
44
+ @Field(type => DataSet, { nullable: true })
45
+ dataSet?: DataSet
46
+
47
+ @RelationId((dataSample: DataSample) => dataSample.dataSet)
48
+ @Field({ nullable: true })
49
+ dataSetId?: string
50
+
51
+ @Column('simple-json', { nullable: true })
52
+ @Field(type => ScalarObject, { nullable: true })
53
+ data?: object
54
+
55
+ @Column('simple-json', { nullable: true })
56
+ @Field(type => ScalarObject, { nullable: true })
57
+ spec?: object
58
+
59
+ @CreateDateColumn()
60
+ @Field({ nullable: true })
61
+ createdAt?: Date
62
+
63
+ @UpdateDateColumn()
64
+ @Field({ nullable: true })
65
+ updatedAt?: Date
66
+
67
+ @ManyToOne(type => User, {
68
+ nullable: true
69
+ })
70
+ @Field({ nullable: true })
71
+ creator?: User
72
+
73
+ @RelationId((dataSample: DataSample) => dataSample.creator)
74
+ creatorId?: string
75
+
76
+ @ManyToOne(type => User, {
77
+ nullable: true
78
+ })
79
+ @Field({ nullable: true })
80
+ updater?: User
81
+
82
+ @RelationId((dataSample: DataSample) => dataSample.creator)
83
+ updaterId?: string
84
+ }
@@ -0,0 +1,6 @@
1
+ import { DataSample } from './data-sample'
2
+ import { DataSampleQuery } from './data-sample-query'
3
+ import { DataSampleMutation } from './data-sample-mutation'
4
+
5
+ export const entities = [DataSample]
6
+ export const resolvers = [DataSampleQuery, DataSampleMutation]
@@ -0,0 +1,209 @@
1
+ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
+ import { EntityManager, In } from 'typeorm'
3
+ import uuid from 'uuid/v4'
4
+
5
+ import { Domain } from '@things-factory/shell'
6
+
7
+ import { DataItem } from '../data-item/data-item'
8
+ import { DataSet } from './data-set'
9
+ import { DataSetPatch, NewDataSet } from './data-set-type'
10
+
11
+ @Resolver(DataSet)
12
+ export class DataSetMutation {
13
+ @Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
14
+ @Directive('@transaction')
15
+ @Mutation(returns => DataSet, { description: 'To create new DataSet' })
16
+ async createDataSet(@Arg('dataSet') dataSet: NewDataSet, @Ctx() context: any): Promise<DataSet> {
17
+ const { domain, user, tx } = context.state
18
+
19
+ return await tx.getRepository(DataSet).save({
20
+ ...dataSet,
21
+ domain,
22
+ creator: user,
23
+ updater: user
24
+ })
25
+ }
26
+
27
+ @Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
28
+ @Directive('@transaction')
29
+ @Mutation(returns => DataSet, { description: 'To modify DataSet information' })
30
+ async updateDataSet(@Arg('id') id: string, @Arg('patch') patch: DataSetPatch, @Ctx() context: any): Promise<DataSet> {
31
+ const { domain, user, tx } = context.state
32
+
33
+ const repository = tx.getRepository(DataSet)
34
+ const dataSet = await repository.findOne({
35
+ where: { domain, id }
36
+ })
37
+
38
+ return await repository.save({
39
+ ...dataSet,
40
+ ...patch,
41
+ updater: user
42
+ })
43
+ }
44
+
45
+ @Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
46
+ @Directive('@transaction')
47
+ @Mutation(returns => [DataSet], { description: "To modify multiple DataSets' information" })
48
+ async updateMultipleDataSet(
49
+ @Arg('patches', type => [DataSetPatch]) patches: DataSetPatch[],
50
+ @Ctx() context: any
51
+ ): Promise<DataSet[]> {
52
+ const { domain, user, tx } = context.state
53
+
54
+ let results = []
55
+ const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
56
+ const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
57
+ const dataSetRepo = tx.getRepository(DataSet)
58
+
59
+ if (_createRecords.length > 0) {
60
+ for (let i = 0; i < _createRecords.length; i++) {
61
+ const newRecord = _createRecords[i]
62
+
63
+ const result = await dataSetRepo.save({
64
+ ...newRecord,
65
+ domain,
66
+ creator: user,
67
+ updater: user
68
+ })
69
+
70
+ results.push({ ...result, cuFlag: '+' })
71
+ }
72
+ }
73
+
74
+ if (_updateRecords.length > 0) {
75
+ for (let i = 0; i < _updateRecords.length; i++) {
76
+ const newRecord = _updateRecords[i]
77
+ const dataSet = await dataSetRepo.findOne(newRecord.id)
78
+
79
+ const result = await dataSetRepo.save({
80
+ ...dataSet,
81
+ ...newRecord,
82
+ updater: user
83
+ })
84
+
85
+ results.push({ ...result, cuFlag: 'M' })
86
+ }
87
+ }
88
+
89
+ return results
90
+ }
91
+
92
+ @Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
93
+ @Directive('@transaction')
94
+ @Mutation(returns => Boolean, { description: 'To delete DataSet' })
95
+ async deleteDataSet(@Arg('id') id: string, @Ctx() context: any): Promise<boolean> {
96
+ const { domain, tx } = context.state
97
+
98
+ await tx.getRepository(DataSet).delete({ domain, id })
99
+ return true
100
+ }
101
+
102
+ @Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
103
+ @Directive('@transaction')
104
+ @Mutation(returns => Boolean, { description: 'To delete multiple dataSets' })
105
+ async deleteDataSets(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<boolean> {
106
+ const { domain, tx } = context.state
107
+
108
+ await tx.getRepository(DataSet).delete({
109
+ domain,
110
+ id: In(ids)
111
+ })
112
+
113
+ return true
114
+ }
115
+
116
+ @Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
117
+ @Directive('@transaction')
118
+ @Mutation(returns => Boolean, { description: 'To import multiple data-sets' })
119
+ async importDataSets(
120
+ @Arg('dataSets', type => [DataSetPatch]) dataSets: DataSet[],
121
+ @Ctx() context: any
122
+ ): Promise<boolean> {
123
+ const tx: EntityManager = context.state.tx
124
+ const domain: Domain = context.state.domain
125
+ await Promise.all(
126
+ dataSets.map(async (dataSet: DataSet) => {
127
+ const createdDataSet: DataSet = await tx.getRepository(DataSet).save({ domain, ...dataSet })
128
+ if (dataSet.dataItems?.length) {
129
+ await tx.getRepository(DataItem).save(
130
+ dataSet.dataItems.map((dataItem: DataItem) => {
131
+ dataItem.domain = domain
132
+ dataItem.dataSet = createdDataSet
133
+ return dataItem
134
+ })
135
+ )
136
+ }
137
+ })
138
+ )
139
+
140
+ return true
141
+ }
142
+
143
+ @Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
144
+ @Directive('@transaction')
145
+ @Mutation(returns => [DataSet], { description: 'To copy multiple data-sets' })
146
+ async copyDataSets(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<DataSet[]> {
147
+ const { domain, user, tx } = context.state
148
+
149
+ const originals = await tx.getRepository(DataSet).find({
150
+ where: {
151
+ id: In(ids),
152
+ domain
153
+ },
154
+ relations: ['domain', 'dataItems']
155
+ })
156
+
157
+ if (originals.length == 0) {
158
+ return []
159
+ }
160
+
161
+ var newDataItems = []
162
+
163
+ var newCopys = originals.map(dataSet => {
164
+ let dataSetId = uuid()
165
+ newDataItems.push(
166
+ ...dataSet.dataItems.map(dataItem => {
167
+ return {
168
+ dataSet: dataSetId,
169
+ name: dataItem.name,
170
+ description: dataItem.description,
171
+ sequence: dataItem.sequence,
172
+ task: dataItem.task,
173
+ connection: dataItem.connection,
174
+ params: dataItem.params,
175
+
176
+ domain,
177
+ creator: user,
178
+ updater: user
179
+ }
180
+ })
181
+ )
182
+
183
+ return {
184
+ id: dataSetId,
185
+ name: dataSet.name + ' (' + dataSetId + ')',
186
+ type: dataSet.type,
187
+ description: dataSet.description,
188
+ active: false,
189
+ schedule: dataSet.schedule,
190
+ timezone: dataSet.timezone,
191
+
192
+ domain,
193
+ creator: user,
194
+ updater: user
195
+ }
196
+ })
197
+
198
+ var copiedDataSets = await tx.getRepository(DataSet).save(newCopys)
199
+ var copiedDataItems = await tx.getRepository(DataItem).save(newDataItems)
200
+
201
+ return copiedDataSets.map(dataSet => {
202
+ dataSet.dataItems = copiedDataItems.filter(dataItem => dataItem.dataSet == dataSet.id)
203
+ return {
204
+ ...dataSet,
205
+ state: 'UNLOADED' // DataSetInstanceStatus.UNLOADED
206
+ }
207
+ })
208
+ }
209
+ }
@@ -0,0 +1,55 @@
1
+ import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
+ import { getRepository } from 'typeorm'
3
+
4
+ import { User } from '@things-factory/auth-base'
5
+ import { convertListParams, Domain, ListParam } from '@things-factory/shell'
6
+
7
+ import { DataItem } from '../data-item/data-item'
8
+ import { DataSet } from './data-set'
9
+ import { DataSetList } from './data-set-type'
10
+
11
+ @Resolver(DataSet)
12
+ export class DataSetQuery {
13
+ @Directive('@privilege(category: "data-set", privilege: "query", domainOwnerGranted: true)')
14
+ @Query(returns => DataSet, { description: 'To fetch a DataSet' })
15
+ async dataSet(@Arg('id') id: string, @Ctx() context: any): Promise<DataSet> {
16
+ const { domain } = context.state
17
+
18
+ return await getRepository(DataSet).findOne({
19
+ where: { domain, id }
20
+ })
21
+ }
22
+
23
+ @Directive('@privilege(category: "data-set", privilege: "query", domainOwnerGranted: true)')
24
+ @Query(returns => DataSetList, { description: 'To fetch multiple DataSets' })
25
+ async dataSets(@Args() params: ListParam, @Ctx() context: any): Promise<DataSetList> {
26
+ const { domain } = context.state
27
+
28
+ const convertedParams = convertListParams(params, domain.id)
29
+ const [items, total] = await getRepository(DataSet).findAndCount(convertedParams)
30
+
31
+ return { items, total }
32
+ }
33
+
34
+ @FieldResolver(type => [DataItem])
35
+ async dataItems(@Root() dataSet: DataSet): Promise<DataItem[]> {
36
+ return await getRepository(DataItem).find({
37
+ dataSet
38
+ })
39
+ }
40
+
41
+ @FieldResolver(type => Domain)
42
+ async domain(@Root() dataSet: DataSet): Promise<Domain> {
43
+ return await getRepository(Domain).findOne(dataSet.domainId)
44
+ }
45
+
46
+ @FieldResolver(type => User)
47
+ async updater(@Root() dataSet: DataSet): Promise<User> {
48
+ return await getRepository(User).findOne(dataSet.updaterId)
49
+ }
50
+
51
+ @FieldResolver(type => User)
52
+ async creator(@Root() dataSet: DataSet): Promise<User> {
53
+ return await getRepository(User).findOne(dataSet.creatorId)
54
+ }
55
+ }
@@ -0,0 +1,54 @@
1
+ import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
+
3
+ import { DataSet } from './data-set'
4
+
5
+ @InputType()
6
+ export class NewDataSet {
7
+ @Field()
8
+ name: string
9
+
10
+ @Field({ nullable: true })
11
+ description?: string
12
+
13
+ @Field({ nullable: true })
14
+ active?: boolean
15
+
16
+ @Field({ nullable: true })
17
+ schedule?: string
18
+
19
+ @Field({ nullable: true })
20
+ timezone?: string
21
+ }
22
+
23
+ @InputType()
24
+ export class DataSetPatch {
25
+ @Field(type => ID, { nullable: true })
26
+ id?: string
27
+
28
+ @Field({ nullable: true })
29
+ name?: string
30
+
31
+ @Field({ nullable: true })
32
+ description?: string
33
+
34
+ @Field({ nullable: true })
35
+ active?: boolean
36
+
37
+ @Field({ nullable: true })
38
+ schedule?: string
39
+
40
+ @Field({ nullable: true })
41
+ timezone?: string
42
+
43
+ @Field()
44
+ cuFlag: string
45
+ }
46
+
47
+ @ObjectType()
48
+ export class DataSetList {
49
+ @Field(type => [DataSet])
50
+ items: DataSet[]
51
+
52
+ @Field(type => Int)
53
+ total: number
54
+ }