@things-factory/dataset 8.0.0 → 9.0.0-beta.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. package/dist-client/activities/activity-data-review-edit.d.ts +5 -1
  2. package/dist-client/activities/activity-data-review-edit.js +143 -5
  3. package/dist-client/activities/activity-data-review-edit.js.map +1 -1
  4. package/dist-client/pages/data-entry/data-entry-list-page.js +2 -2
  5. package/dist-client/pages/data-entry/data-entry-list-page.js.map +1 -1
  6. package/dist-client/tsconfig.tsbuildinfo +1 -1
  7. package/dist-server/activities/activity-data-review.js +18 -5
  8. package/dist-server/activities/activity-data-review.js.map +1 -1
  9. package/dist-server/activities/activity-ooc-review.js +13 -52
  10. package/dist-server/activities/activity-ooc-review.js.map +1 -1
  11. package/dist-server/controllers/create-data-ooc.d.ts +4 -0
  12. package/dist-server/controllers/create-data-ooc.js +65 -0
  13. package/dist-server/controllers/create-data-ooc.js.map +1 -0
  14. package/dist-server/controllers/create-data-sample.js +4 -94
  15. package/dist-server/controllers/create-data-sample.js.map +1 -1
  16. package/dist-server/controllers/index.d.ts +3 -0
  17. package/dist-server/controllers/index.js +3 -0
  18. package/dist-server/controllers/index.js.map +1 -1
  19. package/dist-server/controllers/issue-ooc-resolve.d.ts +3 -0
  20. package/dist-server/controllers/issue-ooc-resolve.js +49 -0
  21. package/dist-server/controllers/issue-ooc-resolve.js.map +1 -0
  22. package/dist-server/controllers/issue-ooc-review.d.ts +3 -0
  23. package/dist-server/controllers/issue-ooc-review.js +47 -0
  24. package/dist-server/controllers/issue-ooc-review.js.map +1 -0
  25. package/dist-server/service/data-sample/data-sample-query.d.ts +1 -1
  26. package/dist-server/service/data-sample/data-sample-query.js +3 -3
  27. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  28. package/dist-server/service/index.d.ts +1 -1
  29. package/dist-server/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +26 -26
  31. package/translations/en.json +3 -0
  32. package/translations/ja.json +3 -0
  33. package/translations/ko.json +3 -0
  34. package/translations/ms.json +3 -0
  35. package/translations/zh.json +3 -0
  36. package/client/activities/activity-data-collect-edit.ts +0 -105
  37. package/client/activities/activity-data-collect-view.ts +0 -91
  38. package/client/activities/activity-data-review-edit.ts +0 -133
  39. package/client/activities/activity-data-review-view.ts +0 -145
  40. package/client/activities/activity-ooc-resolve-edit.ts +0 -195
  41. package/client/activities/activity-ooc-resolve-view.ts +0 -143
  42. package/client/activities/activity-ooc-review-edit.ts +0 -173
  43. package/client/activities/activity-ooc-review-view.ts +0 -129
  44. package/client/bootstrap.ts +0 -35
  45. package/client/components/data-entry-form.ts +0 -109
  46. package/client/index.ts +0 -1
  47. package/client/pages/data-archive/data-archive-list-page.ts +0 -277
  48. package/client/pages/data-archive/data-archive-request-popup.ts +0 -177
  49. package/client/pages/data-entry/data-entry-list-page.ts +0 -464
  50. package/client/pages/data-key-set/data-key-item-list.ts +0 -183
  51. package/client/pages/data-key-set/data-key-set-importer.ts +0 -89
  52. package/client/pages/data-key-set/data-key-set-list-page.ts +0 -413
  53. package/client/pages/data-ooc/data-ooc-list-page.ts +0 -549
  54. package/client/pages/data-ooc/data-ooc-page.ts +0 -164
  55. package/client/pages/data-ooc/data-ooc-view.ts +0 -236
  56. package/client/pages/data-ooc/data-oocs-page.ts +0 -200
  57. package/client/pages/data-report/data-report-embed-page.ts +0 -108
  58. package/client/pages/data-report/data-report-list-page.ts +0 -454
  59. package/client/pages/data-report/data-report-samples-page.ts +0 -174
  60. package/client/pages/data-report/jasper-report-oocs-page.ts +0 -110
  61. package/client/pages/data-report/jasper-report-samples-crosstab-page.ts +0 -110
  62. package/client/pages/data-report/jasper-report-samples-page.ts +0 -110
  63. package/client/pages/data-sample/data-sample-list-page.ts +0 -442
  64. package/client/pages/data-sample/data-sample-page.ts +0 -55
  65. package/client/pages/data-sample/data-sample-search-page.ts +0 -424
  66. package/client/pages/data-sample/data-sample-view.ts +0 -292
  67. package/client/pages/data-sample/data-samples-page.ts +0 -249
  68. package/client/pages/data-sensor/data-sensor-list-page.ts +0 -456
  69. package/client/pages/data-set/data-item-list.ts +0 -304
  70. package/client/pages/data-set/data-set-importer.ts +0 -89
  71. package/client/pages/data-set/data-set-list-page.ts +0 -1078
  72. package/client/pages/data-summary/data-summary-list-page.ts +0 -363
  73. package/client/pages/data-summary/data-summary-period-page.ts +0 -439
  74. package/client/pages/data-summary/data-summary-search-page.ts +0 -426
  75. package/client/pages/data-summary/data-summary-view.ts +0 -133
  76. package/client/route.ts +0 -91
  77. package/client/tsconfig.json +0 -13
  78. package/server/activities/activity-data-collect.ts +0 -100
  79. package/server/activities/activity-data-review.ts +0 -82
  80. package/server/activities/activity-ooc-resolve.ts +0 -123
  81. package/server/activities/activity-ooc-review.ts +0 -144
  82. package/server/activities/index.ts +0 -11
  83. package/server/controllers/create-data-sample.ts +0 -426
  84. package/server/controllers/data-use-case.ts +0 -98
  85. package/server/controllers/finalize-data-collection.ts +0 -388
  86. package/server/controllers/index.ts +0 -3
  87. package/server/controllers/issue-data-collection-task.ts +0 -70
  88. package/server/controllers/jasper-report.ts +0 -186
  89. package/server/controllers/query-data-summary-by-period.ts +0 -178
  90. package/server/controllers/shiny-report.ts +0 -54
  91. package/server/engine/index.ts +0 -1
  92. package/server/engine/task/create-data-sample.ts +0 -100
  93. package/server/engine/task/index.ts +0 -2
  94. package/server/engine/task/issue-collect-data.ts +0 -45
  95. package/server/index.ts +0 -8
  96. package/server/routes.ts +0 -188
  97. package/server/service/data-archive/data-archive-mutation.ts +0 -273
  98. package/server/service/data-archive/data-archive-query.ts +0 -58
  99. package/server/service/data-archive/data-archive-type.ts +0 -48
  100. package/server/service/data-archive/data-archive.ts +0 -69
  101. package/server/service/data-archive/index.ts +0 -6
  102. package/server/service/data-key-set/data-key-item-type.ts +0 -31
  103. package/server/service/data-key-set/data-key-set-mutation.ts +0 -201
  104. package/server/service/data-key-set/data-key-set-query.ts +0 -68
  105. package/server/service/data-key-set/data-key-set-type.ts +0 -70
  106. package/server/service/data-key-set/data-key-set.ts +0 -86
  107. package/server/service/data-key-set/index.ts +0 -6
  108. package/server/service/data-ooc/data-ooc-mutation.ts +0 -154
  109. package/server/service/data-ooc/data-ooc-query.ts +0 -106
  110. package/server/service/data-ooc/data-ooc-subscription.ts +0 -48
  111. package/server/service/data-ooc/data-ooc-type.ts +0 -71
  112. package/server/service/data-ooc/data-ooc.ts +0 -259
  113. package/server/service/data-ooc/index.ts +0 -7
  114. package/server/service/data-sample/data-sample-mutation.ts +0 -18
  115. package/server/service/data-sample/data-sample-query.ts +0 -215
  116. package/server/service/data-sample/data-sample-type.ts +0 -47
  117. package/server/service/data-sample/data-sample.ts +0 -193
  118. package/server/service/data-sample/index.ts +0 -6
  119. package/server/service/data-sensor/data-sensor-mutation.ts +0 -116
  120. package/server/service/data-sensor/data-sensor-query.ts +0 -76
  121. package/server/service/data-sensor/data-sensor-type.ts +0 -104
  122. package/server/service/data-sensor/data-sensor.ts +0 -126
  123. package/server/service/data-sensor/index.ts +0 -6
  124. package/server/service/data-set/data-item-type.ts +0 -155
  125. package/server/service/data-set/data-set-mutation.ts +0 -552
  126. package/server/service/data-set/data-set-query.ts +0 -461
  127. package/server/service/data-set/data-set-type.ts +0 -204
  128. package/server/service/data-set/data-set.ts +0 -326
  129. package/server/service/data-set/index.ts +0 -6
  130. package/server/service/data-set-history/data-set-history-query.ts +0 -126
  131. package/server/service/data-set-history/data-set-history-type.ts +0 -12
  132. package/server/service/data-set-history/data-set-history.ts +0 -217
  133. package/server/service/data-set-history/event-subscriber.ts +0 -17
  134. package/server/service/data-set-history/index.ts +0 -7
  135. package/server/service/data-spec/data-spec-manager.ts +0 -21
  136. package/server/service/data-spec/data-spec-query.ts +0 -21
  137. package/server/service/data-spec/data-spec.ts +0 -45
  138. package/server/service/data-spec/index.ts +0 -5
  139. package/server/service/data-summary/data-summary-mutation.ts +0 -45
  140. package/server/service/data-summary/data-summary-query.ts +0 -179
  141. package/server/service/data-summary/data-summary-type.ts +0 -86
  142. package/server/service/data-summary/data-summary.ts +0 -170
  143. package/server/service/data-summary/index.ts +0 -7
  144. package/server/service/index.ts +0 -57
  145. package/server/tsconfig.json +0 -10
  146. package/server/utils/config-resolver.ts +0 -29
  147. package/server/utils/index.ts +0 -1
