@things-factory/dataset 8.0.0-beta.9 → 8.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (134) hide show
  1. package/client/activities/activity-data-collect-edit.ts +105 -0
  2. package/client/activities/activity-data-collect-view.ts +91 -0
  3. package/client/activities/activity-data-review-edit.ts +278 -0
  4. package/client/activities/activity-data-review-view.ts +226 -0
  5. package/client/activities/activity-ooc-resolve-edit.ts +195 -0
  6. package/client/activities/activity-ooc-resolve-view.ts +143 -0
  7. package/client/activities/activity-ooc-review-edit.ts +173 -0
  8. package/client/activities/activity-ooc-review-view.ts +129 -0
  9. package/client/bootstrap.ts +35 -0
  10. package/client/components/data-entry-form.ts +109 -0
  11. package/client/index.ts +1 -0
  12. package/client/pages/data-archive/data-archive-list-page.ts +277 -0
  13. package/client/pages/data-archive/data-archive-request-popup.ts +177 -0
  14. package/client/pages/data-entry/data-entry-list-page.ts +464 -0
  15. package/client/pages/data-key-set/data-key-item-list.ts +183 -0
  16. package/client/pages/data-key-set/data-key-set-importer.ts +89 -0
  17. package/client/pages/data-key-set/data-key-set-list-page.ts +413 -0
  18. package/client/pages/data-ooc/data-ooc-list-page.ts +549 -0
  19. package/client/pages/data-ooc/data-ooc-page.ts +164 -0
  20. package/client/pages/data-ooc/data-ooc-view.ts +236 -0
  21. package/client/pages/data-ooc/data-oocs-page.ts +200 -0
  22. package/client/pages/data-report/data-report-embed-page.ts +108 -0
  23. package/client/pages/data-report/data-report-list-page.ts +454 -0
  24. package/client/pages/data-report/data-report-samples-page.ts +174 -0
  25. package/client/pages/data-report/jasper-report-oocs-page.ts +110 -0
  26. package/client/pages/data-report/jasper-report-samples-crosstab-page.ts +110 -0
  27. package/client/pages/data-report/jasper-report-samples-page.ts +110 -0
  28. package/client/pages/data-sample/data-sample-list-page.ts +442 -0
  29. package/client/pages/data-sample/data-sample-page.ts +55 -0
  30. package/client/pages/data-sample/data-sample-search-page.ts +424 -0
  31. package/client/pages/data-sample/data-sample-view.ts +292 -0
  32. package/client/pages/data-sample/data-samples-page.ts +249 -0
  33. package/client/pages/data-sensor/data-sensor-list-page.ts +456 -0
  34. package/client/pages/data-set/data-item-list.ts +304 -0
  35. package/client/pages/data-set/data-set-importer.ts +89 -0
  36. package/client/pages/data-set/data-set-list-page.ts +1078 -0
  37. package/client/pages/data-summary/data-summary-list-page.ts +363 -0
  38. package/client/pages/data-summary/data-summary-period-page.ts +439 -0
  39. package/client/pages/data-summary/data-summary-search-page.ts +426 -0
  40. package/client/pages/data-summary/data-summary-view.ts +133 -0
  41. package/client/route.ts +91 -0
  42. package/client/tsconfig.json +13 -0
  43. package/dist-client/activities/activity-data-review-edit.js +19 -10
  44. package/dist-client/activities/activity-data-review-edit.js.map +1 -1
  45. package/dist-client/activities/activity-data-review-view.js +80 -0
  46. package/dist-client/activities/activity-data-review-view.js.map +1 -1
  47. package/dist-client/pages/data-entry/data-entry-list-page.js +2 -2
  48. package/dist-client/pages/data-entry/data-entry-list-page.js.map +1 -1
  49. package/dist-client/tsconfig.tsbuildinfo +1 -1
  50. package/dist-server/controllers/create-data-ooc.js +2 -0
  51. package/dist-server/controllers/create-data-ooc.js.map +1 -1
  52. package/dist-server/service/data-archive/index.d.ts +1 -1
  53. package/dist-server/service/data-ooc/index.d.ts +1 -1
  54. package/dist-server/service/data-sample/data-sample-query.d.ts +1 -1
  55. package/dist-server/service/data-sample/data-sample-query.js +3 -3
  56. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  57. package/dist-server/service/data-sample/index.d.ts +1 -1
  58. package/dist-server/service/data-set/index.d.ts +1 -1
  59. package/dist-server/service/index.d.ts +2 -2
  60. package/dist-server/tsconfig.tsbuildinfo +1 -1
  61. package/package.json +26 -26
  62. package/server/activities/activity-data-collect.ts +100 -0
  63. package/server/activities/activity-data-review.ts +109 -0
  64. package/server/activities/activity-ooc-resolve.ts +123 -0
  65. package/server/activities/activity-ooc-review.ts +95 -0
  66. package/server/activities/index.ts +11 -0
  67. package/server/controllers/create-data-ooc.ts +80 -0
  68. package/server/controllers/create-data-sample.ts +323 -0
  69. package/server/controllers/data-use-case.ts +98 -0
  70. package/server/controllers/finalize-data-collection.ts +388 -0
  71. package/server/controllers/index.ts +6 -0
  72. package/server/controllers/issue-data-collection-task.ts +70 -0
  73. package/server/controllers/issue-ooc-resolve.ts +58 -0
  74. package/server/controllers/issue-ooc-review.ts +52 -0
  75. package/server/controllers/jasper-report.ts +186 -0
  76. package/server/controllers/query-data-summary-by-period.ts +178 -0
  77. package/server/controllers/shiny-report.ts +54 -0
  78. package/server/engine/index.ts +1 -0
  79. package/server/engine/task/create-data-sample.ts +100 -0
  80. package/server/engine/task/index.ts +2 -0
  81. package/server/engine/task/issue-collect-data.ts +45 -0
  82. package/server/index.ts +8 -0
  83. package/server/routes.ts +188 -0
  84. package/server/service/data-archive/data-archive-mutation.ts +273 -0
  85. package/server/service/data-archive/data-archive-query.ts +58 -0
  86. package/server/service/data-archive/data-archive-type.ts +48 -0
  87. package/server/service/data-archive/data-archive.ts +69 -0
  88. package/server/service/data-archive/index.ts +6 -0
  89. package/server/service/data-key-set/data-key-item-type.ts +31 -0
  90. package/server/service/data-key-set/data-key-set-mutation.ts +201 -0
  91. package/server/service/data-key-set/data-key-set-query.ts +68 -0
  92. package/server/service/data-key-set/data-key-set-type.ts +70 -0
  93. package/server/service/data-key-set/data-key-set.ts +86 -0
  94. package/server/service/data-key-set/index.ts +6 -0
  95. package/server/service/data-ooc/data-ooc-mutation.ts +154 -0
  96. package/server/service/data-ooc/data-ooc-query.ts +106 -0
  97. package/server/service/data-ooc/data-ooc-subscription.ts +48 -0
  98. package/server/service/data-ooc/data-ooc-type.ts +71 -0
  99. package/server/service/data-ooc/data-ooc.ts +259 -0
  100. package/server/service/data-ooc/index.ts +7 -0
  101. package/server/service/data-sample/data-sample-mutation.ts +18 -0
  102. package/server/service/data-sample/data-sample-query.ts +215 -0
  103. package/server/service/data-sample/data-sample-type.ts +47 -0
  104. package/server/service/data-sample/data-sample.ts +193 -0
  105. package/server/service/data-sample/index.ts +6 -0
  106. package/server/service/data-sensor/data-sensor-mutation.ts +116 -0
  107. package/server/service/data-sensor/data-sensor-query.ts +76 -0
  108. package/server/service/data-sensor/data-sensor-type.ts +104 -0
  109. package/server/service/data-sensor/data-sensor.ts +126 -0
  110. package/server/service/data-sensor/index.ts +6 -0
  111. package/server/service/data-set/data-item-type.ts +155 -0
  112. package/server/service/data-set/data-set-mutation.ts +552 -0
  113. package/server/service/data-set/data-set-query.ts +461 -0
  114. package/server/service/data-set/data-set-type.ts +204 -0
  115. package/server/service/data-set/data-set.ts +326 -0
  116. package/server/service/data-set/index.ts +6 -0
  117. package/server/service/data-set-history/data-set-history-query.ts +126 -0
  118. package/server/service/data-set-history/data-set-history-type.ts +12 -0
  119. package/server/service/data-set-history/data-set-history.ts +217 -0
  120. package/server/service/data-set-history/event-subscriber.ts +17 -0
  121. package/server/service/data-set-history/index.ts +7 -0
  122. package/server/service/data-spec/data-spec-manager.ts +21 -0
  123. package/server/service/data-spec/data-spec-query.ts +21 -0
  124. package/server/service/data-spec/data-spec.ts +45 -0
  125. package/server/service/data-spec/index.ts +5 -0
  126. package/server/service/data-summary/data-summary-mutation.ts +45 -0
  127. package/server/service/data-summary/data-summary-query.ts +179 -0
  128. package/server/service/data-summary/data-summary-type.ts +86 -0
  129. package/server/service/data-summary/data-summary.ts +170 -0
  130. package/server/service/data-summary/index.ts +7 -0
  131. package/server/service/index.ts +57 -0
  132. package/server/tsconfig.json +10 -0
  133. package/server/utils/config-resolver.ts +29 -0
  134. package/server/utils/index.ts +1 -0
