@things-factory/integration-base 6.2.34 → 6.2.37

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 (66) hide show
  1. package/dist-server/engine/task/index.js +2 -0
  2. package/dist-server/engine/task/index.js.map +1 -1
  3. package/dist-server/engine/task/local-graphql-mutate.js +7 -2
  4. package/dist-server/engine/task/local-graphql-mutate.js.map +1 -1
  5. package/dist-server/engine/task/local-graphql-query.js +7 -2
  6. package/dist-server/engine/task/local-graphql-query.js.map +1 -1
  7. package/dist-server/engine/task/state-read.js +49 -0
  8. package/dist-server/engine/task/state-read.js.map +1 -0
  9. package/dist-server/engine/task/state-write.js +57 -0
  10. package/dist-server/engine/task/state-write.js.map +1 -0
  11. package/dist-server/service/index.js +6 -2
  12. package/dist-server/service/index.js.map +1 -1
  13. package/dist-server/service/scenario-instance/scenario-instance-mutation.js +3 -1
  14. package/dist-server/service/scenario-instance/scenario-instance-mutation.js.map +1 -1
  15. package/dist-server/service/scenario-instance/scenario-instance-type.js +2 -1
  16. package/dist-server/service/scenario-instance/scenario-instance-type.js.map +1 -1
  17. package/dist-server/service/state-register/index.js +10 -0
  18. package/dist-server/service/state-register/index.js.map +1 -0
  19. package/dist-server/service/state-register/state-register-mutation.js +153 -0
  20. package/dist-server/service/state-register/state-register-mutation.js.map +1 -0
  21. package/dist-server/service/state-register/state-register-query.js +123 -0
  22. package/dist-server/service/state-register/state-register-query.js.map +1 -0
  23. package/dist-server/service/state-register/state-register-type.js +90 -0
  24. package/dist-server/service/state-register/state-register-type.js.map +1 -0
  25. package/dist-server/service/state-register/state-register.js +105 -0
  26. package/dist-server/service/state-register/state-register.js.map +1 -0
  27. package/dist-server/tsconfig.tsbuildinfo +1 -1
  28. package/helps/integration/concept/scenario.ja.md +4 -0
  29. package/helps/integration/concept/scenario.ko.md +4 -0
  30. package/helps/integration/concept/scenario.md +3 -3
  31. package/helps/integration/concept/scenario.ms.md +4 -0
  32. package/helps/integration/concept/scenario.zh.md +4 -0
  33. package/helps/integration/concept/state-register.ja.md +8 -0
  34. package/helps/integration/concept/state-register.ko.md +8 -0
  35. package/helps/integration/concept/state-register.md +8 -0
  36. package/helps/integration/concept/state-register.ms.md +8 -0
  37. package/helps/integration/concept/state-register.zh.md +8 -0
  38. package/helps/integration/concept/task.ja.md +25 -0
  39. package/helps/integration/concept/task.ko.md +25 -0
  40. package/helps/integration/concept/task.md +17 -17
  41. package/helps/integration/concept/task.ms.md +28 -0
  42. package/helps/integration/concept/task.zh.md +25 -0
  43. package/helps/integration/task/state-read.ja.md +8 -0
  44. package/helps/integration/task/state-read.ko.md +8 -0
  45. package/helps/integration/task/state-read.md +8 -0
  46. package/helps/integration/task/state-read.ms.md +8 -0
  47. package/helps/integration/task/state-read.zh.md +8 -0
  48. package/helps/integration/task/state-write.ja.md +10 -0
  49. package/helps/integration/task/state-write.ko.md +10 -0
  50. package/helps/integration/task/state-write.md +10 -0
  51. package/helps/integration/task/state-write.ms.md +10 -0
  52. package/helps/integration/task/state-write.zh.md +10 -0
  53. package/package.json +2 -2
  54. package/server/engine/task/index.ts +2 -0
  55. package/server/engine/task/local-graphql-mutate.ts +8 -2
  56. package/server/engine/task/local-graphql-query.ts +8 -2
  57. package/server/engine/task/state-read.ts +54 -0
  58. package/server/engine/task/state-write.ts +63 -0
  59. package/server/service/index.ts +6 -2
  60. package/server/service/scenario-instance/scenario-instance-mutation.ts +3 -1
  61. package/server/service/scenario-instance/scenario-instance-type.ts +2 -1
  62. package/server/service/state-register/index.ts +7 -0
  63. package/server/service/state-register/state-register-mutation.ts +166 -0
  64. package/server/service/state-register/state-register-query.ts +77 -0
  65. package/server/service/state-register/state-register-type.ts +64 -0
  66. 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 = null, 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,77 @@
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 writer(@Root() stateRegister: StateRegister): Promise<User> {
65
+ return stateRegister.writerId && (await getRepository(User).findOneBy({ id: stateRegister.writerId }))
66
+ }
67
+
68
+ @FieldResolver(type => User)
69
+ async updater(@Root() stateRegister: StateRegister): Promise<User> {
70
+ return stateRegister.updaterId && (await getRepository(User).findOneBy({ id: stateRegister.updaterId }))
71
+ }
72
+
73
+ @FieldResolver(type => User)
74
+ async creator(@Root() stateRegister: StateRegister): Promise<User> {
75
+ return stateRegister.creatorId && (await getRepository(User).findOneBy({ id: stateRegister.creatorId }))
76
+ }
77
+ }
@@ -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
+ }