@things-factory/dataset 8.0.0-beta.9 → 8.0.2
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/client/activities/activity-data-collect-edit.ts +105 -0
- package/client/activities/activity-data-collect-view.ts +91 -0
- package/client/activities/activity-data-review-edit.ts +278 -0
- package/client/activities/activity-data-review-view.ts +226 -0
- package/client/activities/activity-ooc-resolve-edit.ts +195 -0
- package/client/activities/activity-ooc-resolve-view.ts +143 -0
- package/client/activities/activity-ooc-review-edit.ts +173 -0
- package/client/activities/activity-ooc-review-view.ts +129 -0
- package/client/bootstrap.ts +35 -0
- package/client/components/data-entry-form.ts +109 -0
- package/client/index.ts +1 -0
- package/client/pages/data-archive/data-archive-list-page.ts +277 -0
- package/client/pages/data-archive/data-archive-request-popup.ts +177 -0
- package/client/pages/data-entry/data-entry-list-page.ts +464 -0
- package/client/pages/data-key-set/data-key-item-list.ts +183 -0
- package/client/pages/data-key-set/data-key-set-importer.ts +89 -0
- package/client/pages/data-key-set/data-key-set-list-page.ts +413 -0
- package/client/pages/data-ooc/data-ooc-list-page.ts +549 -0
- package/client/pages/data-ooc/data-ooc-page.ts +164 -0
- package/client/pages/data-ooc/data-ooc-view.ts +236 -0
- package/client/pages/data-ooc/data-oocs-page.ts +200 -0
- package/client/pages/data-report/data-report-embed-page.ts +108 -0
- package/client/pages/data-report/data-report-list-page.ts +454 -0
- package/client/pages/data-report/data-report-samples-page.ts +174 -0
- package/client/pages/data-report/jasper-report-oocs-page.ts +110 -0
- package/client/pages/data-report/jasper-report-samples-crosstab-page.ts +110 -0
- package/client/pages/data-report/jasper-report-samples-page.ts +110 -0
- package/client/pages/data-sample/data-sample-list-page.ts +442 -0
- package/client/pages/data-sample/data-sample-page.ts +55 -0
- package/client/pages/data-sample/data-sample-search-page.ts +424 -0
- package/client/pages/data-sample/data-sample-view.ts +292 -0
- package/client/pages/data-sample/data-samples-page.ts +249 -0
- package/client/pages/data-sensor/data-sensor-list-page.ts +456 -0
- package/client/pages/data-set/data-item-list.ts +304 -0
- package/client/pages/data-set/data-set-importer.ts +89 -0
- package/client/pages/data-set/data-set-list-page.ts +1078 -0
- package/client/pages/data-summary/data-summary-list-page.ts +363 -0
- package/client/pages/data-summary/data-summary-period-page.ts +439 -0
- package/client/pages/data-summary/data-summary-search-page.ts +426 -0
- package/client/pages/data-summary/data-summary-view.ts +133 -0
- package/client/route.ts +91 -0
- package/client/tsconfig.json +13 -0
- package/dist-client/activities/activity-data-review-edit.js +19 -10
- package/dist-client/activities/activity-data-review-edit.js.map +1 -1
- package/dist-client/activities/activity-data-review-view.js +80 -0
- package/dist-client/activities/activity-data-review-view.js.map +1 -1
- package/dist-client/pages/data-entry/data-entry-list-page.js +2 -2
- package/dist-client/pages/data-entry/data-entry-list-page.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/controllers/create-data-ooc.js +2 -0
- package/dist-server/controllers/create-data-ooc.js.map +1 -1
- package/dist-server/service/data-archive/index.d.ts +1 -1
- package/dist-server/service/data-ooc/index.d.ts +1 -1
- package/dist-server/service/data-sample/data-sample-query.d.ts +1 -1
- package/dist-server/service/data-sample/data-sample-query.js +3 -3
- package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
- package/dist-server/service/data-sample/index.d.ts +1 -1
- package/dist-server/service/data-set/index.d.ts +1 -1
- package/dist-server/service/index.d.ts +2 -2
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +26 -26
- package/server/activities/activity-data-collect.ts +100 -0
- package/server/activities/activity-data-review.ts +109 -0
- package/server/activities/activity-ooc-resolve.ts +123 -0
- package/server/activities/activity-ooc-review.ts +95 -0
- package/server/activities/index.ts +11 -0
- package/server/controllers/create-data-ooc.ts +80 -0
- package/server/controllers/create-data-sample.ts +323 -0
- package/server/controllers/data-use-case.ts +98 -0
- package/server/controllers/finalize-data-collection.ts +388 -0
- package/server/controllers/index.ts +6 -0
- package/server/controllers/issue-data-collection-task.ts +70 -0
- package/server/controllers/issue-ooc-resolve.ts +58 -0
- package/server/controllers/issue-ooc-review.ts +52 -0
- package/server/controllers/jasper-report.ts +186 -0
- package/server/controllers/query-data-summary-by-period.ts +178 -0
- package/server/controllers/shiny-report.ts +54 -0
- package/server/engine/index.ts +1 -0
- package/server/engine/task/create-data-sample.ts +100 -0
- package/server/engine/task/index.ts +2 -0
- package/server/engine/task/issue-collect-data.ts +45 -0
- package/server/index.ts +8 -0
- package/server/routes.ts +188 -0
- package/server/service/data-archive/data-archive-mutation.ts +273 -0
- package/server/service/data-archive/data-archive-query.ts +58 -0
- package/server/service/data-archive/data-archive-type.ts +48 -0
- package/server/service/data-archive/data-archive.ts +69 -0
- package/server/service/data-archive/index.ts +6 -0
- package/server/service/data-key-set/data-key-item-type.ts +31 -0
- package/server/service/data-key-set/data-key-set-mutation.ts +201 -0
- package/server/service/data-key-set/data-key-set-query.ts +68 -0
- package/server/service/data-key-set/data-key-set-type.ts +70 -0
- package/server/service/data-key-set/data-key-set.ts +86 -0
- package/server/service/data-key-set/index.ts +6 -0
- package/server/service/data-ooc/data-ooc-mutation.ts +154 -0
- package/server/service/data-ooc/data-ooc-query.ts +106 -0
- package/server/service/data-ooc/data-ooc-subscription.ts +48 -0
- package/server/service/data-ooc/data-ooc-type.ts +71 -0
- package/server/service/data-ooc/data-ooc.ts +259 -0
- package/server/service/data-ooc/index.ts +7 -0
- package/server/service/data-sample/data-sample-mutation.ts +18 -0
- package/server/service/data-sample/data-sample-query.ts +215 -0
- package/server/service/data-sample/data-sample-type.ts +47 -0
- package/server/service/data-sample/data-sample.ts +193 -0
- package/server/service/data-sample/index.ts +6 -0
- package/server/service/data-sensor/data-sensor-mutation.ts +116 -0
- package/server/service/data-sensor/data-sensor-query.ts +76 -0
- package/server/service/data-sensor/data-sensor-type.ts +104 -0
- package/server/service/data-sensor/data-sensor.ts +126 -0
- package/server/service/data-sensor/index.ts +6 -0
- package/server/service/data-set/data-item-type.ts +155 -0
- package/server/service/data-set/data-set-mutation.ts +552 -0
- package/server/service/data-set/data-set-query.ts +461 -0
- package/server/service/data-set/data-set-type.ts +204 -0
- package/server/service/data-set/data-set.ts +326 -0
- package/server/service/data-set/index.ts +6 -0
- package/server/service/data-set-history/data-set-history-query.ts +126 -0
- package/server/service/data-set-history/data-set-history-type.ts +12 -0
- package/server/service/data-set-history/data-set-history.ts +217 -0
- package/server/service/data-set-history/event-subscriber.ts +17 -0
- package/server/service/data-set-history/index.ts +7 -0
- package/server/service/data-spec/data-spec-manager.ts +21 -0
- package/server/service/data-spec/data-spec-query.ts +21 -0
- package/server/service/data-spec/data-spec.ts +45 -0
- package/server/service/data-spec/index.ts +5 -0
- package/server/service/data-summary/data-summary-mutation.ts +45 -0
- package/server/service/data-summary/data-summary-query.ts +179 -0
- package/server/service/data-summary/data-summary-type.ts +86 -0
- package/server/service/data-summary/data-summary.ts +170 -0
- package/server/service/data-summary/index.ts +7 -0
- package/server/service/index.ts +57 -0
- package/server/tsconfig.json +10 -0
- package/server/utils/config-resolver.ts +29 -0
- 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,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,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
|
+
}
|