@@ -1,178 +0,0 @@
1
- import { In } from 'typeorm'
2
-
3
- import { getQueryBuilderFromListParams, getRepository, getTimesForPeriod, ListParam, Sorting } from '@things-factory/shell'
4
-
5
- import { DataSet, DataSetSummaryPeriodType } from '../service/data-set/data-set'
6
- import { DataSummary } from '../service/data-summary/data-summary'
7
-
8
- const STAT_FUNCTION_MAP = {
9
- sum: 'sum',
10
- mean: 'mean',
11
- stddev: 'standardDeviation',
12
- variance: 'variance',
13
- min: 'min',
14
- max: 'max',
15
- range: 'range',
16
- median: 'median',
17
- mode: 'mode'
18
- }
19
-
20
- export async function queryDataSummaryByPeriod(
21
- period: 'today' | 'this month' | '30 days' | 'this year' | '12 months',
22
- dataSetName: string,
23
- dataKeys: string[] | null,
24
- params: ListParam,
25
- context: ResolverContext
26
- ): Promise<DataSummary[]> {
27
- const { domain, user, tx } = context.state
28
- const { t } = context
29
-
30
- const dataSet = await getRepository(DataSet).findOne({
31
- where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, name: dataSetName },
32
- relations: ['dataKeySet']
33
- })
34
-
35
- if (!dataSet) {
36
- throw new Error(t('error.dataset not found', { dataSetName }))
37
- }
38
-
39
- // limitations
40
- const summaryPeriodType = dataSet.summaryPeriod
41
- if ((summaryPeriodType == DataSetSummaryPeriodType.Day || summaryPeriodType == DataSetSummaryPeriodType.WorkDate) && period == 'today') {
42
- throw new Error(t('error.summary not supported', { dataSetName, period: t(`label.period-${period}`) }))
43
- }
44
-
45
- // dataKeys 가 설정되지 않았다면, dataSet의 dataKeySet을 그대로 적용한다는 의미임.
46
- // dataKeys == [] 라면, dataKeySet을 적용하지 않는다는 의미임.
47
- // dataKeys에는 dataKeySet의 dataKey 값을 따라야 한다.
48
- const dataKeyItems = !dataSet.dataKeySet?.dataKeyItems
49
- ? []
50
- : dataKeys
51
- ? dataKeys
52
- .map(dataKey => {
53
- return dataSet.dataKeySet.dataKeyItems.find(item => item.dataKey == dataKey)
54
- })
55
- .filter(Boolean)
56
- : dataSet.dataKeySet.dataKeyItems
57
-
58
- const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)
59
- const dataItems = dataSet.dataItems.filter(item => item.agg)
60
-
61
- const { from, to } = await getTimesForPeriod(period, context)
62
-
63
- const selectPeriod = queryBuilder => {
64
- if (period == 'today') {
65
- queryBuilder.addSelect('summary.date', 'date').addSelect('summary.period', 'period')
66
- } else if (['this year', '12 months'].includes(period)) {
67
- queryBuilder.addSelect('SUBSTRING(summary.date, 1, 7) AS month')
68
- } else {
69
- queryBuilder.addSelect('summary.date', 'date')
70
- }
71
-
72
- return queryBuilder
73
- }
74
- const selectKeys = dataKeyItems.map((item, index) => {
75
- const aliasName = `key0${index + 1}`
76
- const columnName = `summary.${aliasName}`
77
-
78
- return `${columnName} as ${aliasName}`
79
- }) as string[]
80
- const selectData = dataItems.map((item, index) => {
81
- const aliasName = `data0${index + 1}`
82
- const columnName = `summary.${aliasName}`
83
-
84
- switch (item.agg) {
85
- case STAT_FUNCTION_MAP.sum:
86
- return `SUM(${columnName}) as ${aliasName}`
87
- case STAT_FUNCTION_MAP.mean:
88
- // 일차 mean 된 값들을 다시 계산하므로, 무의미할 수 있다.
89
- return `AVG(${columnName}) as ${aliasName}`
90
- case STAT_FUNCTION_MAP.stddev:
91
- // 일차 stddev 된 값들을 다시 계산하므로, 무의미할 수 있다.
92
- return `STDDEV(${columnName}) as ${aliasName}`
93
- case STAT_FUNCTION_MAP.variance:
94
- // 일차 variance 된 값들을 다시 계산하므로, 무의미할 수 있다.
95
- return `VARIANCE(${columnName}) as ${aliasName}`
96
- case STAT_FUNCTION_MAP.min:
97
- return `MIN(${columnName}) as ${aliasName}`
98
- case STAT_FUNCTION_MAP.max:
99
- return `MAX(${columnName}) as ${aliasName}`
100
- case STAT_FUNCTION_MAP.range:
101
- // 일차 range 값들을 다시 계산하므로, 무의미할 수 있다.
102
- return `MAX(${columnName}) - MIN(${columnName}) as ${aliasName}`
103
- case STAT_FUNCTION_MAP.mode:
104
- // not guaranteed
105
- return `MODE() WITHIN GROUP (ORDER BY ${columnName})`
106
- default:
107
- return `AVG(${columnName}) as ${aliasName}`
108
- }
109
- })
110
-
111
- const groupByPeriod =
112
- period == 'today' ? 'summary.date, summary.period' : ['this year', '12 months'].includes(period) ? 'SUBSTRING(summary.date, 1, 7)' : 'summary.date'
113
- const groupByKeys = dataKeyItems
114
- .map((item, index) => {
115
- return `summary.key0${index + 1}`
116
- })
117
- .join(', ')
118
-
119
- const desc = false
120
- var orderByPeriod: Sorting[] =
121
- period == 'today'
122
- ? [
123
- {
124
- name: 'date',
125
- desc
126
- },
127
- {
128
- name: 'period',
129
- desc
130
- }
131
- ]
132
- : ['this year', '12 months'].includes(period)
133
- ? [{ name: 'month', desc }]
134
- : [{ name: 'date', desc }]
135
-
136
- if (params?.sortings && params.sortings.length > 0) {
137
- orderByPeriod = params.sortings
138
- }
139
-
140
- var queryBuilder = getQueryBuilderFromListParams({
141
- repository: getRepository(DataSummary),
142
- params: {
143
- ...params,
144
- sortings: []
145
- },
146
- domain,
147
- alias: 'summary',
148
- searchables: searchables
149
- })
150
- .select('summary.dataSet')
151
- .addSelect(selectData)
152
- .addSelect('SUM(summary.count)', 'count')
153
- .addSelect('SUM(summary.countOoc)', 'countOoc')
154
- .addSelect('SUM(summary.countOos)', 'countOos')
155
-
156
- queryBuilder = selectPeriod(queryBuilder)
157
- .innerJoin('summary.dataSet', 'ds', 'ds.id = :dataSetName', {
158
- dataSetName: dataSet.id
159
- })
160
- .andWhere('summary.domain = :domain', { domain: domain.id })
161
- .andWhere('summary.date >= :from', { from })
162
- .andWhere('summary.date < :to', { to })
163
- .addGroupBy('summary.dataSet')
164
- .addGroupBy(groupByPeriod)
165
-
166
- if (dataKeyItems.length > 0) {
167
- queryBuilder.addSelect(selectKeys).addGroupBy(groupByKeys)
168
- }
169
-
170
- orderByPeriod.map(orderBy => {
171
- const { name: sort, desc } = orderBy
172
- queryBuilder.addOrderBy(sort, desc ? 'DESC' : 'ASC')
173
- })
174
-
175
- const items = await queryBuilder.getRawMany()
176
-
177
- return items
178
- }
@@ -1,54 +0,0 @@
1
- import { config } from '@things-factory/env'
2
- import { getEndpointUrl } from '../utils/config-resolver'
3
-
4
- import debugLib from 'debug'
5
- const debug = debugLib('things-factory:dataset:shiny-report')
6
- const dataReportConfig = config.get('dataReport')
7
- const {
8
- shiny: {
9
- endpoint: ENDPOINT,
10
- datasource: { database: DATABASE }
11
- }
12
- } = Object.assign(
13
- {
14
- shiny: {
15
- endpoint: {},
16
- datasource: {}
17
- }
18
- },
19
- dataReportConfig
20
- )
21
-
22
- export async function renderShinyReport(context: any) {
23
- debug('render:context', context)
24
-
25
- try {
26
- const cookies = new URLSearchParams(context.header.cookie.replace(/; /g, '&'))
27
- const token = cookies.get('access_token')
28
- const {
29
- state: { domain },
30
- query,
31
- response
32
- } = context
33
-
34
- const urlParams = new URLSearchParams({
35
- token,
36
- ...query,
37
- database: DATABASE,
38
- domain: domain?.subdomain
39
- }).toString()
40
-
41
- const subpath = query?.reportView || ''
42
-
43
- if (!subpath) {
44
- return (context.body = '')
45
- }
46
-
47
- const url = getEndpointUrl(ENDPOINT, subpath)
48
- const reportUrl = `${url}/?${urlParams}`
49
-
50
- response.redirect(reportUrl)
51
- } catch (ex) {
52
- context.body = `Error: ${ex.message} || ''`
53
- }
54
- }
@@ -1 +0,0 @@
1
- import './task'
@@ -1,100 +0,0 @@
1
- import { TaskRegistry, InputStep, Context } from '@things-factory/integration-base'
2
- import { getDataSource } from '@things-factory/shell'
3
- import { access } from '@things-factory/utils'
4
- import i18next from 'i18next'
5
-
6
- import { DataSet } from '../../service/data-set/data-set'
7
-
8
- import { createDataSample } from '../../controllers/create-data-sample'
9
- import { TaskHandler } from '@things-factory/integration-base/dist-server/engine/types'
10
-
11
- async function CreateDataSample(step: InputStep, context: Context) {
12
- const { data, domain, user, lng } = context
13
- var {
14
- params: {
15
- dataset: dataSetId,
16
- source: sourceAccessor,
17
- rawData: rawDataAccessor,
18
- data: dataAccessor,
19
- timestamp: timestampAccessor
20
- }
21
- } = step
22
-
23
- if (!dataSetId) {
24
- throw new Error(`no dataset found`)
25
- }
26
-
27
- // make new data-sample
28
- return await getDataSource().transaction(async tx => {
29
- const dataSet = await tx.getRepository(DataSet).findOne({
30
- where: {
31
- id: dataSetId
32
- }
33
- })
34
-
35
- var source = await access(sourceAccessor, data)
36
- var extractedData = await access(dataAccessor, data)
37
- var extractedRawData = rawDataAccessor && (await access(rawDataAccessor, data))
38
- var timestamp = timestampAccessor && (await access(timestampAccessor, data))
39
-
40
- const dataSample = await createDataSample(
41
- {
42
- dataSet,
43
- data: extractedData,
44
- rawData: extractedRawData,
45
- source,
46
- collectedAt: new Date(timestamp || new Date())
47
- },
48
- {
49
- t: i18next.t,
50
- state: {
51
- domain,
52
- user,
53
- lng,
54
- tx
55
- }
56
- }
57
- )
58
-
59
- return {
60
- data: dataSample
61
- }
62
- })
63
- }
64
-
65
- CreateDataSample.parameterSpec = [
66
- {
67
- type: 'entity-selector',
68
- name: 'dataset',
69
- label: 'data-set',
70
- property: {
71
- queryName: 'dataSets',
72
- valueKey: 'id'
73
- }
74
- },
75
- {
76
- type: 'string',
77
- name: 'source',
78
- label: 'source'
79
- },
80
- {
81
- type: 'string',
82
- name: 'rawData',
83
- label: 'raw-data'
84
- },
85
- {
86
- type: 'string',
87
- name: 'data',
88
- label: 'data'
89
- },
90
- {
91
- type: 'string',
92
- name: 'timestamp',
93
- label: 'timestamp'
94
- }
95
- ]
96
-
97
- CreateDataSample.connectorFree = true
98
- CreateDataSample.help = 'dataset/task/create-data-sample'
99
-
100
- TaskRegistry.registerTaskHandler('create-data-sample', CreateDataSample as TaskHandler)
@@ -1,2 +0,0 @@
1
- import './create-data-sample'
2
- import './issue-collect-data'
@@ -1,45 +0,0 @@
1
- import { TaskRegistry, InputStep, Context } from '@things-factory/integration-base'
2
- import { issueDataCollectionTask } from '../../controllers/issue-data-collection-task'
3
- import i18next from 'i18next'
4
-
5
- async function IssueCollectData(step: InputStep, context: Context) {
6
- const { logger, data, domain, user, lng } = context
7
- var {
8
- params: { dataset: dataSetId }
9
- } = step
10
-
11
- if (!dataSetId) {
12
- throw new Error(`no dataset found`)
13
- }
14
-
15
- const activityInstance = await issueDataCollectionTask(domain.id, dataSetId, {
16
- t: i18next.t,
17
- state: {
18
- domain,
19
- user,
20
- lng,
21
- tx: undefined
22
- }
23
- })
24
-
25
- return {
26
- data: activityInstance
27
- }
28
- }
29
-
30
- IssueCollectData.parameterSpec = [
31
- {
32
- type: 'entity-selector',
33
- name: 'dataset',
34
- label: 'data-set',
35
- property: {
36
- queryName: 'dataSets',
37
- valueKey: 'id'
38
- }
39
- }
40
- ]
41
-
42
- IssueCollectData.connectorFree = true
43
- IssueCollectData.help = 'dataset/task/issue-collect-data'
44
-
45
- TaskRegistry.registerTaskHandler('issue-collect-data', IssueCollectData)
package/server/index.ts DELETED
@@ -1,8 +0,0 @@
1
- import './routes'
2
- import './activities'
3
- import './engine'
4
-
5
- export * from './controllers'
6
- export * from './service'
7
-
8
- export * from './service/data-spec/data-spec-manager'
package/server/routes.ts DELETED
@@ -1,188 +0,0 @@
1
- import { In } from 'typeorm'
2
-
3
- import { Domain, getDataSource } from '@things-factory/shell'
4
- import { User } from '@things-factory/auth-base'
5
- import { runScenario } from '@things-factory/integration-base'
6
- import { ScheduleRegisterRequest } from '@things-factory/scheduler-client'
7
-
8
- import { createDataSample } from './controllers/create-data-sample'
9
- import { renderJasperReport } from './controllers/jasper-report'
10
- import { renderShinyReport } from './controllers/shiny-report'
11
- import { issueDataCollectionTask } from './controllers/issue-data-collection-task'
12
- import { DataSensor } from './service/data-sensor/data-sensor'
13
- import { DataSet } from './service/data-set/data-set'
14
-
15
- process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRouter) => {
16
- /*
17
- * can add global public routes to application (auth not required, tenancy not required)
18
- *
19
- * ex) routes.get('/path', async(context, next) => {})
20
- * ex) routes.post('/path', async(context, next) => {})
21
- */
22
-
23
- globalPublicRouter.post('/sensor-data', async (context, next) => {
24
- // 데이타 검증
25
- const { deviceId, data, rawData, timestamp = Date.now() } = context.request.body
26
- if (!deviceId) {
27
- throw new Error(`The deviceId(${deviceId}) property are mandatory`)
28
- }
29
-
30
- // make new data-sample
31
- await getDataSource().transaction(async tx => {
32
- // find sensor through deviceId
33
- const sensor = await tx.getRepository(DataSensor).findOne({
34
- where: { deviceId },
35
- relations: ['domain', 'appliance', 'dataSet', 'decoder']
36
- })
37
-
38
- if (!sensor) {
39
- throw new Error(`Sensor having given deviceId(${deviceId}) not found`)
40
- }
41
-
42
- if (!sensor.active) {
43
- throw new Error(`State of the sensor given deviceId(${deviceId}) is not active`)
44
- }
45
-
46
- if (!sensor.appliance) {
47
- throw new Error(`Appliance of the sensor given deviceId(${deviceId}) is not set up`)
48
- }
49
-
50
- const domain = sensor.domain
51
- const dataSet = sensor.dataSet
52
-
53
- /*
54
- 원칙적으로 user 인증정보를 가지고 요청해야 하지만, 인증정보를 보낼 수 없는 상황이라고 전제하여 처리한다.
55
- 앞으로, 보완되어야 한다.
56
- */
57
- const user: User =
58
- context.user ||
59
- (await tx.getRepository(User).findOne({
60
- where: {
61
- reference: sensor.appliance.id,
62
- userType: 'appliance'
63
- }
64
- }))
65
-
66
- context.state = {
67
- user,
68
- ...context.state,
69
- domain,
70
- tx
71
- }
72
-
73
- var decoded
74
- if (sensor.decoder) {
75
- const { name: scenarioName } = sensor.decoder
76
- const variables = {
77
- dataSensor: sensor,
78
- source: deviceId,
79
- data,
80
- rawData,
81
- timestamp
82
- }
83
-
84
- decoded = (await runScenario(null, scenarioName, variables, context))?.result
85
- }
86
-
87
- if (dataSet) {
88
- await createDataSample(
89
- {
90
- dataSet,
91
- data,
92
- rawData,
93
- source: deviceId,
94
- collectedAt: new Date(timestamp),
95
- ...decoded
96
- },
97
- context
98
- )
99
- }
100
-
101
- context.status = 200
102
- context.body = {
103
- data,
104
- ...decoded
105
- }
106
- })
107
- })
108
-
109
- /* When a callback occurs from the scheduler when a scheduled dataset is on schedule, data collection task for the dataset should be issued. */
110
- globalPublicRouter.post('/callback-schedule-for-dataset', async (context, next) => {
111
- const { client } = context.request.body as ScheduleRegisterRequest
112
-
113
- if (!client || typeof client !== 'object') {
114
- throw new Error('client property should be a part of callback body.')
115
- }
116
-
117
- const { group: domainId, key: dataSetId } = client
118
-
119
- if (!domainId || !dataSetId) {
120
- throw new Error(`group(${domainId}) and key(${dataSetId}) properties should not be empty`)
121
- }
122
-
123
- await issueDataCollectionTask(domainId, dataSetId, context)
124
-
125
- context.status = 200
126
- })
127
-
128
- /* When a callback occurs from the scheduler when a scheduled summary is on schedule, data summary procedure for the dataset should be executed. */
129
- globalPublicRouter.post('/callback-schedule-for-data-summary', async (context, next) => {
130
- const { client } = context.request.body as ScheduleRegisterRequest
131
-
132
- if (!client || typeof client !== 'object') {
133
- throw new Error('client property should be a part of callback body.')
134
- }
135
-
136
- const { group: domainId, key: dataSetId } = client
137
-
138
- if (!domainId || !dataSetId) {
139
- throw new Error(`group(${domainId}) and key(${dataSetId}) properties should not be empty`)
140
- }
141
-
142
- await getDataSource().transaction(async tx => {
143
- const domain = await tx.getRepository(Domain).findOneBy({ id: domainId })
144
-
145
- if (!domain) {
146
- throw new Error(`domain(${domainId}) not found`)
147
- }
148
-
149
- const dataSet = await tx
150
- .getRepository(DataSet)
151
- .findOne({ where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id: dataSetId } })
152
-
153
- // do what you gotta do
154
- })
155
-
156
- context.status = 200
157
- })
158
- })
159
-
160
- process.on('bootstrap-module-global-private-route' as any, (app, globalPrivateRouter) => {
161
- /*
162
- * can add global private routes to application (auth required, tenancy not required)
163
- */
164
- })
165
-
166
- process.on('bootstrap-module-domain-public-route' as any, (app, domainPublicRouter) => {
167
- /*
168
- * can add domain public routes to application (auth not required, tenancy required)
169
- */
170
- })
171
-
172
- process.on('bootstrap-module-domain-private-route' as any, (app, domainPrivateRouter) => {
173
- /*
174
- * can add domain private routes to application (auth required, tenancy required)
175
- */
176
- domainPrivateRouter.get('/data-report/jasper', async (context, next) => {
177
- context.body = await renderJasperReport(context)
178
- })
179
-
180
- domainPrivateRouter.get('/data-report/shiny', async (context, next) => {
181
- await renderShinyReport(context)
182
- })
183
-
184
- domainPrivateRouter.get('/data-report/:reportType', async (context, next) => {
185
- let { reportType } = context.params
186
- context.body = `${reportType} Not Implemented.`
187
- })
188
- })