@things-factory/dataset 8.0.0-beta.8 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) 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 +133 -0
  4. package/client/activities/activity-data-review-view.ts +145 -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/pages/data-entry/data-entry-list-page.js +2 -2
  44. package/dist-client/pages/data-entry/data-entry-list-page.js.map +1 -1
  45. package/dist-client/tsconfig.tsbuildinfo +1 -1
  46. package/dist-server/service/data-sample/data-sample-query.d.ts +1 -1
  47. package/dist-server/service/data-sample/data-sample-query.js +3 -3
  48. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  49. package/dist-server/tsconfig.tsbuildinfo +1 -1
  50. package/package.json +26 -26
  51. package/server/activities/activity-data-collect.ts +100 -0
  52. package/server/activities/activity-data-review.ts +82 -0
  53. package/server/activities/activity-ooc-resolve.ts +123 -0
  54. package/server/activities/activity-ooc-review.ts +144 -0
  55. package/server/activities/index.ts +11 -0
  56. package/server/controllers/create-data-sample.ts +426 -0
  57. package/server/controllers/data-use-case.ts +98 -0
  58. package/server/controllers/finalize-data-collection.ts +388 -0
  59. package/server/controllers/index.ts +3 -0
  60. package/server/controllers/issue-data-collection-task.ts +70 -0
  61. package/server/controllers/jasper-report.ts +186 -0
  62. package/server/controllers/query-data-summary-by-period.ts +178 -0
  63. package/server/controllers/shiny-report.ts +54 -0
  64. package/server/engine/index.ts +1 -0
  65. package/server/engine/task/create-data-sample.ts +100 -0
  66. package/server/engine/task/index.ts +2 -0
  67. package/server/engine/task/issue-collect-data.ts +45 -0
  68. package/server/index.ts +8 -0
  69. package/server/routes.ts +188 -0
  70. package/server/service/data-archive/data-archive-mutation.ts +273 -0
  71. package/server/service/data-archive/data-archive-query.ts +58 -0
  72. package/server/service/data-archive/data-archive-type.ts +48 -0
  73. package/server/service/data-archive/data-archive.ts +69 -0
  74. package/server/service/data-archive/index.ts +6 -0
  75. package/server/service/data-key-set/data-key-item-type.ts +31 -0
  76. package/server/service/data-key-set/data-key-set-mutation.ts +201 -0
  77. package/server/service/data-key-set/data-key-set-query.ts +68 -0
  78. package/server/service/data-key-set/data-key-set-type.ts +70 -0
  79. package/server/service/data-key-set/data-key-set.ts +86 -0
  80. package/server/service/data-key-set/index.ts +6 -0
  81. package/server/service/data-ooc/data-ooc-mutation.ts +154 -0
  82. package/server/service/data-ooc/data-ooc-query.ts +106 -0
  83. package/server/service/data-ooc/data-ooc-subscription.ts +48 -0
  84. package/server/service/data-ooc/data-ooc-type.ts +71 -0
  85. package/server/service/data-ooc/data-ooc.ts +259 -0
  86. package/server/service/data-ooc/index.ts +7 -0
  87. package/server/service/data-sample/data-sample-mutation.ts +18 -0
  88. package/server/service/data-sample/data-sample-query.ts +215 -0
  89. package/server/service/data-sample/data-sample-type.ts +47 -0
  90. package/server/service/data-sample/data-sample.ts +193 -0
  91. package/server/service/data-sample/index.ts +6 -0
  92. package/server/service/data-sensor/data-sensor-mutation.ts +116 -0
  93. package/server/service/data-sensor/data-sensor-query.ts +76 -0
  94. package/server/service/data-sensor/data-sensor-type.ts +104 -0
  95. package/server/service/data-sensor/data-sensor.ts +126 -0
  96. package/server/service/data-sensor/index.ts +6 -0
  97. package/server/service/data-set/data-item-type.ts +155 -0
  98. package/server/service/data-set/data-set-mutation.ts +552 -0
  99. package/server/service/data-set/data-set-query.ts +461 -0
  100. package/server/service/data-set/data-set-type.ts +204 -0
  101. package/server/service/data-set/data-set.ts +326 -0
  102. package/server/service/data-set/index.ts +6 -0
  103. package/server/service/data-set-history/data-set-history-query.ts +126 -0
  104. package/server/service/data-set-history/data-set-history-type.ts +12 -0
  105. package/server/service/data-set-history/data-set-history.ts +217 -0
  106. package/server/service/data-set-history/event-subscriber.ts +17 -0
  107. package/server/service/data-set-history/index.ts +7 -0
  108. package/server/service/data-spec/data-spec-manager.ts +21 -0
  109. package/server/service/data-spec/data-spec-query.ts +21 -0
  110. package/server/service/data-spec/data-spec.ts +45 -0
  111. package/server/service/data-spec/index.ts +5 -0
  112. package/server/service/data-summary/data-summary-mutation.ts +45 -0
  113. package/server/service/data-summary/data-summary-query.ts +179 -0
  114. package/server/service/data-summary/data-summary-type.ts +86 -0
  115. package/server/service/data-summary/data-summary.ts +170 -0
  116. package/server/service/data-summary/index.ts +7 -0
  117. package/server/service/index.ts +57 -0
  118. package/server/tsconfig.json +10 -0
  119. package/server/utils/config-resolver.ts +29 -0
  120. package/server/utils/index.ts +1 -0
