@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.
- package/CHANGELOG.md +8 -0
- package/LICENSE.md +21 -0
- package/client/bootstrap.js +3 -0
- package/client/index.js +0 -0
- package/client/pages/data-item-list.js +280 -0
- package/client/pages/data-sample.js +272 -0
- package/client/pages/data-set-importer.js +103 -0
- package/client/pages/data-set.js +418 -0
- package/client/route.js +11 -0
- package/dist-server/controllers/index.js +1 -0
- package/dist-server/controllers/index.js.map +1 -0
- package/dist-server/index.js +21 -0
- package/dist-server/index.js.map +1 -0
- package/dist-server/middlewares/index.js +8 -0
- package/dist-server/middlewares/index.js.map +1 -0
- package/dist-server/migrations/index.js +12 -0
- package/dist-server/migrations/index.js.map +1 -0
- package/dist-server/routes.js +25 -0
- package/dist-server/routes.js.map +1 -0
- package/dist-server/service/data-item/data-item-mutation.js +69 -0
- package/dist-server/service/data-item/data-item-mutation.js.map +1 -0
- package/dist-server/service/data-item/data-item-query.js +100 -0
- package/dist-server/service/data-item/data-item-query.js.map +1 -0
- package/dist-server/service/data-item/data-item-type.js +80 -0
- package/dist-server/service/data-item/data-item-type.js.map +1 -0
- package/dist-server/service/data-item/data-item.js +136 -0
- package/dist-server/service/data-item/data-item.js.map +1 -0
- package/dist-server/service/data-item/index.js +9 -0
- package/dist-server/service/data-item/index.js.map +1 -0
- package/dist-server/service/data-sample/data-sample-mutation.js +142 -0
- package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -0
- package/dist-server/service/data-sample/data-sample-query.js +100 -0
- package/dist-server/service/data-sample/data-sample-query.js.map +1 -0
- package/dist-server/service/data-sample/data-sample-type.js +82 -0
- package/dist-server/service/data-sample/data-sample-type.js.map +1 -0
- package/dist-server/service/data-sample/data-sample.js +105 -0
- package/dist-server/service/data-sample/data-sample.js.map +1 -0
- package/dist-server/service/data-sample/index.js +9 -0
- package/dist-server/service/data-sample/index.js.map +1 -0
- package/dist-server/service/data-set/data-set-mutation.js +216 -0
- package/dist-server/service/data-set/data-set-mutation.js.map +1 -0
- package/dist-server/service/data-set/data-set-query.js +102 -0
- package/dist-server/service/data-set/data-set-query.js.map +1 -0
- package/dist-server/service/data-set/data-set-type.js +89 -0
- package/dist-server/service/data-set/data-set-type.js.map +1 -0
- package/dist-server/service/data-set/data-set.js +117 -0
- package/dist-server/service/data-set/data-set.js.map +1 -0
- package/dist-server/service/data-set/index.js +9 -0
- package/dist-server/service/data-set/index.js.map +1 -0
- package/dist-server/service/index.js +40 -0
- package/dist-server/service/index.js.map +1 -0
- package/package.json +38 -0
- package/server/controllers/index.ts +0 -0
- package/server/index.ts +5 -0
- package/server/middlewares/index.ts +3 -0
- package/server/migrations/index.ts +9 -0
- package/server/routes.ts +28 -0
- package/server/service/data-item/data-item-mutation.ts +56 -0
- package/server/service/data-item/data-item-query.ts +53 -0
- package/server/service/data-item/data-item-type.ts +50 -0
- package/server/service/data-item/data-item.ts +113 -0
- package/server/service/data-item/index.ts +6 -0
- package/server/service/data-sample/data-sample-mutation.ts +137 -0
- package/server/service/data-sample/data-sample-query.ts +53 -0
- package/server/service/data-sample/data-sample-type.ts +50 -0
- package/server/service/data-sample/data-sample.ts +84 -0
- package/server/service/data-sample/index.ts +6 -0
- package/server/service/data-set/data-set-mutation.ts +209 -0
- package/server/service/data-set/data-set-query.ts +55 -0
- package/server/service/data-set/data-set-type.ts +54 -0
- package/server/service/data-set/data-set.ts +96 -0
- package/server/service/data-set/index.ts +6 -0
- package/server/service/index.ts +25 -0
- package/things-factory.config.js +17 -0
- package/translations/en.json +8 -0
- package/translations/ko.json +8 -0
- package/translations/ms.json +8 -0
- package/translations/zh.json +8 -0
- 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,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
|
+
}
|