@@ -0,0 +1,201 @@
1
+ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
+ import { In } from 'typeorm'
3
+
4
+ import { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'
5
+
6
+ import { DataKeySet } from './data-key-set'
7
+ import { DataKeySetPatch, NewDataKeySet } from './data-key-set-type'
8
+
9
+ @Resolver(DataKeySet)
10
+ export class DataKeySetMutation {
11
+ @Directive('@transaction')
12
+ @Mutation(returns => DataKeySet, { description: 'To create new DataKeySet' })
13
+ async createDataKeySet(
14
+ @Arg('dataKeySet') dataKeySet: NewDataKeySet,
15
+ @Ctx() context: ResolverContext
16
+ ): Promise<DataKeySet> {
17
+ const { domain, user, tx } = context.state
18
+
19
+ const result = await tx.getRepository(DataKeySet).save({
20
+ ...dataKeySet,
21
+ domain,
22
+ creator: user,
23
+ updater: user
24
+ })
25
+
26
+ if (dataKeySet.thumbnail) {
27
+ await createAttachment(
28
+ null,
29
+ {
30
+ attachment: {
31
+ file: dataKeySet.thumbnail,
32
+ refType: DataKeySet.name,
33
+ refBy: result.id
34
+ }
35
+ },
36
+ context
37
+ )
38
+ }
39
+
40
+ return result
41
+ }
42
+
43
+ @Directive('@transaction')
44
+ @Mutation(returns => DataKeySet, { description: 'To modify DataKeySet information' })
45
+ async updateDataKeySet(
46
+ @Arg('id') id: string,
47
+ @Arg('patch') patch: DataKeySetPatch,
48
+ @Ctx() context: ResolverContext
49
+ ): Promise<DataKeySet> {
50
+ const { domain, user, tx } = context.state
51
+
52
+ const repository = tx.getRepository(DataKeySet)
53
+ const dataKeySet = await repository.findOne({
54
+ where: { domain: { id: domain.id }, id }
55
+ })
56
+
57
+ const result = await repository.save({
58
+ ...dataKeySet,
59
+ ...patch,
60
+ updater: user
61
+ })
62
+
63
+ if (patch.thumbnail) {
64
+ await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)
65
+ await createAttachment(
66
+ null,
67
+ {
68
+ attachment: {
69
+ file: patch.thumbnail,
70
+ refType: DataKeySet.name,
71
+ refBy: result.id
72
+ }
73
+ },
74
+ context
75
+ )
76
+ }
77
+
78
+ return result
79
+ }
80
+
81
+ @Directive('@transaction')
82
+ @Mutation(returns => [DataKeySet], { description: "To modify multiple DataKeySets' information" })
83
+ async updateMultipleDataKeySet(
84
+ @Arg('patches', type => [DataKeySetPatch]) patches: DataKeySetPatch[],
85
+ @Ctx() context: ResolverContext
86
+ ): Promise<DataKeySet[]> {
87
+ const { domain, user, tx } = context.state
88
+
89
+ let results = []
90
+ const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
91
+ const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
92
+ const dataKeySetRepo = tx.getRepository(DataKeySet)
93
+
94
+ if (_createRecords.length > 0) {
95
+ for (let i = 0; i < _createRecords.length; i++) {
96
+ const newRecord = _createRecords[i]
97
+
98
+ const result = await dataKeySetRepo.save({
99
+ ...newRecord,
100
+ domain,
101
+ creator: user,
102
+ updater: user
103
+ })
104
+
105
+ if (newRecord.thumbnail) {
106
+ await createAttachment(
107
+ null,
108
+ {
109
+ attachment: {
110
+ file: newRecord.thumbnail,
111
+ refType: DataKeySet.name,
112
+ refBy: result.id
113
+ }
114
+ },
115
+ context
116
+ )
117
+ }
118
+
119
+ results.push({ ...result, cuFlag: '+' })
120
+ }
121
+ }
122
+
123
+ if (_updateRecords.length > 0) {
124
+ for (let i = 0; i < _updateRecords.length; i++) {
125
+ const updateRecord = _updateRecords[i]
126
+ const dataKeySet = await dataKeySetRepo.findOneBy({ id: updateRecord.id })
127
+
128
+ const result = await dataKeySetRepo.save({
129
+ ...dataKeySet,
130
+ ...updateRecord,
131
+ updater: user
132
+ })
133
+
134
+ if (updateRecord.thumbnail) {
135
+ await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)
136
+ await createAttachment(
137
+ null,
138
+ {
139
+ attachment: {
140
+ file: updateRecord.thumbnail,
141
+ refType: DataKeySet.name,
142
+ refBy: result.id
143
+ }
144
+ },
145
+ context
146
+ )
147
+ }
148
+
149
+ results.push({ ...result, cuFlag: 'M' })
150
+ }
151
+ }
152
+
153
+ return results
154
+ }
155
+
156
+ @Directive('@transaction')
157
+ @Mutation(returns => Boolean, { description: 'To delete DataKeySet' })
158
+ async deleteDataKeySet(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
159
+ const { domain, tx } = context.state
160
+
161
+ await tx.getRepository(DataKeySet).delete({ domain: { id: domain.id }, id })
162
+ await deleteAttachmentsByRef(null, { refBys: [id] }, context)
163
+
164
+ return true
165
+ }
166
+
167
+ @Directive('@transaction')
168
+ @Mutation(returns => Boolean, { description: 'To delete multiple DataKeySets' })
169
+ async deleteDataKeySets(
170
+ @Arg('ids', type => [String]) ids: string[],
171
+ @Ctx() context: ResolverContext
172
+ ): Promise<boolean> {
173
+ const { domain, tx } = context.state
174
+
175
+ await tx.getRepository(DataKeySet).delete({
176
+ domain: { id: domain.id },
177
+ id: In(ids)
178
+ })
179
+
180
+ await deleteAttachmentsByRef(null, { refBys: ids }, context)
181
+
182
+ return true
183
+ }
184
+
185
+ @Directive('@transaction')
186
+ @Mutation(returns => Boolean, { description: 'To import multiple DataKeySets' })
187
+ async importDataKeySets(
188
+ @Arg('dataKeySets', type => [DataKeySetPatch]) dataKeySets: DataKeySetPatch[],
189
+ @Ctx() context: ResolverContext
190
+ ): Promise<boolean> {
191
+ const { domain, tx } = context.state
192
+
193
+ await Promise.all(
194
+ dataKeySets.map(async (dataKeySet: DataKeySetPatch) => {
195
+ const createdDataKeySet: DataKeySet = await tx.getRepository(DataKeySet).save({ domain, ...dataKeySet })
196
+ })
197
+ )
198
+
199
+ return true
200
+ }
201
+ }
@@ -0,0 +1,68 @@
1
+ import { In } from 'typeorm'
2
+ import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
3
+
4
+ import { Attachment } from '@things-factory/attachment-base'
5
+ import { User } from '@things-factory/auth-base'
6
+ import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
7
+
8
+ import { DataKeySet } from './data-key-set'
9
+ import { DataKeySetList } from './data-key-set-type'
10
+
11
+ @Resolver(DataKeySet)
12
+ export class DataKeySetQuery {
13
+ @Query(returns => DataKeySet!, { nullable: true, description: 'To fetch a DataKeySet' })
14
+ async dataKeySet(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataKeySet> {
15
+ const { domain } = context.state
16
+
17
+ return await getRepository(DataKeySet).findOne({
18
+ where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id }
19
+ })
20
+ }
21
+
22
+ @Query(returns => DataKeySetList, { description: 'To fetch multiple DataKeySets' })
23
+ async dataKeySets(
24
+ @Args(type => ListParam) params: ListParam,
25
+ @Ctx() context: ResolverContext
26
+ ): Promise<DataKeySetList> {
27
+ const { domain } = context.state
28
+
29
+ const queryBuilder = getQueryBuilderFromListParams({
30
+ domain,
31
+ params,
32
+ repository: await getRepository(DataKeySet),
33
+ searchables: ['name', 'description']
34
+ })
35
+
36
+ const [items, total] = await queryBuilder.getManyAndCount()
37
+
38
+ return { items, total }
39
+ }
40
+
41
+ @FieldResolver(type => String)
42
+ async thumbnail(@Root() dataKeySet: DataKeySet): Promise<string | undefined> {
43
+ const attachment: Attachment = await getRepository(Attachment).findOne({
44
+ where: {
45
+ domain: { id: dataKeySet.domainId },
46
+ refType: DataKeySet.name,
47
+ refBy: dataKeySet.id
48
+ }
49
+ })
50
+
51
+ return attachment?.fullpath
52
+ }
53
+
54
+ @FieldResolver(type => Domain)
55
+ async domain(@Root() dataKeySet: DataKeySet): Promise<Domain> {
56
+ return dataKeySet.domainId && (await getRepository(Domain).findOneBy({ id: dataKeySet.domainId }))
57
+ }
58
+
59
+ @FieldResolver(type => User)
60
+ async updater(@Root() dataKeySet: DataKeySet): Promise<User> {
61
+ return dataKeySet.updaterId && (await getRepository(User).findOneBy({ id: dataKeySet.updaterId }))
62
+ }
63
+
64
+ @FieldResolver(type => User)
65
+ async creator(@Root() dataKeySet: DataKeySet): Promise<User> {
66
+ return dataKeySet.creatorId && (await getRepository(User).findOneBy({ id: dataKeySet.creatorId }))
67
+ }
68
+ }
@@ -0,0 +1,70 @@
1
+ import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'
2
+ import GraphQLUpload from 'graphql-upload/GraphQLUpload.js'
3
+ import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
4
+
5
+ import { DataKeyItemPatch } from './data-key-item-type'
6
+ import { DataKeySet } from './data-key-set'
7
+ import { DataSetReportType } from '../data-set/data-set'
8
+
9
+ @InputType()
10
+ export class NewDataKeySet {
11
+ @Field()
12
+ name: string
13
+
14
+ @Field({ nullable: true })
15
+ description?: string
16
+
17
+ @Field({ nullable: true })
18
+ active?: boolean
19
+
20
+ @Field({ nullable: true })
21
+ reportType?: DataSetReportType
22
+
23
+ @Field({ nullable: true })
24
+ reportView?: string
25
+
26
+ @Field(type => [DataKeyItemPatch], { nullable: true })
27
+ dataKeyItems?: DataKeyItemPatch[]
28
+
29
+ @Field(type => GraphQLUpload, { nullable: true })
30
+ thumbnail?: FileUpload
31
+ }
32
+
33
+ @InputType()
34
+ export class DataKeySetPatch {
35
+ @Field(type => ID, { nullable: true })
36
+ id?: string
37
+
38
+ @Field({ nullable: true })
39
+ name?: string
40
+
41
+ @Field({ nullable: true })
42
+ description?: string
43
+
44
+ @Field({ nullable: true })
45
+ active?: boolean
46
+
47
+ @Field({ nullable: true })
48
+ reportType?: DataSetReportType
49
+
50
+ @Field({ nullable: true })
51
+ reportView?: string
52
+
53
+ @Field(type => [DataKeyItemPatch], { nullable: true })
54
+ dataKeyItems?: DataKeyItemPatch[]
55
+
56
+ @Field(type => GraphQLUpload, { nullable: true })
57
+ thumbnail?: FileUpload
58
+
59
+ @Field({ nullable: true })
60
+ cuFlag?: string
61
+ }
62
+
63
+ @ObjectType()
64
+ export class DataKeySetList {
65
+ @Field(type => [DataKeySet])
66
+ items: DataKeySet[]
67
+
68
+ @Field(type => Int)
69
+ total: number
70
+ }
@@ -0,0 +1,86 @@
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 } from '@things-factory/shell'
15
+
16
+ import { DataKeyItem } from './data-key-item-type'
17
+ import { DataSetReportType } from '../data-set/data-set'
18
+
19
+ @Entity()
20
+ @Index('ix_data_key_set_0', (dataKeySet: DataKeySet) => [dataKeySet.domain, dataKeySet.name], { unique: true })
21
+ @ObjectType({ description: 'Entity for DataKeySet' })
22
+ export class DataKeySet {
23
+ @PrimaryGeneratedColumn('uuid')
24
+ @Field(type => ID)
25
+ readonly id: string
26
+
27
+ @ManyToOne(type => Domain)
28
+ @Field(type => Domain)
29
+ domain?: Domain
30
+
31
+ @RelationId((dataKeySet: DataKeySet) => dataKeySet.domain)
32
+ domainId?: string
33
+
34
+ @Column()
35
+ @Field()
36
+ name: string
37
+
38
+ @Column({
39
+ nullable: true
40
+ })
41
+ @Field({ nullable: true })
42
+ description?: string
43
+
44
+ @Column({
45
+ nullable: true
46
+ })
47
+ @Field({ nullable: true })
48
+ active?: boolean
49
+
50
+ @Column({ nullable: true })
51
+ @Field({ nullable: true })
52
+ reportType?: DataSetReportType
53
+
54
+ @Column({ nullable: true })
55
+ @Field({ nullable: true })
56
+ reportView?: string
57
+
58
+ @Column('simple-json', { nullable: true })
59
+ @Field(type => [DataKeyItem], { nullable: true })
60
+ dataKeyItems: DataKeyItem[]
61
+
62
+ @CreateDateColumn()
63
+ @Field({ nullable: true })
64
+ createdAt?: Date
65
+
66
+ @UpdateDateColumn()
67
+ @Field({ nullable: true })
68
+ updatedAt?: Date
69
+
70
+ @ManyToOne(type => User, { nullable: true })
71
+ @Field(type => User, { nullable: true })
72
+ creator?: User
73
+
74
+ @RelationId((dataKeySet: DataKeySet) => dataKeySet.creator)
75
+ creatorId?: string
76
+
77
+ @ManyToOne(type => User, { nullable: true })
78
+ @Field(type => User, { nullable: true })
79
+ updater?: User
80
+
81
+ @RelationId((dataKeySet: DataKeySet) => dataKeySet.updater)
82
+ updaterId?: string
83
+
84
+ @Field(type => String, { nullable: true })
85
+ thumbnail?: string
86
+ }
@@ -0,0 +1,6 @@
1
+ import { DataKeySet } from './data-key-set'
2
+ import { DataKeySetQuery } from './data-key-set-query'
3
+ import { DataKeySetMutation } from './data-key-set-mutation'
4
+
5
+ export const entities = [DataKeySet]
6
+ export const resolvers = [DataKeySetQuery, DataKeySetMutation]
@@ -0,0 +1,154 @@
1
+ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
+
3
+ import { DataOoc, DataOocStatus } from './data-ooc'
4
+ import { DataOocPatch, NewDataOoc } from './data-ooc-type'
5
+
6
+ @Resolver(DataOoc)
7
+ export class DataOocMutation {
8
+ @Directive('@privilege(category: "data-ooc", privilege: "mutation", domainOwnerGranted: true)')
9
+ @Directive('@transaction')
10
+ @Mutation(returns => DataOoc, { description: 'To create new DataOoc' })
11
+ async createDataOoc(@Arg('dataOoc') dataOoc: NewDataOoc, @Ctx() context: ResolverContext): Promise<DataOoc> {
12
+ const { domain, user, tx } = context.state
13
+
14
+ const state = dataOoc.state || DataOocStatus.ISSUED
15
+ const history = [
16
+ {
17
+ user: {
18
+ id: user.id,
19
+ name: user.name
20
+ },
21
+ state,
22
+ timestamp: Date.now()
23
+ }
24
+ ]
25
+
26
+ return await tx.getRepository(DataOoc).save({
27
+ ...dataOoc,
28
+ state,
29
+ domain,
30
+ history,
31
+ creator: user,
32
+ updater: user
33
+ })
34
+ }
35
+
36
+ @Directive('@privilege(category: "data-ooc", privilege: "mutation", domainOwnerGranted: true)')
37
+ @Directive('@transaction')
38
+ @Mutation(returns => DataOoc, { description: 'To modify DataOoc information' })
39
+ async updateDataOoc(
40
+ @Arg('id') id: string,
41
+ @Arg('patch') patch: DataOocPatch,
42
+ @Ctx() context: ResolverContext
43
+ ): Promise<DataOoc> {
44
+ const { domain, user, tx } = context.state
45
+
46
+ const repository = tx.getRepository(DataOoc)
47
+ const dataOoc = await repository.findOne({
48
+ where: { domain: { id: domain.id }, id }
49
+ })
50
+
51
+ const state = patch.state || dataOoc.state
52
+
53
+ const history = dataOoc.history || []
54
+ history.push({
55
+ user: {
56
+ id: user.id,
57
+ name: user.name
58
+ },
59
+ state,
60
+ comment: patch.correctiveAction || '',
61
+ timestamp: Date.now()
62
+ })
63
+
64
+ const more = {} as any
65
+
66
+ if (dataOoc.state !== patch.state) {
67
+ if (patch.state === DataOocStatus.CORRECTED) {
68
+ more.corrector = user
69
+ } else {
70
+ more.corrector = null
71
+ }
72
+ }
73
+
74
+ return await repository.save({
75
+ ...dataOoc,
76
+ ...patch,
77
+ ...more,
78
+ state,
79
+ history,
80
+ updater: user
81
+ })
82
+ }
83
+
84
+ // @Directive('@privilege(category: "data-ooc", privilege: "mutation", domainOwnerGranted: true)')
85
+ // @Directive('@transaction')
86
+ // @Mutation(returns => [DataOoc], { description: "To modify multiple DataOoc' information" })
87
+ // async updateMultipleDataOoc(
88
+ // @Arg('patches', type => [DataOocPatch]) patches: DataOocPatch[],
89
+ // @Ctx() context: ResolverContext
90
+ // ): Promise<DataOoc[]> {
91
+ // const { domain, user, tx } = context.state
92
+
93
+ // let results = []
94
+ // const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
95
+ // const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
96
+ // const dataOocRepo = tx.getRepository(DataOoc)
97
+
98
+ // if (_createRecords.length > 0) {
99
+ // for (let i = 0; i < _createRecords.length; i++) {
100
+ // const newRecord = _createRecords[i]
101
+
102
+ // const result = await dataOocRepo.save({
103
+ // ...newRecord,
104
+ // domain,
105
+ // creator: user,
106
+ // updater: user
107
+ // })
108
+
109
+ // results.push({ ...result, cuFlag: '+' })
110
+ // }
111
+ // }
112
+
113
+ // if (_updateRecords.length > 0) {
114
+ // for (let i = 0; i < _updateRecords.length; i++) {
115
+ // const newRecord = _updateRecords[i]
116
+ // const dataOoc = await dataOocRepo.findOneBy({id: newRecord.id})
117
+
118
+ // const result = await dataOocRepo.save({
119
+ // ...dataOoc,
120
+ // ...newRecord,
121
+ // updater: user
122
+ // })
123
+
124
+ // results.push({ ...result, cuFlag: 'M' })
125
+ // }
126
+ // }
127
+
128
+ // return results
129
+ // }
130
+
131
+ // @Directive('@privilege(category: "data-ooc", privilege: "mutation", domainOwnerGranted: true)')
132
+ // @Directive('@transaction')
133
+ // @Mutation(returns => Boolean, { description: 'To delete DataOoc' })
134
+ // async deleteDataOoc(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
135
+ // const { domain, tx } = context.state
136
+
137
+ // await tx.getRepository(DataOoc).delete({ domain: { id: domain.id }, id })
138
+ // return true
139
+ // }
140
+
141
+ // @Directive('@privilege(category: "data-ooc", privilege: "mutation", domainOwnerGranted: true)')
142
+ // @Directive('@transaction')
143
+ // @Mutation(returns => Boolean, { description: 'To delete multiple dataOocs' })
144
+ // async deleteDataOocs(@Arg('ids', type => [String]) ids: string[], @Ctx() context: ResolverContext): Promise<boolean> {
145
+ // const { domain, tx } = context.state
146
+
147
+ // await tx.getRepository(DataOoc).delete({
148
+ // domain,
149
+ // id: In(ids)
150
+ // })
151
+
152
+ // return true
153
+ // }
154
+ }
@@ -0,0 +1,106 @@
1
+ import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
5
+ import { ActivityInstance } from '@things-factory/worklist'
6
+
7
+ import { DataSetHistory } from '../data-set-history/data-set-history'
8
+ import { DataItem } from '../data-set/data-item-type'
9
+ import { DataSet } from '../data-set/data-set'
10
+ import { DataSample } from '../data-sample/data-sample'
11
+ import { DataOoc } from './data-ooc'
12
+ import { DataOocList } from './data-ooc-type'
13
+
14
+ @Resolver(DataOoc)
15
+ export class DataOocQuery {
16
+ @Directive('@privilege(category: "data-ooc", privilege: "query", domainOwnerGranted: true)')
17
+ @Query(returns => DataOoc, { description: 'To fetch a DataOoc' })
18
+ async dataOoc(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataOoc> {
19
+ const { domain } = context.state
20
+
21
+ return await getRepository(DataOoc).findOne({
22
+ where: { domain: { id: domain.id }, id }
23
+ })
24
+ }
25
+
26
+ @Directive('@privilege(category: "data-ooc", privilege: "query", domainOwnerGranted: true)')
27
+ @Query(returns => DataOocList, { description: 'To fetch multiple DataOoc' })
28
+ async dataOocs(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<DataOocList> {
29
+ const { domain } = context.state
30
+
31
+ const queryBuilder = getQueryBuilderFromListParams({
32
+ repository: getRepository(DataOoc),
33
+ params,
34
+ domain,
35
+ searchables: ['name', 'description']
36
+ })
37
+
38
+ const [items, total] = await queryBuilder.getManyAndCount()
39
+
40
+ return { items, total }
41
+ }
42
+
43
+ @FieldResolver(type => [DataItem])
44
+ async dataItems(@Root() dataOoc: DataOoc): Promise<DataItem[]> {
45
+ const dataSetHistory: DataSetHistory =
46
+ dataOoc.dataSetId &&
47
+ (await getRepository(DataSetHistory).findOne({
48
+ where: {
49
+ originalId: dataOoc.dataSetId,
50
+ version: dataOoc.dataSetVersion
51
+ }
52
+ }))
53
+ return dataSetHistory?.dataItems.filter(item => item.active) || []
54
+ }
55
+
56
+ @FieldResolver(type => DataSample)
57
+ async dataSample(@Root() dataOoc: DataOoc): Promise<DataSample> {
58
+ return dataOoc.dataSampleId && (await getRepository(DataSample).findOneBy({ id: dataOoc.dataSampleId }))
59
+ }
60
+
61
+ @FieldResolver(type => DataSet)
62
+ async dataSet(@Root() dataOoc: DataOoc): Promise<DataSet> {
63
+ return dataOoc.dataSetId && (await getRepository(DataSet).findOneBy({ id: dataOoc.dataSetId }))
64
+ }
65
+
66
+ @FieldResolver(type => ActivityInstance)
67
+ async reviewActivityInstance(@Root() dataOoc: DataOoc): Promise<ActivityInstance> {
68
+ return (
69
+ dataOoc.reviewActivityInstanceId &&
70
+ (await getRepository(ActivityInstance).findOneBy({ id: dataOoc.reviewActivityInstanceId }))
71
+ )
72
+ }
73
+
74
+ @FieldResolver(type => ActivityInstance)
75
+ async resolveActivityInstance(@Root() dataOoc: DataOoc): Promise<ActivityInstance> {
76
+ return (
77
+ dataOoc.resolveActivityInstanceId &&
78
+ (await getRepository(ActivityInstance).findOneBy({ id: dataOoc.resolveActivityInstanceId }))
79
+ )
80
+ }
81
+
82
+ @FieldResolver(type => User)
83
+ async corrector(@Root() dataOoc: DataOoc): Promise<User> {
84
+ return dataOoc.correctorId && (await getRepository(User).findOneBy({ id: dataOoc.correctorId }))
85
+ }
86
+
87
+ @FieldResolver(type => User)
88
+ async reviewer(@Root() dataOoc: DataOoc): Promise<User> {
89
+ return dataOoc.reviewerId && (await getRepository(User).findOneBy({ id: dataOoc.reviewerId }))
90
+ }
91
+
92
+ @FieldResolver(type => Domain)
93
+ async domain(@Root() dataOoc: DataOoc): Promise<Domain> {
94
+ return await getRepository(Domain).findOneBy({ id: dataOoc.domainId })
95
+ }
96
+
97
+ @FieldResolver(type => User)
98
+ async updater(@Root() dataOoc: DataOoc): Promise<User> {
99
+ return dataOoc.updaterId && (await getRepository(User).findOneBy({ id: dataOoc.updaterId }))
100
+ }
101
+
102
+ @FieldResolver(type => User)
103
+ async creator(@Root() dataOoc: DataOoc): Promise<User> {
104
+ return dataOoc.creatorId && (await getRepository(User).findOneBy({ id: dataOoc.creatorId }))
105
+ }
106
+ }