@@ -0,0 +1,7 @@
1
+ import { DataSetHistory } from './data-set-history'
2
+ import { DataSetHistoryQuery } from './data-set-history-query'
3
+ import { DataSetHistoryEntitySubscriber } from './event-subscriber'
4
+
5
+ export const entities = [DataSetHistory]
6
+ export const resolvers = [DataSetHistoryQuery]
7
+ export const subscribers = [DataSetHistoryEntitySubscriber]
@@ -0,0 +1,21 @@
1
+ import { DataSpec } from './data-spec'
2
+
3
+ export class DataSpecManager {
4
+ static specRegistry: { [type: string]: DataSpec } = {}
5
+
6
+ static getDataSpec(type: string): DataSpec {
7
+ return DataSpecManager.specRegistry[type]
8
+ }
9
+
10
+ static registerDataSpec(type: string, dataSpec: DataSpec) {
11
+ DataSpecManager.specRegistry[type] = dataSpec
12
+ }
13
+
14
+ static unregisterDataSpec(type: string) {
15
+ delete DataSpecManager.specRegistry[type]
16
+ }
17
+
18
+ static getDataSpecs(): DataSpec[] {
19
+ return Object.values(DataSpecManager.specRegistry)
20
+ }
21
+ }
@@ -0,0 +1,21 @@
1
+ import { Resolver, Query, Arg } from 'type-graphql'
2
+ import { DataSpec, DataSpecList } from './data-spec'
3
+ import { DataSpecManager } from './data-spec-manager'
4
+
5
+ @Resolver(DataSpec)
6
+ export class DataSpecQuery {
7
+ @Query(returns => DataSpec, { description: 'To fetch a data-spec' })
8
+ dataSpec(@Arg('name') name: string): DataSpec {
9
+ return DataSpecManager.getDataSpec(name)
10
+ }
11
+
12
+ @Query(returns => DataSpecList, { description: 'To fetch all data-specs' })
13
+ dataSpecs(): DataSpecList {
14
+ const items = DataSpecManager.getDataSpecs()
15
+
16
+ return {
17
+ items,
18
+ total: items.length
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,45 @@
1
+ import { Field, Int, ObjectType } from 'type-graphql'
2
+
3
+ import { ScalarObject } from '@things-factory/shell'
4
+
5
+ @ObjectType()
6
+ export class DataSpecItem {
7
+ @Field()
8
+ type: string
9
+
10
+ @Field()
11
+ label: string
12
+
13
+ @Field()
14
+ name: string
15
+
16
+ @Field({ nullable: true })
17
+ placeholder?: string
18
+
19
+ @Field(type => ScalarObject, { nullable: true })
20
+ property?: { [key: string]: any }
21
+ }
22
+
23
+ @ObjectType()
24
+ export class DataSpec {
25
+ @Field()
26
+ name: string
27
+
28
+ @Field({ nullable: true })
29
+ description: string
30
+
31
+ @Field({ nullable: true })
32
+ help: string
33
+
34
+ @Field(type => [DataSpecItem], { nullable: true })
35
+ specItems: DataSpecItem[]
36
+ }
37
+
38
+ @ObjectType()
39
+ export class DataSpecList {
40
+ @Field(type => [DataSpec])
41
+ items: DataSpec[]
42
+
43
+ @Field(type => Int)
44
+ total: number
45
+ }
@@ -0,0 +1,5 @@
1
+ import { DataSpec } from './data-spec'
2
+ import { DataSpecQuery } from './data-spec-query'
3
+
4
+ export const entities = [DataSpec]
5
+ export const resolvers = [DataSpecQuery]
@@ -0,0 +1,45 @@
1
+ import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'
2
+
3
+ import { DataSummary } from './data-summary'
4
+
5
+ import { finalizeDataCollection, finalizeLatestDataCollection } from '../../controllers/finalize-data-collection'
6
+
7
+ @Resolver(DataSummary)
8
+ export class DataSummaryMutation {
9
+ @Directive('@transaction')
10
+ @Mutation(returns => Boolean, {
11
+ description: 'Deprecated. Use finalizeLatestDataCollection',
12
+ deprecationReason: 'This resolver has been replaced by finalizeLatestDataCollection'
13
+ })
14
+ async generateLatestDataSummaries(@Arg('dataSetId') dataSetId: string, @Ctx() context: ResolverContext): Promise<boolean> {
15
+ return await finalizeLatestDataCollection(dataSetId, context)
16
+ }
17
+
18
+ @Directive('@transaction')
19
+ @Mutation(returns => Boolean, { description: 'To finalize new Data Summaries' })
20
+ async finalizeLatestDataCollection(@Arg('dataSetId') dataSetId: string, @Ctx() context: ResolverContext): Promise<boolean> {
21
+ return await finalizeLatestDataCollection(dataSetId, context)
22
+ }
23
+
24
+ @Directive('@transaction')
25
+ @Mutation(returns => Boolean, { description: 'Deprecated. Use finalizeDataCollection', deprecationReason: 'This resolver has been replaced by finalizeDataCollection' })
26
+ async generateDataSummaries(
27
+ @Arg('dataSetId') dataSetId: string,
28
+ @Arg('date') date: string,
29
+ @Arg('period') period: string,
30
+ @Ctx() context: ResolverContext
31
+ ): Promise<boolean> {
32
+ return await finalizeDataCollection(dataSetId, date, period, context)
33
+ }
34
+
35
+ @Directive('@transaction')
36
+ @Mutation(returns => Boolean, { description: 'To finalize data collection for the given period' })
37
+ async finalizeDataCollection(
38
+ @Arg('dataSetId') dataSetId: string,
39
+ @Arg('date') date: string,
40
+ @Arg('period') period: string,
41
+ @Ctx() context: ResolverContext
42
+ ): Promise<boolean> {
43
+ return await finalizeDataCollection(dataSetId, date, period, context)
44
+ }
45
+ }
@@ -0,0 +1,179 @@
1
+ import { In } from 'typeorm'
2
+ import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
3
+ import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
4
+ import { User } from '@things-factory/auth-base'
5
+ import { DataKeySet } from '../data-key-set/data-key-set'
6
+ import { DataItem } from '../data-set/data-item-type'
7
+ import { DataSet } from '../data-set/data-set'
8
+ import { DataSummary } from './data-summary'
9
+ import { DataSummaryList, DynamicDataSummary } from './data-summary-type'
10
+ import { queryDataSummaryByPeriod } from '../../controllers/query-data-summary-by-period'
11
+
12
+ @Resolver(DataSummary)
13
+ export class DataSummaryQuery {
14
+ @Query(returns => DataSummary!, { nullable: true, description: 'To fetch a DataSummary' })
15
+ async dataSummary(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataSummary> {
16
+ const { domain } = context.state
17
+
18
+ return await getRepository(DataSummary).findOne({
19
+ where: { domain: { id: domain.id }, id }
20
+ })
21
+ }
22
+
23
+ @Query(returns => DataSummaryList, { description: 'To fetch multiple DataSummaries' })
24
+ async dataSummaries(
25
+ @Args(type => ListParam) params: ListParam,
26
+ @Ctx() context: ResolverContext
27
+ ): Promise<DataSummaryList> {
28
+ const { domain } = context.state
29
+
30
+ const queryBuilder = getQueryBuilderFromListParams({
31
+ domain,
32
+ params,
33
+ repository: await getRepository(DataSummary),
34
+ searchables: ['name', 'description']
35
+ })
36
+
37
+ const [items, total] = await queryBuilder.getManyAndCount()
38
+
39
+ return { items, total }
40
+ }
41
+
42
+ @Query(returns => [DynamicDataSummary], { description: 'To fetch multiple dynamically grouped DataSummaries' })
43
+ async dataSummaryByPeriod(
44
+ @Arg('period') period: 'today' | 'this month' | '30 days' | 'this year' | '12 months',
45
+ @Arg('dataSetName') dataSetName: string,
46
+ @Arg('dataKeys', type => [String], { nullable: true }) dataKeys: string[] | null,
47
+ @Args(type => ListParam) params: ListParam,
48
+ @Ctx() context: ResolverContext
49
+ ): Promise<DynamicDataSummary[]> {
50
+ return await queryDataSummaryByPeriod(period, dataSetName, dataKeys, params, context)
51
+ }
52
+
53
+ @Directive('@privilege(category: "data-summary", privilege: "query", domainOwnerGranted: true)')
54
+ @Query(returns => DataSummaryList, { description: 'To fetch multiple data summaries by data set name' })
55
+ async dataSummariesByDataSetName(
56
+ @Arg('dataSetName') dataSetName: string,
57
+ @Args(type => ListParam) params: ListParam,
58
+ @Ctx() context: ResolverContext
59
+ ): Promise<DataSummaryList> {
60
+ const { domain } = context.state
61
+
62
+ const dataSet = await getRepository(DataSet).findOne({
63
+ where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, name: dataSetName },
64
+ relations: ['dataKeySet']
65
+ })
66
+
67
+ if (!dataSet) {
68
+ throw new Error(`dataSet not found by the given dataSetName(${dataSetName})`)
69
+ }
70
+
71
+ const dataKeyItems = dataSet.dataKeySet?.dataKeyItems || []
72
+ const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)
73
+
74
+ const queryBuilder = getQueryBuilderFromListParams({
75
+ repository: getRepository(DataSummary),
76
+ params,
77
+ domain,
78
+ alias: 'summary',
79
+ searchables: ['name', 'description'].concat(searchables)
80
+ }).innerJoin('summary.dataSet', 'ds', 'ds.id = :dataSetName', {
81
+ dataSetName: dataSet.id
82
+ })
83
+
84
+ const [items, total] = await queryBuilder.getManyAndCount()
85
+
86
+ return { items, total }
87
+ }
88
+
89
+ @Directive('@privilege(category: "data-summary", privilege: "query", domainOwnerGranted: true)')
90
+ @Query(returns => DataSummaryList, { description: 'To fetch multiple data summaries by data set' })
91
+ async dataSummariesByDataSet(
92
+ @Arg('dataSetId') dataSetId: string,
93
+ @Args(type => ListParam) params: ListParam,
94
+ @Ctx() context: ResolverContext
95
+ ): Promise<DataSummaryList> {
96
+ const { domain } = context.state
97
+
98
+ const dataSet = await getRepository(DataSet).findOne({
99
+ where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id: dataSetId },
100
+ relations: ['dataKeySet']
101
+ })
102
+
103
+ if (!dataSet) {
104
+ throw new Error(`dataSet not found by the given dataSetId(${dataSetId})`)
105
+ }
106
+
107
+ const dataKeyItems = dataSet.dataKeySet?.dataKeyItems || []
108
+ const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)
109
+
110
+ const queryBuilder = getQueryBuilderFromListParams({
111
+ repository: getRepository(DataSummary),
112
+ params,
113
+ domain,
114
+ alias: 'summary',
115
+ searchables: ['name', 'description'].concat(searchables)
116
+ }).innerJoin('summary.dataSet', 'ds', 'ds.id = :dataSetId', {
117
+ dataSetId
118
+ })
119
+
120
+ const [items, total] = await queryBuilder.getManyAndCount()
121
+
122
+ return { items, total }
123
+ }
124
+
125
+ @Directive('@privilege(category: "data-summary", privilege: "query", domainOwnerGranted: true)')
126
+ @Query(returns => DataSummaryList, { description: 'To fetch multiple data summaries by data key set' })
127
+ async dataSummariesByDataKeySet(
128
+ @Arg('dataKeySetId') dataKeySetId: string,
129
+ @Args(type => ListParam) params: ListParam,
130
+ @Ctx() context: ResolverContext
131
+ ): Promise<DataSummaryList> {
132
+ const { domain } = context.state
133
+
134
+ const dataKeySet = await getRepository(DataKeySet).findOneBy({ id: dataKeySetId })
135
+ const dataKeyItems = dataKeySet?.dataKeyItems || []
136
+ const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)
137
+
138
+ const queryBuilder = getQueryBuilderFromListParams({
139
+ repository: getRepository(DataSummary),
140
+ params,
141
+ domain,
142
+ alias: 'summary',
143
+ searchables: ['name', 'description'].concat(searchables)
144
+ }).innerJoin('summary.dataSet', 'ds', 'ds.dataKeySet = :dataKeySetId', {
145
+ dataKeySetId
146
+ })
147
+
148
+ const [items, total] = await queryBuilder.getManyAndCount()
149
+
150
+ return { items, total }
151
+ }
152
+
153
+ @FieldResolver(type => [DataItem])
154
+ async dataItems(@Root() dataSummary: DataSummary): Promise<DataItem[]> {
155
+ const dataSet = dataSummary.dataSetId && (await getRepository(DataSet).findOneBy({ id: dataSummary.dataSetId }))
156
+
157
+ return dataSet?.dataItems.filter(item => item.active) || []
158
+ }
159
+
160
+ @FieldResolver(type => DataSet)
161
+ async dataSet(@Root() dataSummary: DataSummary): Promise<DataSet> {
162
+ return dataSummary.dataSetId && (await getRepository(DataSet).findOneBy({ id: dataSummary.dataSetId }))
163
+ }
164
+
165
+ @FieldResolver(type => Domain)
166
+ async domain(@Root() dataSummary: DataSummary): Promise<Domain> {
167
+ return dataSummary.domainId && (await getRepository(Domain).findOneBy({ id: dataSummary.domainId }))
168
+ }
169
+
170
+ @FieldResolver(type => User)
171
+ async updater(@Root() dataSummary: DataSummary): Promise<User> {
172
+ return dataSummary.updaterId && (await getRepository(User).findOneBy({ id: dataSummary.updaterId }))
173
+ }
174
+
175
+ @FieldResolver(type => User)
176
+ async creator(@Root() dataSummary: DataSummary): Promise<User> {
177
+ return dataSummary.creatorId && (await getRepository(User).findOneBy({ id: dataSummary.creatorId }))
178
+ }
179
+ }
@@ -0,0 +1,86 @@
1
+ import { ObjectType, Field, InputType, Int, ID } from 'type-graphql'
2
+ import { DataSummary } from './data-summary'
3
+
4
+ @InputType()
5
+ export class NewDataSummary {
6
+ @Field()
7
+ name: string
8
+
9
+ @Field({ nullable: true })
10
+ description?: string
11
+ }
12
+
13
+ @InputType()
14
+ export class DataSummaryPatch {
15
+ @Field(type => ID, { nullable: true })
16
+ id?: string
17
+
18
+ @Field({ nullable: true })
19
+ name?: string
20
+
21
+ @Field({ nullable: true })
22
+ description?: string
23
+
24
+ @Field({ nullable: true })
25
+ cuFlag?: string
26
+ }
27
+
28
+ @ObjectType()
29
+ export class DynamicDataSummary {
30
+ @Field({ nullable: true })
31
+ month?: string = ''
32
+
33
+ @Field({ nullable: true })
34
+ date?: string = ''
35
+
36
+ @Field({ nullable: true })
37
+ period?: string = ''
38
+
39
+ @Field({ nullable: true })
40
+ count?: number
41
+
42
+ @Field({ nullable: true })
43
+ countOoc?: number
44
+
45
+ @Field({ nullable: true })
46
+ countOos?: number
47
+
48
+ @Field({ nullable: true })
49
+ key01?: string = ''
50
+
51
+ @Field({ nullable: true })
52
+ key02?: string = ''
53
+
54
+ @Field({ nullable: true })
55
+ key03?: string = ''
56
+
57
+ @Field({ nullable: true })
58
+ key04?: string = ''
59
+
60
+ @Field({ nullable: true })
61
+ key05?: string = ''
62
+
63
+ @Field({ nullable: true })
64
+ data01?: number
65
+
66
+ @Field({ nullable: true })
67
+ data02?: number
68
+
69
+ @Field({ nullable: true })
70
+ data03?: number
71
+
72
+ @Field({ nullable: true })
73
+ data04?: number
74
+
75
+ @Field({ nullable: true })
76
+ data05?: number
77
+ }
78
+
79
+ @ObjectType()
80
+ export class DataSummaryList {
81
+ @Field(type => [DataSummary])
82
+ items: DataSummary[]
83
+
84
+ @Field(type => Int)
85
+ total: number
86
+ }
@@ -0,0 +1,170 @@
1
+ import {
2
+ CreateDateColumn,
3
+ UpdateDateColumn,
4
+ Entity,
5
+ Index,
6
+ Column,
7
+ RelationId,
8
+ ManyToOne,
9
+ PrimaryGeneratedColumn
10
+ } from 'typeorm'
11
+ import { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'
12
+
13
+ import { Domain, ScalarObject } from '@things-factory/shell'
14
+ import { User } from '@things-factory/auth-base'
15
+
16
+ import { DataItem } from '../data-set/data-item-type'
17
+ import { DataSet, DataSetSummaryPeriodType } from '../data-set/data-set'
18
+
19
+ @Entity()
20
+ @Index(
21
+ 'ix_data_summary_0',
22
+ (dataSummary: DataSummary) => [
23
+ dataSummary.domain,
24
+ dataSummary.dataSet,
25
+ dataSummary.key01,
26
+ dataSummary.key02,
27
+ dataSummary.key03,
28
+ dataSummary.key04,
29
+ dataSummary.key05,
30
+ dataSummary.date,
31
+ dataSummary.period
32
+ ],
33
+ { unique: true }
34
+ )
35
+ @Index(
36
+ 'ix_data_summary_1',
37
+ (dataSummary: DataSummary) => [dataSummary.domain, dataSummary.dataSet, dataSummary.date, dataSummary.period],
38
+ { unique: false }
39
+ )
40
+ @ObjectType({ description: 'Entity for DataSummary' })
41
+ export class DataSummary {
42
+ @PrimaryGeneratedColumn('uuid')
43
+ @Field(type => ID)
44
+ readonly id: string
45
+
46
+ @ManyToOne(type => Domain)
47
+ @Field(type => Domain)
48
+ domain?: Domain
49
+
50
+ @RelationId((dataSummary: DataSummary) => dataSummary.domain)
51
+ domainId?: string
52
+
53
+ @Column()
54
+ @Field({ nullable: true })
55
+ name?: string
56
+
57
+ @Column({ nullable: true })
58
+ @Field({ nullable: true })
59
+ description?: string
60
+
61
+ @Column({ nullable: true })
62
+ @Field({ nullable: true })
63
+ type?: DataSetSummaryPeriodType
64
+
65
+ @Column({ nullable: true, default: '', length: 20 })
66
+ @Field({ nullable: true })
67
+ date?: string = ''
68
+
69
+ @Column({ nullable: true, default: '', length: 20 })
70
+ @Field({ nullable: true })
71
+ period?: string = ''
72
+
73
+ @ManyToOne(type => DataSet)
74
+ @Field(type => DataSet, { nullable: false })
75
+ dataSet?: DataSet
76
+
77
+ @RelationId((dataSample: DataSummary) => dataSample.dataSet)
78
+ dataSetId?: string
79
+
80
+ @Column({ nullable: true })
81
+ @Field({ nullable: true })
82
+ dataSetVersion?: number
83
+
84
+ @Field(type => [DataItem], { nullable: true })
85
+ dataItems?: DataItem[]
86
+
87
+ @Column('simple-json', { nullable: true })
88
+ @Field(type => ScalarObject, { nullable: true })
89
+ summary?: any
90
+
91
+ @Column({
92
+ nullable: true
93
+ })
94
+ @Field({ nullable: true })
95
+ count?: number
96
+
97
+ @Column({
98
+ nullable: true
99
+ })
100
+ @Field({ nullable: true })
101
+ countOoc?: number
102
+
103
+ @Column({
104
+ nullable: true
105
+ })
106
+ @Field({ nullable: true })
107
+ countOos?: number
108
+
109
+ @Column({ nullable: true, default: '', length: 100 })
110
+ @Field({ nullable: true })
111
+ key01?: string = ''
112
+
113
+ @Column({ nullable: true, default: '', length: 100 })
114
+ @Field({ nullable: true })
115
+ key02?: string = ''
116
+
117
+ @Column({ nullable: true, default: '', length: 100 })
118
+ @Field({ nullable: true })
119
+ key03?: string = ''
120
+
121
+ @Column({ nullable: true, default: '', length: 100 })
122
+ @Field({ nullable: true })
123
+ key04?: string = ''
124
+
125
+ @Column({ nullable: true, default: '', length: 100 })
126
+ @Field({ nullable: true })
127
+ key05?: string = ''
128
+
129
+ @Column({ type: 'real', nullable: true })
130
+ @Field({ nullable: true })
131
+ data01?: number
132
+
133
+ @Column({ type: 'real', nullable: true })
134
+ @Field({ nullable: true })
135
+ data02?: number
136
+
137
+ @Column({ type: 'real', nullable: true })
138
+ @Field({ nullable: true })
139
+ data03?: number
140
+
141
+ @Column({ type: 'real', nullable: true })
142
+ @Field({ nullable: true })
143
+ data04?: number
144
+
145
+ @Column({ type: 'real', nullable: true })
146
+ @Field({ nullable: true })
147
+ data05?: number
148
+
149
+ @CreateDateColumn()
150
+ @Field({ nullable: true })
151
+ createdAt?: Date
152
+
153
+ @UpdateDateColumn()
154
+ @Field({ nullable: true })
155
+ updatedAt?: Date
156
+
157
+ @ManyToOne(type => User, { nullable: true })
158
+ @Field(type => User, { nullable: true })
159
+ creator?: User
160
+
161
+ @RelationId((dataSummary: DataSummary) => dataSummary.creator)
162
+ creatorId?: string
163
+
164
+ @ManyToOne(type => User, { nullable: true })
165
+ @Field(type => User, { nullable: true })
166
+ updater?: User
167
+
168
+ @RelationId((dataSummary: DataSummary) => dataSummary.updater)
169
+ updaterId?: string
170
+ }
@@ -0,0 +1,7 @@
1
+ import { DataSummary } from './data-summary'
2
+ import { DataSummaryQuery } from './data-summary-query'
3
+ import { DataSummaryMutation } from './data-summary-mutation'
4
+
5
+ export const entities = [DataSummary]
6
+ export const resolvers = [DataSummaryQuery, DataSummaryMutation]
7
+ export const subscribers = []
@@ -0,0 +1,57 @@
1
+ import { entities as DataKeySetEntities, resolvers as DataKeySetResolvers } from './data-key-set'
2
+ import { entities as DataOocEntities, resolvers as DataOocResolvers } from './data-ooc'
3
+ import { entities as DataSampleEntities, resolvers as DataSampleResolvers } from './data-sample'
4
+ import { entities as DataSensorEntities, resolvers as DataSensorResolvers } from './data-sensor'
5
+ import { entities as DataSetEntities, resolvers as DataSetResolvers } from './data-set'
6
+ import {
7
+ entities as DataSetHistoryEntities,
8
+ resolvers as DataSetHistoryResolvers,
9
+ subscribers as DataSetHistorySubscribers
10
+ } from './data-set-history'
11
+ import { entities as DataSummaryEntities, resolvers as DataSummaryResolvers } from './data-summary'
12
+ import { entities as DataSpecEntities, resolvers as DataSpecResolvers } from './data-spec'
13
+ import { entities as DataArchiveEntities, resolvers as DataArchiveResolvers } from './data-archive'
14
+
15
+ /* EXPORT ENTITY TYPES */
16
+ export * from './data-summary/data-summary'
17
+ export * from './data-key-set/data-key-set'
18
+ export * from './data-ooc/data-ooc'
19
+ export * from './data-sensor/data-sensor'
20
+ export * from './data-sample/data-sample'
21
+ export * from './data-set/data-set'
22
+ export * from './data-set-history/data-set-history'
23
+ export * from './data-set/data-item-type'
24
+ export * from './data-spec/data-spec'
25
+
26
+ export const entities = [
27
+ /* ENTITIES */
28
+ ...DataSummaryEntities,
29
+ ...DataKeySetEntities,
30
+ ...DataOocEntities,
31
+ ...DataSensorEntities,
32
+ ...DataSampleEntities,
33
+ ...DataSetEntities,
34
+ ...DataSetHistoryEntities,
35
+ ...DataSpecEntities,
36
+ ...DataArchiveEntities
37
+ ]
38
+
39
+ export const subscribers = [
40
+ /* SUBSCRIBERS */
41
+ ...DataSetHistorySubscribers
42
+ ]
43
+
44
+ export const schema = {
45
+ resolverClasses: [
46
+ /* RESOLVER CLASSES */
47
+ ...DataSummaryResolvers,
48
+ ...DataKeySetResolvers,
49
+ ...DataOocResolvers,
50
+ ...DataSensorResolvers,
51
+ ...DataSampleResolvers,
52
+ ...DataSetResolvers,
53
+ ...DataSetHistoryResolvers,
54
+ ...DataSpecResolvers,
55
+ ...DataArchiveResolvers
56
+ ]
57
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig-base.json",
3
+ "compilerOptions": {
4
+ "strict": false,
5
+ "module": "commonjs",
6
+ "outDir": "../dist-server",
7
+ "baseUrl": "./"
8
+ },
9
+ "include": ["./**/*"]
10
+ }
@@ -0,0 +1,29 @@
1
+
2
+ export function getEndpointUrl(endpoint:any, subpath:string=''):string {
3
+ const { url='', protocol='http', host='', port=80 } = endpoint
4
+
5
+ let _url = ''
6
+ let _protocol = protocol
7
+
8
+ if (url) {
9
+ _url = url
10
+ } else {
11
+ const hosts = host.split('://')
12
+ // host에 protocol을 포함한 경우
13
+ if (hosts.length == 2) {
14
+ const _host = hosts[1]
15
+ _protocol = hosts[0]
16
+ // host에 port를 포함한 경우
17
+ const _hosts = _host.split(':')
18
+ if (_hosts.length > 1) {
19
+ _url = `${_hosts[0]}:${_hosts[1]}`
20
+ } else {
21
+ _url = `${_host}:${port}`
22
+ }
23
+ } else if (hosts.length == 1) {
24
+ _url = `${host}:${port}`
25
+ }
26
+ }
27
+
28
+ return _protocol + '://' + _url.split('/').concat(subpath.split('/')).filter(x=>x).join('/')
29
+ }