@things-factory/integration-base 6.2.34 → 6.2.35
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/dist-server/engine/task/index.js +2 -0
- package/dist-server/engine/task/index.js.map +1 -1
- package/dist-server/engine/task/local-graphql-mutate.js +7 -2
- package/dist-server/engine/task/local-graphql-mutate.js.map +1 -1
- package/dist-server/engine/task/local-graphql-query.js +7 -2
- package/dist-server/engine/task/local-graphql-query.js.map +1 -1
- package/dist-server/engine/task/read-state.js +48 -0
- package/dist-server/engine/task/read-state.js.map +1 -0
- package/dist-server/engine/task/state-read.js +49 -0
- package/dist-server/engine/task/state-read.js.map +1 -0
- package/dist-server/engine/task/state-write.js +57 -0
- package/dist-server/engine/task/state-write.js.map +1 -0
- package/dist-server/engine/task/write-state.js +56 -0
- package/dist-server/engine/task/write-state.js.map +1 -0
- package/dist-server/service/index.js +6 -2
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/state-register/index.js +10 -0
- package/dist-server/service/state-register/index.js.map +1 -0
- package/dist-server/service/state-register/state-register-mutation.js +153 -0
- package/dist-server/service/state-register/state-register-mutation.js.map +1 -0
- package/dist-server/service/state-register/state-register-query.js +113 -0
- package/dist-server/service/state-register/state-register-query.js.map +1 -0
- package/dist-server/service/state-register/state-register-type.js +90 -0
- package/dist-server/service/state-register/state-register-type.js.map +1 -0
- package/dist-server/service/state-register/state-register.js +105 -0
- package/dist-server/service/state-register/state-register.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/integration/concept/scenario.ja.md +4 -0
- package/helps/integration/concept/scenario.ko.md +4 -0
- package/helps/integration/concept/scenario.md +3 -3
- package/helps/integration/concept/scenario.ms.md +4 -0
- package/helps/integration/concept/scenario.zh.md +4 -0
- package/helps/integration/concept/state-register.ja.md +8 -0
- package/helps/integration/concept/state-register.ko.md +8 -0
- package/helps/integration/concept/state-register.md +8 -0
- package/helps/integration/concept/state-register.ms.md +8 -0
- package/helps/integration/concept/state-register.zh.md +8 -0
- package/helps/integration/concept/task.ja.md +25 -0
- package/helps/integration/concept/task.ko.md +25 -0
- package/helps/integration/concept/task.md +17 -17
- package/helps/integration/concept/task.ms.md +28 -0
- package/helps/integration/concept/task.zh.md +25 -0
- package/helps/integration/task/state-read.ja.md +8 -0
- package/helps/integration/task/state-read.ko.md +8 -0
- package/helps/integration/task/state-read.md +8 -0
- package/helps/integration/task/state-read.ms.md +8 -0
- package/helps/integration/task/state-read.zh.md +8 -0
- package/helps/integration/task/state-write.ja.md +10 -0
- package/helps/integration/task/state-write.ko.md +10 -0
- package/helps/integration/task/state-write.md +10 -0
- package/helps/integration/task/state-write.ms.md +10 -0
- package/helps/integration/task/state-write.zh.md +10 -0
- package/package.json +2 -2
- package/server/engine/task/index.ts +2 -0
- package/server/engine/task/local-graphql-mutate.ts +8 -2
- package/server/engine/task/local-graphql-query.ts +8 -2
- package/server/engine/task/state-read.ts +54 -0
- package/server/engine/task/state-write.ts +63 -0
- package/server/service/index.ts +6 -2
- package/server/service/state-register/index.ts +7 -0
- package/server/service/state-register/state-register-mutation.ts +166 -0
- package/server/service/state-register/state-register-query.ts +72 -0
- package/server/service/state-register/state-register-type.ts +64 -0
- package/server/service/state-register/state-register.ts +91 -0
@@ -0,0 +1,166 @@
|
|
1
|
+
import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'
|
2
|
+
import { In } from 'typeorm'
|
3
|
+
|
4
|
+
import { ScalarObject } from '@things-factory/shell'
|
5
|
+
import { StateRegister } from './state-register'
|
6
|
+
import { NewStateRegister, StateRegisterPatch } from './state-register-type'
|
7
|
+
|
8
|
+
@Resolver(StateRegister)
|
9
|
+
export class StateRegisterMutation {
|
10
|
+
@Directive('@transaction')
|
11
|
+
@Directive('@privilege(category: "state-register", privilege: "mutation", domainOwnerGranted: true)')
|
12
|
+
@Mutation(returns => StateRegister, { description: 'To create new StateRegister' })
|
13
|
+
async createStateRegister(
|
14
|
+
@Arg('stateRegister') stateRegister: NewStateRegister,
|
15
|
+
@Ctx() context: ResolverContext
|
16
|
+
): Promise<StateRegister> {
|
17
|
+
const { domain, user, tx } = context.state
|
18
|
+
|
19
|
+
return await tx.getRepository(StateRegister).save({
|
20
|
+
...stateRegister,
|
21
|
+
domain,
|
22
|
+
creator: user,
|
23
|
+
updater: user
|
24
|
+
})
|
25
|
+
}
|
26
|
+
|
27
|
+
@Directive('@transaction')
|
28
|
+
@Directive('@privilege(category: "state-register", privilege: "mutation", domainOwnerGranted: true)')
|
29
|
+
@Mutation(returns => StateRegister, { description: 'To modify StateRegister information' })
|
30
|
+
async updateStateRegister(
|
31
|
+
@Arg('id') id: string,
|
32
|
+
@Arg('patch') patch: StateRegisterPatch,
|
33
|
+
@Ctx() context: ResolverContext
|
34
|
+
): Promise<StateRegister> {
|
35
|
+
const { domain, user, tx } = context.state
|
36
|
+
|
37
|
+
const repository = tx.getRepository(StateRegister)
|
38
|
+
const stateRegister = await repository.findOne({
|
39
|
+
where: { domain: { id: domain.id }, id }
|
40
|
+
})
|
41
|
+
|
42
|
+
return await repository.save({
|
43
|
+
...stateRegister,
|
44
|
+
...patch,
|
45
|
+
updater: user
|
46
|
+
})
|
47
|
+
}
|
48
|
+
|
49
|
+
@Directive('@transaction')
|
50
|
+
@Directive('@privilege(category: "state-register", privilege: "mutation", domainOwnerGranted: true)')
|
51
|
+
@Mutation(returns => [StateRegister], { description: "To modify multiple StateRegisters' information" })
|
52
|
+
async updateMultipleStateRegister(
|
53
|
+
@Arg('patches', type => [StateRegisterPatch]) patches: StateRegisterPatch[],
|
54
|
+
@Ctx() context: ResolverContext
|
55
|
+
): Promise<StateRegister[]> {
|
56
|
+
const { domain, user, tx } = context.state
|
57
|
+
|
58
|
+
let results = []
|
59
|
+
const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
|
60
|
+
const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
|
61
|
+
const stateRegisterRepo = tx.getRepository(StateRegister)
|
62
|
+
|
63
|
+
if (_createRecords.length > 0) {
|
64
|
+
for (let i = 0; i < _createRecords.length; i++) {
|
65
|
+
const newRecord = _createRecords[i]
|
66
|
+
|
67
|
+
const result = await stateRegisterRepo.save({
|
68
|
+
...newRecord,
|
69
|
+
domain,
|
70
|
+
creator: user,
|
71
|
+
updater: user
|
72
|
+
})
|
73
|
+
|
74
|
+
results.push({ ...result, cuFlag: '+' })
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
if (_updateRecords.length > 0) {
|
79
|
+
for (let i = 0; i < _updateRecords.length; i++) {
|
80
|
+
const updateRecord = _updateRecords[i]
|
81
|
+
const stateRegister = await stateRegisterRepo.findOneBy({ id: updateRecord.id })
|
82
|
+
|
83
|
+
const result = await stateRegisterRepo.save({
|
84
|
+
...stateRegister,
|
85
|
+
...updateRecord,
|
86
|
+
updater: user
|
87
|
+
})
|
88
|
+
|
89
|
+
results.push({ ...result, cuFlag: 'M' })
|
90
|
+
}
|
91
|
+
}
|
92
|
+
|
93
|
+
return results
|
94
|
+
}
|
95
|
+
|
96
|
+
@Directive('@transaction')
|
97
|
+
@Directive('@privilege(category: "state-register", privilege: "mutation", domainOwnerGranted: true)')
|
98
|
+
@Mutation(returns => StateRegister, { description: 'To update state of StateRegister by name' })
|
99
|
+
async updateStateRegisterByName(
|
100
|
+
@Arg('name') name: string,
|
101
|
+
@Arg('state', type => ScalarObject) state: any,
|
102
|
+
@Ctx() context: ResolverContext
|
103
|
+
): Promise<StateRegister> {
|
104
|
+
const { domain, user, tx } = context.state
|
105
|
+
|
106
|
+
const repository = tx.getRepository(StateRegister)
|
107
|
+
const stateRegister = await repository.findOne({
|
108
|
+
where: { domain: { id: domain.id }, name }
|
109
|
+
})
|
110
|
+
|
111
|
+
return await repository.save({
|
112
|
+
...stateRegister,
|
113
|
+
state,
|
114
|
+
writer: user,
|
115
|
+
wroteAt: new Date()
|
116
|
+
})
|
117
|
+
}
|
118
|
+
|
119
|
+
@Directive('@transaction')
|
120
|
+
@Directive('@privilege(category: "state-register", privilege: "mutation", domainOwnerGranted: true)')
|
121
|
+
@Mutation(returns => Boolean, { description: 'To delete StateRegister' })
|
122
|
+
async deleteStateRegister(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
|
123
|
+
const { domain, tx } = context.state
|
124
|
+
|
125
|
+
await tx.getRepository(StateRegister).delete({ domain: { id: domain.id }, id })
|
126
|
+
|
127
|
+
return true
|
128
|
+
}
|
129
|
+
|
130
|
+
@Directive('@transaction')
|
131
|
+
@Directive('@privilege(category: "state-register", privilege: "mutation", domainOwnerGranted: true)')
|
132
|
+
@Mutation(returns => Boolean, { description: 'To delete multiple StateRegisters' })
|
133
|
+
async deleteStateRegisters(
|
134
|
+
@Arg('ids', type => [String]) ids: string[],
|
135
|
+
@Ctx() context: ResolverContext
|
136
|
+
): Promise<boolean> {
|
137
|
+
const { domain, tx } = context.state
|
138
|
+
|
139
|
+
await tx.getRepository(StateRegister).delete({
|
140
|
+
domain: { id: domain.id },
|
141
|
+
id: In(ids)
|
142
|
+
})
|
143
|
+
|
144
|
+
return true
|
145
|
+
}
|
146
|
+
|
147
|
+
@Directive('@transaction')
|
148
|
+
@Directive('@privilege(category: "state-register", privilege: "mutation", domainOwnerGranted: true)')
|
149
|
+
@Mutation(returns => Boolean, { description: 'To import multiple StateRegisters' })
|
150
|
+
async importStateRegisters(
|
151
|
+
@Arg('stateRegisters', type => [StateRegisterPatch]) stateRegisters: StateRegisterPatch[],
|
152
|
+
@Ctx() context: ResolverContext
|
153
|
+
): Promise<boolean> {
|
154
|
+
const { domain, tx } = context.state
|
155
|
+
|
156
|
+
await Promise.all(
|
157
|
+
stateRegisters.map(async (stateRegister: StateRegisterPatch) => {
|
158
|
+
const createdStateRegister: StateRegister = await tx
|
159
|
+
.getRepository(StateRegister)
|
160
|
+
.save({ domain, ...stateRegister })
|
161
|
+
})
|
162
|
+
)
|
163
|
+
|
164
|
+
return true
|
165
|
+
}
|
166
|
+
}
|
@@ -0,0 +1,72 @@
|
|
1
|
+
import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
|
2
|
+
import { Domain, getQueryBuilderFromListParams, getRepository, ListParam, ScalarObject } from '@things-factory/shell'
|
3
|
+
import { User } from '@things-factory/auth-base'
|
4
|
+
import { StateRegister } from './state-register'
|
5
|
+
import { StateRegisterList } from './state-register-type'
|
6
|
+
|
7
|
+
@Resolver(StateRegister)
|
8
|
+
export class StateRegisterQuery {
|
9
|
+
@Directive('@privilege(category: "state-register", privilege: "query", domainOwnerGranted: true)')
|
10
|
+
@Query(returns => StateRegister!, { nullable: true, description: 'To fetch a StateRegister' })
|
11
|
+
async stateRegister(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<StateRegister> {
|
12
|
+
const { domain } = context.state
|
13
|
+
|
14
|
+
return await getRepository(StateRegister).findOne({
|
15
|
+
where: { domain: { id: domain.id }, id }
|
16
|
+
})
|
17
|
+
}
|
18
|
+
|
19
|
+
@Directive('@privilege(category: "state-register", privilege: "query", domainOwnerGranted: true)')
|
20
|
+
@Query(returns => StateRegister!, { nullable: true, description: 'To fetch a StateRegister by name' })
|
21
|
+
async stateRegisterByName(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<StateRegister> {
|
22
|
+
const { domain } = context.state
|
23
|
+
|
24
|
+
return await getRepository(StateRegister).findOne({
|
25
|
+
where: { domain: { id: domain.id }, name }
|
26
|
+
})
|
27
|
+
}
|
28
|
+
|
29
|
+
@Directive('@privilege(category: "state-register", privilege: "query", domainOwnerGranted: true)')
|
30
|
+
@Query(returns => StateRegisterList, { description: 'To fetch multiple StateRegisters' })
|
31
|
+
async stateRegisters(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<StateRegisterList> {
|
32
|
+
const { domain } = context.state
|
33
|
+
|
34
|
+
const queryBuilder = getQueryBuilderFromListParams({
|
35
|
+
domain,
|
36
|
+
params,
|
37
|
+
repository: await getRepository(StateRegister),
|
38
|
+
searchables: ['name', 'description']
|
39
|
+
})
|
40
|
+
|
41
|
+
const [items, total] = await queryBuilder.getManyAndCount()
|
42
|
+
|
43
|
+
return { items, total }
|
44
|
+
}
|
45
|
+
|
46
|
+
@FieldResolver(type => ScalarObject)
|
47
|
+
async state(@Root() stateRegister: StateRegister): Promise<any> {
|
48
|
+
const { state, wroteAt, ttl } = stateRegister
|
49
|
+
|
50
|
+
if (!isNaN(ttl) && Number(ttl) > 0) {
|
51
|
+
const expired = (wroteAt?.getTime() || 0) + Number(ttl) * 1000 < Date.now()
|
52
|
+
return expired ? null : state
|
53
|
+
} else {
|
54
|
+
return state
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
@FieldResolver(type => Domain)
|
59
|
+
async domain(@Root() stateRegister: StateRegister): Promise<Domain> {
|
60
|
+
return stateRegister.domainId && (await getRepository(Domain).findOneBy({ id: stateRegister.domainId }))
|
61
|
+
}
|
62
|
+
|
63
|
+
@FieldResolver(type => User)
|
64
|
+
async updater(@Root() stateRegister: StateRegister): Promise<User> {
|
65
|
+
return stateRegister.updaterId && (await getRepository(User).findOneBy({ id: stateRegister.updaterId }))
|
66
|
+
}
|
67
|
+
|
68
|
+
@FieldResolver(type => User)
|
69
|
+
async creator(@Root() stateRegister: StateRegister): Promise<User> {
|
70
|
+
return stateRegister.creatorId && (await getRepository(User).findOneBy({ id: stateRegister.creatorId }))
|
71
|
+
}
|
72
|
+
}
|
@@ -0,0 +1,64 @@
|
|
1
|
+
import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'
|
2
|
+
import GraphQLUpload from 'graphql-upload/GraphQLUpload.js'
|
3
|
+
import { ObjectType, Field, InputType, Int, ID, registerEnumType } from 'type-graphql'
|
4
|
+
|
5
|
+
import { ObjectRef, ScalarObject } from '@things-factory/shell'
|
6
|
+
|
7
|
+
import { StateRegister } from './state-register'
|
8
|
+
|
9
|
+
@InputType()
|
10
|
+
export class NewStateRegister {
|
11
|
+
@Field()
|
12
|
+
name: string
|
13
|
+
|
14
|
+
@Field({ nullable: true })
|
15
|
+
description?: string
|
16
|
+
|
17
|
+
@Field({ nullable: true })
|
18
|
+
type?: string
|
19
|
+
|
20
|
+
@Field(type => ScalarObject, { nullable: true })
|
21
|
+
state?: any
|
22
|
+
|
23
|
+
@Field(type => Int, { nullable: true })
|
24
|
+
ttl?: number
|
25
|
+
|
26
|
+
@Field({ nullable: true })
|
27
|
+
refBy?: string
|
28
|
+
}
|
29
|
+
|
30
|
+
@InputType()
|
31
|
+
export class StateRegisterPatch {
|
32
|
+
@Field(type => ID, { nullable: true })
|
33
|
+
id?: string
|
34
|
+
|
35
|
+
@Field({ nullable: true })
|
36
|
+
name?: string
|
37
|
+
|
38
|
+
@Field({ nullable: true })
|
39
|
+
description?: string
|
40
|
+
|
41
|
+
@Field({ nullable: true })
|
42
|
+
type?: string
|
43
|
+
|
44
|
+
@Field(type => ScalarObject, { nullable: true })
|
45
|
+
state?: any
|
46
|
+
|
47
|
+
@Field(type => Int, { nullable: true })
|
48
|
+
ttl?: number
|
49
|
+
|
50
|
+
@Field({ nullable: true })
|
51
|
+
refBy?: string
|
52
|
+
|
53
|
+
@Field({ nullable: true })
|
54
|
+
cuFlag?: string
|
55
|
+
}
|
56
|
+
|
57
|
+
@ObjectType()
|
58
|
+
export class StateRegisterList {
|
59
|
+
@Field(type => [StateRegister])
|
60
|
+
items: StateRegister[]
|
61
|
+
|
62
|
+
@Field(type => Int)
|
63
|
+
total: number
|
64
|
+
}
|
@@ -0,0 +1,91 @@
|
|
1
|
+
import {
|
2
|
+
CreateDateColumn,
|
3
|
+
UpdateDateColumn,
|
4
|
+
DeleteDateColumn,
|
5
|
+
Entity,
|
6
|
+
Index,
|
7
|
+
Column,
|
8
|
+
RelationId,
|
9
|
+
ManyToOne,
|
10
|
+
PrimaryGeneratedColumn,
|
11
|
+
VersionColumn
|
12
|
+
} from 'typeorm'
|
13
|
+
import { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'
|
14
|
+
|
15
|
+
import { Domain, ScalarObject } from '@things-factory/shell'
|
16
|
+
import { User } from '@things-factory/auth-base'
|
17
|
+
|
18
|
+
@Entity()
|
19
|
+
@Index('ix_state_register_0', (stateRegister: StateRegister) => [stateRegister.domain, stateRegister.name], {
|
20
|
+
unique: true
|
21
|
+
})
|
22
|
+
@ObjectType({ description: 'Entity for StateRegister' })
|
23
|
+
export class StateRegister {
|
24
|
+
@PrimaryGeneratedColumn('uuid')
|
25
|
+
@Field(type => ID)
|
26
|
+
readonly id: string
|
27
|
+
|
28
|
+
@ManyToOne(type => Domain)
|
29
|
+
@Field({ nullable: true })
|
30
|
+
domain?: Domain
|
31
|
+
|
32
|
+
@RelationId((stateRegister: StateRegister) => stateRegister.domain)
|
33
|
+
domainId?: string
|
34
|
+
|
35
|
+
@Column()
|
36
|
+
@Field({ nullable: true })
|
37
|
+
name?: string
|
38
|
+
|
39
|
+
@Column({ nullable: true })
|
40
|
+
@Field({ nullable: true })
|
41
|
+
description?: string
|
42
|
+
|
43
|
+
@Column({ nullable: true })
|
44
|
+
@Field({ nullable: true })
|
45
|
+
type?: string
|
46
|
+
|
47
|
+
@Column('simple-json', { nullable: true, default: null })
|
48
|
+
@Field(type => ScalarObject, { nullable: true })
|
49
|
+
state?: any
|
50
|
+
|
51
|
+
@Column({ nullable: true, default: null })
|
52
|
+
@Field(type => Int, { nullable: true })
|
53
|
+
ttl?: number
|
54
|
+
|
55
|
+
@Column({ nullable: true })
|
56
|
+
@Field({ nullable: true })
|
57
|
+
refBy?: string
|
58
|
+
|
59
|
+
@Column({ nullable: true })
|
60
|
+
@Field({ nullable: true })
|
61
|
+
wroteAt?: Date
|
62
|
+
|
63
|
+
@CreateDateColumn()
|
64
|
+
@Field({ nullable: true })
|
65
|
+
createdAt?: Date
|
66
|
+
|
67
|
+
@UpdateDateColumn()
|
68
|
+
@Field({ nullable: true })
|
69
|
+
updatedAt?: Date
|
70
|
+
|
71
|
+
@ManyToOne(type => User, { nullable: true })
|
72
|
+
@Field(type => User, { nullable: true })
|
73
|
+
writer?: User
|
74
|
+
|
75
|
+
@RelationId((stateRegister: StateRegister) => stateRegister.writer)
|
76
|
+
writerId?: string
|
77
|
+
|
78
|
+
@ManyToOne(type => User, { nullable: true })
|
79
|
+
@Field(type => User, { nullable: true })
|
80
|
+
creator?: User
|
81
|
+
|
82
|
+
@RelationId((stateRegister: StateRegister) => stateRegister.creator)
|
83
|
+
creatorId?: string
|
84
|
+
|
85
|
+
@ManyToOne(type => User, { nullable: true })
|
86
|
+
@Field(type => User, { nullable: true })
|
87
|
+
updater?: User
|
88
|
+
|
89
|
+
@RelationId((stateRegister: StateRegister) => stateRegister.updater)
|
90
|
+
updaterId?: string
|
91
|
+
}
|