@things-factory/dataset 7.0.0-alpha.0 → 7.0.0-alpha.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/client/activities/activity-data-collect-edit.ts +1 -7
  2. package/client/activities/activity-data-collect-view.ts +7 -0
  3. package/client/activities/activity-data-review-edit.ts +66 -32
  4. package/client/activities/activity-data-review-view.ts +75 -29
  5. package/client/activities/activity-ooc-resolve-edit.ts +44 -48
  6. package/client/activities/activity-ooc-resolve-view.ts +25 -35
  7. package/client/activities/activity-ooc-review-edit.ts +36 -29
  8. package/client/activities/activity-ooc-review-view.ts +9 -19
  9. package/client/bootstrap.ts +5 -9
  10. package/client/pages/data-entry/data-entry-list-page.ts +8 -23
  11. package/client/pages/data-ooc/data-ooc-list-page.ts +71 -27
  12. package/client/pages/data-ooc/{data-ooc-view-page.ts → data-ooc-page.ts} +45 -1
  13. package/client/pages/data-ooc/data-ooc-view.ts +198 -41
  14. package/client/pages/data-ooc/data-oocs-page.ts +200 -0
  15. package/client/pages/data-sample/data-sample-list-page.ts +53 -31
  16. package/client/pages/data-sample/{data-sample-view-page.ts → data-sample-page.ts} +8 -1
  17. package/client/pages/data-sample/data-sample-search-page.ts +30 -25
  18. package/client/pages/data-sample/data-sample-view.ts +192 -21
  19. package/client/pages/data-sample/data-samples-page.ts +249 -0
  20. package/client/pages/data-sensor/data-sensor-list-page.ts +28 -6
  21. package/client/pages/data-set/data-item-list.ts +14 -8
  22. package/client/pages/data-set/data-set-list-page.ts +11 -21
  23. package/client/pages/data-summary/data-summary-list-page.ts +12 -24
  24. package/client/route.ts +10 -2
  25. package/dist-client/activities/activity-data-collect-edit.js +1 -7
  26. package/dist-client/activities/activity-data-collect-edit.js.map +1 -1
  27. package/dist-client/activities/activity-data-collect-view.js +7 -0
  28. package/dist-client/activities/activity-data-collect-view.js.map +1 -1
  29. package/dist-client/activities/activity-data-review-edit.d.ts +1 -1
  30. package/dist-client/activities/activity-data-review-edit.js +63 -33
  31. package/dist-client/activities/activity-data-review-edit.js.map +1 -1
  32. package/dist-client/activities/activity-data-review-view.d.ts +1 -1
  33. package/dist-client/activities/activity-data-review-view.js +72 -30
  34. package/dist-client/activities/activity-data-review-view.js.map +1 -1
  35. package/dist-client/activities/activity-ooc-resolve-edit.d.ts +1 -1
  36. package/dist-client/activities/activity-ooc-resolve-edit.js +44 -48
  37. package/dist-client/activities/activity-ooc-resolve-edit.js.map +1 -1
  38. package/dist-client/activities/activity-ooc-resolve-view.d.ts +13 -0
  39. package/dist-client/activities/activity-ooc-resolve-view.js +24 -34
  40. package/dist-client/activities/activity-ooc-resolve-view.js.map +1 -1
  41. package/dist-client/activities/activity-ooc-review-edit.js +39 -29
  42. package/dist-client/activities/activity-ooc-review-edit.js.map +1 -1
  43. package/dist-client/activities/activity-ooc-review-view.js +9 -19
  44. package/dist-client/activities/activity-ooc-review-view.js.map +1 -1
  45. package/dist-client/bootstrap.d.ts +4 -4
  46. package/dist-client/bootstrap.js +4 -4
  47. package/dist-client/bootstrap.js.map +1 -1
  48. package/dist-client/pages/data-entry/data-entry-list-page.js +3 -15
  49. package/dist-client/pages/data-entry/data-entry-list-page.js.map +1 -1
  50. package/dist-client/pages/data-ooc/data-ooc-list-page.d.ts +6 -0
  51. package/dist-client/pages/data-ooc/data-ooc-list-page.js +67 -24
  52. package/dist-client/pages/data-ooc/data-ooc-list-page.js.map +1 -1
  53. package/dist-client/pages/data-ooc/{data-ooc-view-page.js → data-ooc-page.js} +46 -2
  54. package/dist-client/pages/data-ooc/data-ooc-page.js.map +1 -0
  55. package/dist-client/pages/data-ooc/data-ooc-view.d.ts +11 -4
  56. package/dist-client/pages/data-ooc/data-ooc-view.js +193 -48
  57. package/dist-client/pages/data-ooc/data-ooc-view.js.map +1 -1
  58. package/dist-client/pages/data-ooc/data-oocs-page.d.ts +18 -0
  59. package/dist-client/pages/data-ooc/data-oocs-page.js +200 -0
  60. package/dist-client/pages/data-ooc/data-oocs-page.js.map +1 -0
  61. package/dist-client/pages/data-sample/data-sample-list-page.d.ts +6 -1
  62. package/dist-client/pages/data-sample/data-sample-list-page.js +51 -28
  63. package/dist-client/pages/data-sample/data-sample-list-page.js.map +1 -1
  64. package/dist-client/pages/data-sample/{data-sample-view-page.js → data-sample-page.js} +9 -2
  65. package/dist-client/pages/data-sample/data-sample-page.js.map +1 -0
  66. package/dist-client/pages/data-sample/data-sample-search-page.d.ts +6 -1
  67. package/dist-client/pages/data-sample/data-sample-search-page.js +28 -22
  68. package/dist-client/pages/data-sample/data-sample-search-page.js.map +1 -1
  69. package/dist-client/pages/data-sample/data-sample-view.d.ts +18 -0
  70. package/dist-client/pages/data-sample/data-sample-view.js +186 -19
  71. package/dist-client/pages/data-sample/data-sample-view.js.map +1 -1
  72. package/dist-client/pages/data-sample/data-samples-page.d.ts +21 -0
  73. package/dist-client/pages/data-sample/data-samples-page.js +249 -0
  74. package/dist-client/pages/data-sample/data-samples-page.js.map +1 -0
  75. package/dist-client/pages/data-sensor/data-sensor-list-page.js +28 -6
  76. package/dist-client/pages/data-sensor/data-sensor-list-page.js.map +1 -1
  77. package/dist-client/pages/data-set/data-item-list.js +14 -8
  78. package/dist-client/pages/data-set/data-item-list.js.map +1 -1
  79. package/dist-client/pages/data-set/data-set-list-page.js +3 -10
  80. package/dist-client/pages/data-set/data-set-list-page.js.map +1 -1
  81. package/dist-client/pages/data-summary/data-summary-list-page.js +12 -21
  82. package/dist-client/pages/data-summary/data-summary-list-page.js.map +1 -1
  83. package/dist-client/route.js +8 -2
  84. package/dist-client/route.js.map +1 -1
  85. package/dist-client/tsconfig.tsbuildinfo +1 -1
  86. package/dist-server/activities/activity-data-collect.js.map +1 -1
  87. package/dist-server/activities/activity-data-review.js.map +1 -1
  88. package/dist-server/activities/activity-ooc-review.js +3 -2
  89. package/dist-server/activities/activity-ooc-review.js.map +1 -1
  90. package/dist-server/controllers/create-data-sample.js +27 -29
  91. package/dist-server/controllers/create-data-sample.js.map +1 -1
  92. package/dist-server/controllers/{generate-data-summary.js → finalize-data-collection.js} +10 -30
  93. package/dist-server/controllers/finalize-data-collection.js.map +1 -0
  94. package/dist-server/controllers/issue-collect-data.js +55 -0
  95. package/dist-server/controllers/issue-collect-data.js.map +1 -0
  96. package/dist-server/controllers/query-data-summary-by-period.js +4 -9
  97. package/dist-server/controllers/query-data-summary-by-period.js.map +1 -1
  98. package/dist-server/engine/index.js +4 -0
  99. package/dist-server/engine/index.js.map +1 -0
  100. package/dist-server/engine/task/create-data-sample.js +80 -0
  101. package/dist-server/engine/task/create-data-sample.js.map +1 -0
  102. package/dist-server/engine/task/index.js +5 -0
  103. package/dist-server/engine/task/index.js.map +1 -0
  104. package/dist-server/engine/task/issue-collect-data.js +40 -0
  105. package/dist-server/engine/task/issue-collect-data.js.map +1 -0
  106. package/dist-server/index.js +1 -0
  107. package/dist-server/index.js.map +1 -1
  108. package/dist-server/routes.js +36 -65
  109. package/dist-server/routes.js.map +1 -1
  110. package/dist-server/service/data-ooc/data-ooc-query.js +32 -0
  111. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -1
  112. package/dist-server/service/data-ooc/data-ooc-subscription.js +4 -4
  113. package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -1
  114. package/dist-server/service/data-ooc/data-ooc.js +44 -37
  115. package/dist-server/service/data-ooc/data-ooc.js.map +1 -1
  116. package/dist-server/service/data-sample/data-sample-query.js +24 -0
  117. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  118. package/dist-server/service/data-sample/data-sample.js +30 -31
  119. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  120. package/dist-server/service/data-sensor/data-sensor-query.js +16 -1
  121. package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
  122. package/dist-server/service/data-sensor/data-sensor-type.js +8 -0
  123. package/dist-server/service/data-sensor/data-sensor-type.js.map +1 -1
  124. package/dist-server/service/data-sensor/data-sensor.js +15 -1
  125. package/dist-server/service/data-sensor/data-sensor.js.map +1 -1
  126. package/dist-server/service/data-set/data-item-type.js +17 -2
  127. package/dist-server/service/data-set/data-item-type.js.map +1 -1
  128. package/dist-server/service/data-set/data-set-mutation.js +2 -2
  129. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  130. package/dist-server/service/data-set/data-set-query.js +2 -2
  131. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  132. package/dist-server/service/data-summary/data-summary-mutation.js +34 -5
  133. package/dist-server/service/data-summary/data-summary-mutation.js.map +1 -1
  134. package/dist-server/service/data-summary/data-summary.js +8 -8
  135. package/dist-server/service/data-summary/data-summary.js.map +1 -1
  136. package/dist-server/tsconfig.tsbuildinfo +1 -1
  137. package/helps/config/dataArchive.md +21 -0
  138. package/helps/config/dataReport.md +34 -0
  139. package/helps/dataset/task/create-data-sample.ja.md +28 -0
  140. package/helps/dataset/task/create-data-sample.ko.md +28 -0
  141. package/helps/dataset/task/create-data-sample.md +28 -0
  142. package/helps/dataset/task/create-data-sample.ms.md +30 -0
  143. package/helps/dataset/task/create-data-sample.zh.md +28 -0
  144. package/helps/dataset/task/issue-collect-data.ja.md +35 -0
  145. package/helps/dataset/task/issue-collect-data.ko.md +32 -0
  146. package/helps/dataset/task/issue-collect-data.md +32 -0
  147. package/helps/dataset/task/issue-collect-data.ms.md +34 -0
  148. package/helps/dataset/task/issue-collect-data.zh.md +32 -0
  149. package/helps/dataset/ui/data-item-list.ko.md +17 -2
  150. package/package.json +14 -11
  151. package/server/activities/activity-data-collect.ts +3 -11
  152. package/server/activities/activity-data-review.ts +1 -5
  153. package/server/activities/activity-ooc-review.ts +6 -16
  154. package/server/controllers/create-data-sample.ts +31 -38
  155. package/server/controllers/{generate-data-summary.ts → finalize-data-collection.ts} +7 -39
  156. package/server/controllers/issue-collect-data.ts +61 -0
  157. package/server/controllers/query-data-summary-by-period.ts +5 -18
  158. package/server/engine/index.ts +1 -0
  159. package/server/engine/task/create-data-sample.ts +92 -0
  160. package/server/engine/task/index.ts +2 -0
  161. package/server/engine/task/issue-collect-data.ts +45 -0
  162. package/server/index.ts +1 -0
  163. package/server/routes.ts +47 -76
  164. package/server/service/data-ooc/data-ooc-query.ts +17 -0
  165. package/server/service/data-ooc/data-ooc-subscription.ts +7 -7
  166. package/server/service/data-ooc/data-ooc.ts +39 -51
  167. package/server/service/data-sample/data-sample-query.ts +17 -17
  168. package/server/service/data-sample/data-sample.ts +29 -52
  169. package/server/service/data-sensor/data-sensor-query.ts +13 -1
  170. package/server/service/data-sensor/data-sensor-type.ts +6 -0
  171. package/server/service/data-sensor/data-sensor.ts +13 -11
  172. package/server/service/data-set/data-item-type.ts +19 -10
  173. package/server/service/data-set/data-set-mutation.ts +9 -31
  174. package/server/service/data-set/data-set-query.ts +7 -7
  175. package/server/service/data-summary/data-summary-mutation.ts +24 -7
  176. package/server/service/data-summary/data-summary.ts +10 -23
  177. package/things-factory.config.js +10 -2
  178. package/translations/en.json +17 -3
  179. package/translations/ja.json +14 -2
  180. package/translations/ko.json +16 -2
  181. package/translations/ms.json +13 -1
  182. package/translations/zh.json +14 -2
  183. package/dist-client/pages/data-ooc/data-ooc-view-page.js.map +0 -1
  184. package/dist-client/pages/data-sample/data-sample-view-page.js.map +0 -1
  185. package/dist-server/controllers/generate-data-summary.js.map +0 -1
  186. /package/dist-client/pages/data-ooc/{data-ooc-view-page.d.ts → data-ooc-page.d.ts} +0 -0
  187. /package/dist-client/pages/data-sample/{data-sample-view-page.d.ts → data-sample-page.d.ts} +0 -0
@@ -29,8 +29,7 @@ async function queryDataSummaryByPeriod(period, dataSetName, dataKeys, params, c
29
29
  }
30
30
  // limitations
31
31
  const summaryPeriodType = dataSet.summaryPeriod;
32
- if ((summaryPeriodType == data_set_1.DataSetSummaryPeriodType.Day || summaryPeriodType == data_set_1.DataSetSummaryPeriodType.WorkDate) &&
33
- period == 'today') {
32
+ if ((summaryPeriodType == data_set_1.DataSetSummaryPeriodType.Day || summaryPeriodType == data_set_1.DataSetSummaryPeriodType.WorkDate) && period == 'today') {
34
33
  throw new Error(t('error.summary not supported', { dataSetName, period: t(`label.period-${period}`) }));
35
34
  }
36
35
  // dataKeys 가 설정되지 않았다면, dataSet의 dataKeySet을 그대로 적용한다는 의미임.
@@ -46,7 +45,7 @@ async function queryDataSummaryByPeriod(period, dataSetName, dataKeys, params, c
46
45
  .filter(Boolean)
47
46
  : dataSet.dataKeySet.dataKeyItems;
48
47
  const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`);
49
- const dataItems = dataSet.dataItems.filter(item => item.stat);
48
+ const dataItems = dataSet.dataItems.filter(item => item.agg);
50
49
  const { from, to } = await (0, shell_1.getTimesForPeriod)(period, context);
51
50
  const selectPeriod = queryBuilder => {
52
51
  if (period == 'today') {
@@ -68,7 +67,7 @@ async function queryDataSummaryByPeriod(period, dataSetName, dataKeys, params, c
68
67
  const selectData = dataItems.map((item, index) => {
69
68
  const aliasName = `data0${index + 1}`;
70
69
  const columnName = `summary.${aliasName}`;
71
- switch (item.stat) {
70
+ switch (item.agg) {
72
71
  case STAT_FUNCTION_MAP.sum:
73
72
  return `SUM(${columnName}) as ${aliasName}`;
74
73
  case STAT_FUNCTION_MAP.mean:
@@ -94,11 +93,7 @@ async function queryDataSummaryByPeriod(period, dataSetName, dataKeys, params, c
94
93
  return `AVG(${columnName}) as ${aliasName}`;
95
94
  }
96
95
  });
97
- const groupByPeriod = period == 'today'
98
- ? 'summary.date, summary.period'
99
- : ['this year', '12 months'].includes(period)
100
- ? 'SUBSTRING(summary.date, 1, 7)'
101
- : 'summary.date';
96
+ const groupByPeriod = period == 'today' ? 'summary.date, summary.period' : ['this year', '12 months'].includes(period) ? 'SUBSTRING(summary.date, 1, 7)' : 'summary.date';
102
97
  const groupByKeys = dataKeyItems
103
98
  .map((item, index) => {
104
99
  return `summary.key0${index + 1}`;
@@ -1 +1 @@
1
- {"version":3,"file":"query-data-summary-by-period.js","sourceRoot":"","sources":["../../server/controllers/query-data-summary-by-period.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\n\nimport {\n getQueryBuilderFromListParams,\n getRepository,\n getTimesForPeriod,\n ListParam,\n Sorting\n} from '@things-factory/shell'\n\nimport { DataSet, DataSetSummaryPeriodType } from '../service/data-set/data-set'\nimport { DataSummary } from '../service/data-summary/data-summary'\n\nconst STAT_FUNCTION_MAP = {\n sum: 'sum',\n mean: 'mean',\n stddev: 'standardDeviation',\n variance: 'variance',\n min: 'min',\n max: 'max',\n range: 'range',\n median: 'median',\n mode: 'mode'\n}\n\nexport async function queryDataSummaryByPeriod(\n period: 'today' | 'this month' | '30 days' | 'this year' | '12 months',\n dataSetName: string,\n dataKeys: string[] | null,\n params: ListParam,\n context: ResolverContext\n): Promise<DataSummary[]> {\n const { domain, user, tx } = context.state\n const { t } = context\n\n const dataSet = await getRepository(DataSet).findOne({\n where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, name: dataSetName },\n relations: ['dataKeySet']\n })\n\n if (!dataSet) {\n throw new Error(t('error.dataset not found', { dataSetName }))\n }\n\n // limitations\n const summaryPeriodType = dataSet.summaryPeriod\n if (\n (summaryPeriodType == DataSetSummaryPeriodType.Day || summaryPeriodType == DataSetSummaryPeriodType.WorkDate) &&\n period == 'today'\n ) {\n throw new Error(t('error.summary not supported', { dataSetName, period: t(`label.period-${period}`) }))\n }\n\n // dataKeys 가 설정되지 않았다면, dataSet의 dataKeySet을 그대로 적용한다는 의미임.\n // dataKeys == [] 라면, dataKeySet을 적용하지 않는다는 의미임.\n // dataKeys에는 dataKeySet의 dataKey 값을 따라야 한다.\n const dataKeyItems = !dataSet.dataKeySet?.dataKeyItems\n ? []\n : dataKeys\n ? dataKeys\n .map(dataKey => {\n return dataSet.dataKeySet.dataKeyItems.find(item => item.dataKey == dataKey)\n })\n .filter(Boolean)\n : dataSet.dataKeySet.dataKeyItems\n\n const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)\n const dataItems = dataSet.dataItems.filter(item => item.stat)\n\n const { from, to } = await getTimesForPeriod(period, context)\n\n const selectPeriod = queryBuilder => {\n if (period == 'today') {\n queryBuilder.addSelect('summary.date', 'date').addSelect('summary.period', 'period')\n } else if (['this year', '12 months'].includes(period)) {\n queryBuilder.addSelect('SUBSTRING(summary.date, 1, 7) AS month')\n } else {\n queryBuilder.addSelect('summary.date', 'date')\n }\n\n return queryBuilder\n }\n const selectKeys = dataKeyItems.map((item, index) => {\n const aliasName = `key0${index + 1}`\n const columnName = `summary.${aliasName}`\n\n return `${columnName} as ${aliasName}`\n }) as string[]\n const selectData = dataItems.map((item, index) => {\n const aliasName = `data0${index + 1}`\n const columnName = `summary.${aliasName}`\n\n switch (item.stat) {\n case STAT_FUNCTION_MAP.sum:\n return `SUM(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.mean:\n // 일차 mean 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `AVG(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.stddev:\n // 일차 stddev 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `STDDEV(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.variance:\n // 일차 variance 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `VARIANCE(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.min:\n return `MIN(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.max:\n return `MAX(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.range:\n // 일차 range 값들을 다시 계산하므로, 무의미할 수 있다.\n return `MAX(${columnName}) - MIN(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.mode:\n // not guaranteed\n return `MODE() WITHIN GROUP (ORDER BY ${columnName})`\n default:\n return `AVG(${columnName}) as ${aliasName}`\n }\n })\n\n const groupByPeriod =\n period == 'today'\n ? 'summary.date, summary.period'\n : ['this year', '12 months'].includes(period)\n ? 'SUBSTRING(summary.date, 1, 7)'\n : 'summary.date'\n const groupByKeys = dataKeyItems\n .map((item, index) => {\n return `summary.key0${index + 1}`\n })\n .join(', ')\n\n const desc = false\n var orderByPeriod: Sorting[] =\n period == 'today'\n ? [\n {\n name: 'date',\n desc\n },\n {\n name: 'period',\n desc\n }\n ]\n : ['this year', '12 months'].includes(period)\n ? [{ name: 'month', desc }]\n : [{ name: 'date', desc }]\n\n if (params?.sortings && params.sortings.length > 0) {\n orderByPeriod = params.sortings\n }\n\n var queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSummary),\n params: {\n ...params,\n sortings: []\n },\n domain,\n alias: 'summary',\n searchables: searchables\n })\n .select('summary.dataSet')\n .addSelect(selectData)\n .addSelect('SUM(summary.count)', 'count')\n .addSelect('SUM(summary.countOoc)', 'countOoc')\n .addSelect('SUM(summary.countOos)', 'countOos')\n\n queryBuilder = selectPeriod(queryBuilder)\n .innerJoin('summary.dataSet', 'ds', 'ds.id = :dataSetName', {\n dataSetName: dataSet.id\n })\n .andWhere('summary.domain = :domain', { domain: domain.id })\n .andWhere('summary.date >= :from', { from })\n .andWhere('summary.date < :to', { to })\n .addGroupBy('summary.dataSet')\n .addGroupBy(groupByPeriod)\n\n if (dataKeyItems.length > 0) {\n queryBuilder.addSelect(selectKeys).addGroupBy(groupByKeys)\n }\n\n orderByPeriod.map(orderBy => {\n const { name: sort, desc } = orderBy\n queryBuilder.addOrderBy(sort, desc ? 'DESC' : 'ASC')\n })\n\n const items = await queryBuilder.getRawMany()\n\n return items\n}\n"]}
1
+ {"version":3,"file":"query-data-summary-by-period.js","sourceRoot":"","sources":["../../server/controllers/query-data-summary-by-period.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\n\nimport { getQueryBuilderFromListParams, getRepository, getTimesForPeriod, ListParam, Sorting } from '@things-factory/shell'\n\nimport { DataSet, DataSetSummaryPeriodType } from '../service/data-set/data-set'\nimport { DataSummary } from '../service/data-summary/data-summary'\n\nconst STAT_FUNCTION_MAP = {\n sum: 'sum',\n mean: 'mean',\n stddev: 'standardDeviation',\n variance: 'variance',\n min: 'min',\n max: 'max',\n range: 'range',\n median: 'median',\n mode: 'mode'\n}\n\nexport async function queryDataSummaryByPeriod(\n period: 'today' | 'this month' | '30 days' | 'this year' | '12 months',\n dataSetName: string,\n dataKeys: string[] | null,\n params: ListParam,\n context: ResolverContext\n): Promise<DataSummary[]> {\n const { domain, user, tx } = context.state\n const { t } = context\n\n const dataSet = await getRepository(DataSet).findOne({\n where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, name: dataSetName },\n relations: ['dataKeySet']\n })\n\n if (!dataSet) {\n throw new Error(t('error.dataset not found', { dataSetName }))\n }\n\n // limitations\n const summaryPeriodType = dataSet.summaryPeriod\n if ((summaryPeriodType == DataSetSummaryPeriodType.Day || summaryPeriodType == DataSetSummaryPeriodType.WorkDate) && period == 'today') {\n throw new Error(t('error.summary not supported', { dataSetName, period: t(`label.period-${period}`) }))\n }\n\n // dataKeys 가 설정되지 않았다면, dataSet의 dataKeySet을 그대로 적용한다는 의미임.\n // dataKeys == [] 라면, dataKeySet을 적용하지 않는다는 의미임.\n // dataKeys에는 dataKeySet의 dataKey 값을 따라야 한다.\n const dataKeyItems = !dataSet.dataKeySet?.dataKeyItems\n ? []\n : dataKeys\n ? dataKeys\n .map(dataKey => {\n return dataSet.dataKeySet.dataKeyItems.find(item => item.dataKey == dataKey)\n })\n .filter(Boolean)\n : dataSet.dataKeySet.dataKeyItems\n\n const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)\n const dataItems = dataSet.dataItems.filter(item => item.agg)\n\n const { from, to } = await getTimesForPeriod(period, context)\n\n const selectPeriod = queryBuilder => {\n if (period == 'today') {\n queryBuilder.addSelect('summary.date', 'date').addSelect('summary.period', 'period')\n } else if (['this year', '12 months'].includes(period)) {\n queryBuilder.addSelect('SUBSTRING(summary.date, 1, 7) AS month')\n } else {\n queryBuilder.addSelect('summary.date', 'date')\n }\n\n return queryBuilder\n }\n const selectKeys = dataKeyItems.map((item, index) => {\n const aliasName = `key0${index + 1}`\n const columnName = `summary.${aliasName}`\n\n return `${columnName} as ${aliasName}`\n }) as string[]\n const selectData = dataItems.map((item, index) => {\n const aliasName = `data0${index + 1}`\n const columnName = `summary.${aliasName}`\n\n switch (item.agg) {\n case STAT_FUNCTION_MAP.sum:\n return `SUM(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.mean:\n // 일차 mean 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `AVG(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.stddev:\n // 일차 stddev 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `STDDEV(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.variance:\n // 일차 variance 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `VARIANCE(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.min:\n return `MIN(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.max:\n return `MAX(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.range:\n // 일차 range 값들을 다시 계산하므로, 무의미할 수 있다.\n return `MAX(${columnName}) - MIN(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.mode:\n // not guaranteed\n return `MODE() WITHIN GROUP (ORDER BY ${columnName})`\n default:\n return `AVG(${columnName}) as ${aliasName}`\n }\n })\n\n const groupByPeriod =\n period == 'today' ? 'summary.date, summary.period' : ['this year', '12 months'].includes(period) ? 'SUBSTRING(summary.date, 1, 7)' : 'summary.date'\n const groupByKeys = dataKeyItems\n .map((item, index) => {\n return `summary.key0${index + 1}`\n })\n .join(', ')\n\n const desc = false\n var orderByPeriod: Sorting[] =\n period == 'today'\n ? [\n {\n name: 'date',\n desc\n },\n {\n name: 'period',\n desc\n }\n ]\n : ['this year', '12 months'].includes(period)\n ? [{ name: 'month', desc }]\n : [{ name: 'date', desc }]\n\n if (params?.sortings && params.sortings.length > 0) {\n orderByPeriod = params.sortings\n }\n\n var queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSummary),\n params: {\n ...params,\n sortings: []\n },\n domain,\n alias: 'summary',\n searchables: searchables\n })\n .select('summary.dataSet')\n .addSelect(selectData)\n .addSelect('SUM(summary.count)', 'count')\n .addSelect('SUM(summary.countOoc)', 'countOoc')\n .addSelect('SUM(summary.countOos)', 'countOos')\n\n queryBuilder = selectPeriod(queryBuilder)\n .innerJoin('summary.dataSet', 'ds', 'ds.id = :dataSetName', {\n dataSetName: dataSet.id\n })\n .andWhere('summary.domain = :domain', { domain: domain.id })\n .andWhere('summary.date >= :from', { from })\n .andWhere('summary.date < :to', { to })\n .addGroupBy('summary.dataSet')\n .addGroupBy(groupByPeriod)\n\n if (dataKeyItems.length > 0) {\n queryBuilder.addSelect(selectKeys).addGroupBy(groupByKeys)\n }\n\n orderByPeriod.map(orderBy => {\n const { name: sort, desc } = orderBy\n queryBuilder.addOrderBy(sort, desc ? 'DESC' : 'ASC')\n })\n\n const items = await queryBuilder.getRawMany()\n\n return items\n}\n"]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("./task");
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/engine/index.ts"],"names":[],"mappings":";;AAAA,kBAAe","sourcesContent":["import './task'\n"]}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const integration_base_1 = require("@things-factory/integration-base");
5
+ const shell_1 = require("@things-factory/shell");
6
+ const utils_1 = require("@things-factory/utils");
7
+ const i18next_1 = tslib_1.__importDefault(require("i18next"));
8
+ const data_set_1 = require("../../service/data-set/data-set");
9
+ const create_data_sample_1 = require("../../controllers/create-data-sample");
10
+ async function CreateDataSample(step, context) {
11
+ const { logger, data, domain, user, lng } = context;
12
+ var { params: { dataset: dataSetId, source: sourceAccessor, rawData: rawDataAccessor, data: dataAccessor, timestamp } } = step;
13
+ if (!dataSetId) {
14
+ throw new Error(`no dataset found`);
15
+ }
16
+ // make new data-sample
17
+ await (0, shell_1.getDataSource)().transaction(async (tx) => {
18
+ const dataSet = await tx.getRepository(data_set_1.DataSet).findOne({
19
+ where: {
20
+ id: dataSetId
21
+ }
22
+ });
23
+ var source = await (0, utils_1.access)(sourceAccessor, data);
24
+ var extractedData = await (0, utils_1.access)(dataAccessor, data);
25
+ var extractedRawData = rawDataAccessor && (await (0, utils_1.access)(rawDataAccessor, data));
26
+ const dataSample = await (0, create_data_sample_1.createDataSample)({
27
+ dataSet,
28
+ data: extractedData,
29
+ rawData: extractedRawData,
30
+ source,
31
+ collectedAt: new Date(timestamp || new Date())
32
+ }, {
33
+ t: i18next_1.default.t,
34
+ state: {
35
+ domain,
36
+ user,
37
+ lng,
38
+ tx
39
+ }
40
+ });
41
+ return {
42
+ data: dataSample
43
+ };
44
+ });
45
+ }
46
+ CreateDataSample.parameterSpec = [
47
+ {
48
+ type: 'entity-selector',
49
+ name: 'dataset',
50
+ label: 'data-set',
51
+ property: {
52
+ queryName: 'dataSets',
53
+ valueKey: 'id'
54
+ }
55
+ },
56
+ {
57
+ type: 'string',
58
+ name: 'source',
59
+ label: 'source'
60
+ },
61
+ {
62
+ type: 'string',
63
+ name: 'rawData',
64
+ label: 'raw-data'
65
+ },
66
+ {
67
+ type: 'string',
68
+ name: 'data',
69
+ label: 'data'
70
+ },
71
+ {
72
+ type: 'string',
73
+ name: 'timestamp',
74
+ label: 'timestamp'
75
+ }
76
+ ];
77
+ CreateDataSample.connectorFree = true;
78
+ CreateDataSample.help = 'dataset/task/create-data-sample';
79
+ integration_base_1.TaskRegistry.registerTaskHandler('create-data-sample', CreateDataSample);
80
+ //# sourceMappingURL=create-data-sample.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-data-sample.js","sourceRoot":"","sources":["../../../server/engine/task/create-data-sample.ts"],"names":[],"mappings":";;;AAAA,uEAAmF;AACnF,iDAAqD;AACrD,iDAA8C;AAC9C,8DAA6B;AAE7B,8DAAyD;AAEzD,6EAAuE;AAEvE,KAAK,UAAU,gBAAgB,CAAC,IAAe,EAAE,OAAgB;IAC/D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;IACnD,IAAI,EACF,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,EAChH,GAAG,IAAI,CAAA;IAER,IAAI,CAAC,SAAS,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;KACpC;IAED,uBAAuB;IACvB,MAAM,IAAA,qBAAa,GAAE,CAAC,WAAW,CAAC,KAAK,EAAC,EAAE,EAAC,EAAE;QAC3C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,kBAAO,CAAC,CAAC,OAAO,CAAC;YACtD,KAAK,EAAE;gBACL,EAAE,EAAE,SAAS;aACd;SACF,CAAC,CAAA;QAEF,IAAI,MAAM,GAAG,MAAM,IAAA,cAAM,EAAC,cAAc,EAAE,IAAI,CAAC,CAAA;QAC/C,IAAI,aAAa,GAAG,MAAM,IAAA,cAAM,EAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QACpD,IAAI,gBAAgB,GAAG,eAAe,IAAI,CAAC,MAAM,IAAA,cAAM,EAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAA;QAE/E,MAAM,UAAU,GAAG,MAAM,IAAA,qCAAgB,EACvC;YACE,OAAO;YACP,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,gBAAgB;YACzB,MAAM;YACN,WAAW,EAAE,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC;SAC/C,EACD;YACE,CAAC,EAAE,iBAAO,CAAC,CAAC;YACZ,KAAK,EAAE;gBACL,MAAM;gBACN,IAAI;gBACJ,GAAG;gBACH,EAAE;aACH;SACF,CACF,CAAA;QAED,OAAO;YACL,IAAI,EAAE,UAAU;SACjB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,gBAAgB,CAAC,aAAa,GAAG;IAC/B;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE;YACR,SAAS,EAAE,UAAU;YACrB,QAAQ,EAAE,IAAI;SACf;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;KACd;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,WAAW;KACnB;CACF,CAAA;AAED,gBAAgB,CAAC,aAAa,GAAG,IAAI,CAAA;AACrC,gBAAgB,CAAC,IAAI,GAAG,iCAAiC,CAAA;AAEzD,+BAAY,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAAA","sourcesContent":["import { TaskRegistry, InputStep, Context } from '@things-factory/integration-base'\nimport { getDataSource } from '@things-factory/shell'\nimport { access } from '@things-factory/utils'\nimport i18next from 'i18next'\n\nimport { DataSet } from '../../service/data-set/data-set'\n\nimport { createDataSample } from '../../controllers/create-data-sample'\n\nasync function CreateDataSample(step: InputStep, context: Context) {\n const { logger, data, domain, user, lng } = context\n var {\n params: { dataset: dataSetId, source: sourceAccessor, rawData: rawDataAccessor, data: dataAccessor, timestamp }\n } = step\n\n if (!dataSetId) {\n throw new Error(`no dataset found`)\n }\n\n // make new data-sample\n await getDataSource().transaction(async tx => {\n const dataSet = await tx.getRepository(DataSet).findOne({\n where: {\n id: dataSetId\n }\n })\n\n var source = await access(sourceAccessor, data)\n var extractedData = await access(dataAccessor, data)\n var extractedRawData = rawDataAccessor && (await access(rawDataAccessor, data))\n\n const dataSample = await createDataSample(\n {\n dataSet,\n data: extractedData,\n rawData: extractedRawData,\n source,\n collectedAt: new Date(timestamp || new Date())\n },\n {\n t: i18next.t,\n state: {\n domain,\n user,\n lng,\n tx\n }\n }\n )\n\n return {\n data: dataSample\n }\n })\n}\n\nCreateDataSample.parameterSpec = [\n {\n type: 'entity-selector',\n name: 'dataset',\n label: 'data-set',\n property: {\n queryName: 'dataSets',\n valueKey: 'id'\n }\n },\n {\n type: 'string',\n name: 'source',\n label: 'source'\n },\n {\n type: 'string',\n name: 'rawData',\n label: 'raw-data'\n },\n {\n type: 'string',\n name: 'data',\n label: 'data'\n },\n {\n type: 'string',\n name: 'timestamp',\n label: 'timestamp'\n }\n]\n\nCreateDataSample.connectorFree = true\nCreateDataSample.help = 'dataset/task/create-data-sample'\n\nTaskRegistry.registerTaskHandler('create-data-sample', CreateDataSample)\n"]}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("./create-data-sample");
4
+ require("./issue-collect-data");
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/task/index.ts"],"names":[],"mappings":";;AAAA,gCAA6B;AAC7B,gCAA6B","sourcesContent":["import './create-data-sample'\nimport './issue-collect-data'\n"]}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const integration_base_1 = require("@things-factory/integration-base");
5
+ const issue_collect_data_1 = require("../../controllers/issue-collect-data");
6
+ const i18next_1 = tslib_1.__importDefault(require("i18next"));
7
+ async function IssueCollectData(step, context) {
8
+ const { logger, data, domain, user, lng } = context;
9
+ var { params: { dataset: dataSetId } } = step;
10
+ if (!dataSetId) {
11
+ throw new Error(`no dataset found`);
12
+ }
13
+ const activityInstance = await (0, issue_collect_data_1.issueCollectData)(domain.id, dataSetId, {
14
+ t: i18next_1.default.t,
15
+ state: {
16
+ domain,
17
+ user,
18
+ lng,
19
+ tx: undefined
20
+ }
21
+ });
22
+ return {
23
+ data: activityInstance
24
+ };
25
+ }
26
+ IssueCollectData.parameterSpec = [
27
+ {
28
+ type: 'entity-selector',
29
+ name: 'dataset',
30
+ label: 'data-set',
31
+ property: {
32
+ queryName: 'dataSets',
33
+ valueKey: 'id'
34
+ }
35
+ }
36
+ ];
37
+ IssueCollectData.connectorFree = true;
38
+ IssueCollectData.help = 'dataset/task/issue-collect-data';
39
+ integration_base_1.TaskRegistry.registerTaskHandler('issue-collect-data', IssueCollectData);
40
+ //# sourceMappingURL=issue-collect-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-collect-data.js","sourceRoot":"","sources":["../../../server/engine/task/issue-collect-data.ts"],"names":[],"mappings":";;;AAAA,uEAAmF;AACnF,6EAAuE;AACvE,8DAA6B;AAE7B,KAAK,UAAU,gBAAgB,CAAC,IAAe,EAAE,OAAgB;IAC/D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;IACnD,IAAI,EACF,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAC/B,GAAG,IAAI,CAAA;IAER,IAAI,CAAC,SAAS,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;KACpC;IAED,MAAM,gBAAgB,GAAG,MAAM,IAAA,qCAAgB,EAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE;QACpE,CAAC,EAAE,iBAAO,CAAC,CAAC;QACZ,KAAK,EAAE;YACL,MAAM;YACN,IAAI;YACJ,GAAG;YACH,EAAE,EAAE,SAAS;SACd;KACF,CAAC,CAAA;IAEF,OAAO;QACL,IAAI,EAAE,gBAAgB;KACvB,CAAA;AACH,CAAC;AAED,gBAAgB,CAAC,aAAa,GAAG;IAC/B;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE;YACR,SAAS,EAAE,UAAU;YACrB,QAAQ,EAAE,IAAI;SACf;KACF;CACF,CAAA;AAED,gBAAgB,CAAC,aAAa,GAAG,IAAI,CAAA;AACrC,gBAAgB,CAAC,IAAI,GAAG,iCAAiC,CAAA;AAEzD,+BAAY,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAAA","sourcesContent":["import { TaskRegistry, InputStep, Context } from '@things-factory/integration-base'\nimport { issueCollectData } from '../../controllers/issue-collect-data'\nimport i18next from 'i18next'\n\nasync function IssueCollectData(step: InputStep, context: Context) {\n const { logger, data, domain, user, lng } = context\n var {\n params: { dataset: dataSetId }\n } = step\n\n if (!dataSetId) {\n throw new Error(`no dataset found`)\n }\n\n const activityInstance = await issueCollectData(domain.id, dataSetId, {\n t: i18next.t,\n state: {\n domain,\n user,\n lng,\n tx: undefined\n }\n })\n\n return {\n data: activityInstance\n }\n}\n\nIssueCollectData.parameterSpec = [\n {\n type: 'entity-selector',\n name: 'dataset',\n label: 'data-set',\n property: {\n queryName: 'dataSets',\n valueKey: 'id'\n }\n }\n]\n\nIssueCollectData.connectorFree = true\nIssueCollectData.help = 'dataset/task/issue-collect-data'\n\nTaskRegistry.registerTaskHandler('issue-collect-data', IssueCollectData)\n"]}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  require("./routes");
5
5
  require("./activities");
6
+ require("./engine");
6
7
  tslib_1.__exportStar(require("./controllers"), exports);
7
8
  tslib_1.__exportStar(require("./service"), exports);
8
9
  tslib_1.__exportStar(require("./service/data-spec/data-spec-manager"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;AAAA,oBAAiB;AACjB,wBAAqB;AAErB,wDAA6B;AAC7B,oDAAyB;AAEzB,gFAAqD","sourcesContent":["import './routes'\nimport './activities'\n\nexport * from './controllers'\nexport * from './service'\n\nexport * from './service/data-spec/data-spec-manager'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;AAAA,oBAAiB;AACjB,wBAAqB;AACrB,oBAAiB;AAEjB,wDAA6B;AAC7B,oDAAyB;AAEzB,gFAAqD","sourcesContent":["import './routes'\nimport './activities'\nimport './engine'\n\nexport * from './controllers'\nexport * from './service'\n\nexport * from './service/data-spec/data-spec-manager'\n"]}
@@ -2,12 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const typeorm_1 = require("typeorm");
4
4
  const shell_1 = require("@things-factory/shell");
5
- const auth_base_1 = require("@things-factory/auth-base");
6
- const worklist_1 = require("@things-factory/worklist");
7
- const issue_1 = require("@things-factory/worklist/dist-server/controllers/activity-instance/issue");
5
+ const integration_base_1 = require("@things-factory/integration-base");
8
6
  const create_data_sample_1 = require("./controllers/create-data-sample");
9
7
  const jasper_report_1 = require("./controllers/jasper-report");
10
8
  const shiny_report_1 = require("./controllers/shiny-report");
9
+ const issue_collect_data_1 = require("./controllers/issue-collect-data");
11
10
  const data_sensor_1 = require("./service/data-sensor/data-sensor");
12
11
  const data_set_1 = require("./service/data-set/data-set");
13
12
  process.on('bootstrap-module-global-public-route', (app, globalPublicRouter) => {
@@ -20,15 +19,16 @@ process.on('bootstrap-module-global-public-route', (app, globalPublicRouter) =>
20
19
  globalPublicRouter.post('/sensor-data', async (context, next) => {
21
20
  // 데이타 검증
22
21
  const { deviceId, data, rawData, timestamp = Date.now() } = context.request.body;
23
- if (!deviceId || !data) {
24
- throw new Error(`deviceId(${deviceId}) and data(${JSON.stringify(data)}) properties are mandatory`);
22
+ if (!deviceId) {
23
+ throw new Error(`The deviceId(${deviceId}) property are mandatory`);
25
24
  }
26
25
  // make new data-sample
27
26
  await (0, shell_1.getDataSource)().transaction(async (tx) => {
27
+ var _a;
28
28
  // find sensor through deviceId
29
29
  const sensor = await tx.getRepository(data_sensor_1.DataSensor).findOne({
30
30
  where: { deviceId },
31
- relations: ['domain', 'appliance', 'dataSet']
31
+ relations: ['domain', 'appliance', 'dataSet', 'decoder']
32
32
  });
33
33
  if (!sensor) {
34
34
  throw new Error(`Sensor having given deviceId(${deviceId}) not found`);
@@ -39,28 +39,39 @@ process.on('bootstrap-module-global-public-route', (app, globalPublicRouter) =>
39
39
  if (!sensor.appliance) {
40
40
  throw new Error(`Appliance of the sensor given deviceId(${deviceId}) is not set up`);
41
41
  }
42
- if (!sensor.dataSet) {
43
- throw new Error(`DataSet of the sensor given deviceId(${deviceId}) is not set up`);
44
- }
42
+ // if (!sensor.dataSet) {
43
+ // throw new Error(`DataSet of the sensor given deviceId(${deviceId}) is not set up`)
44
+ // }
45
45
  const domain = sensor.domain;
46
46
  const dataSet = sensor.dataSet;
47
- const user = await tx.getRepository(auth_base_1.User).findOne({
48
- where: {
49
- reference: sensor.appliance.id,
50
- userType: 'appliance'
51
- }
52
- });
47
+ // const user: User = await tx.getRepository(User).findOne({
48
+ // where: {
49
+ // reference: sensor.appliance.id,
50
+ // userType: 'appliance'
51
+ // }
52
+ // })
53
53
  context.state = Object.assign(Object.assign({}, context.state), { domain,
54
54
  tx });
55
- return await (0, create_data_sample_1.createDataSample)({
56
- dataSet,
57
- data,
58
- rawData,
59
- source: deviceId,
60
- collectedAt: new Date(timestamp)
61
- }, context);
55
+ var decoded;
56
+ if (sensor.decoder) {
57
+ const { name: scenarioName } = sensor.decoder;
58
+ const variables = {
59
+ dataSensor: sensor,
60
+ source: deviceId,
61
+ data,
62
+ rawData,
63
+ timestamp
64
+ };
65
+ decoded = (_a = (await (0, integration_base_1.runScenario)(null, scenarioName, variables, context))) === null || _a === void 0 ? void 0 : _a.result;
66
+ }
67
+ if (dataSet) {
68
+ await (0, create_data_sample_1.createDataSample)(Object.assign({ dataSet,
69
+ data,
70
+ rawData, source: deviceId, collectedAt: new Date(timestamp) }, decoded), context);
71
+ }
72
+ context.status = 200;
73
+ context.body = Object.assign({ data }, decoded);
62
74
  });
63
- context.status = 200;
64
75
  });
65
76
  /* When a callback occurs from the scheduler when a scheduled dataset is on schedule, data collection task for the dataset should be issued. */
66
77
  globalPublicRouter.post('/callback-schedule-for-dataset', async (context, next) => {
@@ -72,45 +83,7 @@ process.on('bootstrap-module-global-public-route', (app, globalPublicRouter) =>
72
83
  if (!domainId || !dataSetId) {
73
84
  throw new Error(`group(${domainId}) and key(${dataSetId}) properties should not be empty`);
74
85
  }
75
- await (0, shell_1.getDataSource)().transaction(async (tx) => {
76
- const domain = await tx.getRepository(shell_1.Domain).findOneBy({ id: domainId });
77
- if (!domain) {
78
- throw new Error(`domain(${domainId}) not found`);
79
- }
80
- const dataSet = await tx
81
- .getRepository(data_set_1.DataSet)
82
- .findOne({ where: { domain: { id: (0, typeorm_1.In)([domain.id, domain.parentId].filter(Boolean)) }, id: dataSetId } });
83
- const activity = (await tx.getRepository(worklist_1.Activity).findOneBy({
84
- domain: { id: domainId },
85
- name: 'Collect Data'
86
- }));
87
- if (activity) {
88
- const { assignees } = dataSet;
89
- /* 해당 dataset에 대한 데이타 수집 태스크를 dataset assignees에게 할당한다. */
90
- if (assignees && assignees instanceof Array && assignees.length > 0) {
91
- const activityInstance = {
92
- name: `[Data 수집] ${dataSet.name}`,
93
- description: dataSet.description,
94
- activityId: activity.id,
95
- dueAt: new Date(Date.now() + 24 * 60 * 60 * 1000),
96
- input: {
97
- dataSetId: dataSet.id,
98
- dataSetName: dataSet.name
99
- },
100
- assignees
101
- };
102
- context.state = Object.assign(Object.assign({}, context.state), { domain,
103
- tx });
104
- await (0, issue_1.issue)(activityInstance, context);
105
- }
106
- else {
107
- throw new Error(`Assignees not set. So Data Collect Activity for ${dataSet.name}($dataSet.id) could not be issued.`);
108
- }
109
- }
110
- else {
111
- throw new Error(`Data Collect Activity is not installed.`);
112
- }
113
- });
86
+ await (0, issue_collect_data_1.issueCollectData)(domainId, dataSetId, context);
114
87
  context.status = 200;
115
88
  });
116
89
  /* When a callback occurs from the scheduler when a scheduled summary is on schedule, data summary procedure for the dataset should be executed. */
@@ -128,9 +101,7 @@ process.on('bootstrap-module-global-public-route', (app, globalPublicRouter) =>
128
101
  if (!domain) {
129
102
  throw new Error(`domain(${domainId}) not found`);
130
103
  }
131
- const dataSet = await tx
132
- .getRepository(data_set_1.DataSet)
133
- .findOne({ where: { domain: { id: (0, typeorm_1.In)([domain.id, domain.parentId].filter(Boolean)) }, id: dataSetId } });
104
+ const dataSet = await tx.getRepository(data_set_1.DataSet).findOne({ where: { domain: { id: (0, typeorm_1.In)([domain.id, domain.parentId].filter(Boolean)) }, id: dataSetId } });
134
105
  // do what you gotta do
135
106
  });
136
107
  context.status = 200;
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../server/routes.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\n\nimport { Domain, getDataSource } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { Activity } from '@things-factory/worklist'\nimport { issue } from '@things-factory/worklist/dist-server/controllers/activity-instance/issue'\nimport { ScheduleRegisterRequest } from '@things-factory/scheduler-client'\n\nimport { createDataSample } from './controllers/create-data-sample'\nimport { renderJasperReport } from './controllers/jasper-report'\nimport { renderShinyReport } from './controllers/shiny-report'\nimport { DataSensor } from './service/data-sensor/data-sensor'\nimport { DataSet } from './service/data-set/data-set'\n\nprocess.on('bootstrap-module-global-public-route' as any, (app, globalPublicRouter) => {\n /*\n * can add global public routes to application (auth not required, tenancy not required)\n *\n * ex) routes.get('/path', async(context, next) => {})\n * ex) routes.post('/path', async(context, next) => {})\n */\n\n globalPublicRouter.post('/sensor-data', async (context, next) => {\n // 데이타 검증\n const { deviceId, data, rawData, timestamp = Date.now() } = context.request.body\n if (!deviceId || !data) {\n throw new Error(`deviceId(${deviceId}) and data(${JSON.stringify(data)}) properties are mandatory`)\n }\n\n // make new data-sample\n await getDataSource().transaction(async tx => {\n // find sensor through deviceId\n const sensor = await tx.getRepository(DataSensor).findOne({\n where: { deviceId },\n relations: ['domain', 'appliance', 'dataSet']\n })\n\n if (!sensor) {\n throw new Error(`Sensor having given deviceId(${deviceId}) not found`)\n }\n\n if (!sensor.active) {\n throw new Error(`State of the sensor given deviceId(${deviceId}) is not active`)\n }\n\n if (!sensor.appliance) {\n throw new Error(`Appliance of the sensor given deviceId(${deviceId}) is not set up`)\n }\n\n if (!sensor.dataSet) {\n throw new Error(`DataSet of the sensor given deviceId(${deviceId}) is not set up`)\n }\n\n const domain = sensor.domain\n const dataSet = sensor.dataSet\n const user: User = await tx.getRepository(User).findOne({\n where: {\n reference: sensor.appliance.id,\n userType: 'appliance'\n }\n })\n\n context.state = {\n ...context.state,\n domain,\n tx\n }\n\n return await createDataSample(\n {\n dataSet,\n data,\n rawData,\n source: deviceId,\n collectedAt: new Date(timestamp)\n },\n context\n )\n })\n\n context.status = 200\n })\n\n /* When a callback occurs from the scheduler when a scheduled dataset is on schedule, data collection task for the dataset should be issued. */\n globalPublicRouter.post('/callback-schedule-for-dataset', async (context, next) => {\n const { client } = context.request.body as ScheduleRegisterRequest\n\n if (!client || typeof client !== 'object') {\n throw new Error('client property should be a part of callback body.')\n }\n\n const { group: domainId, key: dataSetId } = client\n\n if (!domainId || !dataSetId) {\n throw new Error(`group(${domainId}) and key(${dataSetId}) properties should not be empty`)\n }\n\n await getDataSource().transaction(async tx => {\n const domain = await tx.getRepository(Domain).findOneBy({ id: domainId })\n\n if (!domain) {\n throw new Error(`domain(${domainId}) not found`)\n }\n\n const dataSet = await tx\n .getRepository(DataSet)\n .findOne({ where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id: dataSetId } })\n\n const activity = (await tx.getRepository(Activity).findOneBy({\n domain: { id: domainId },\n name: 'Collect Data'\n })) as Activity\n\n if (activity) {\n const { assignees } = dataSet\n\n /* 해당 dataset에 대한 데이타 수집 태스크를 dataset assignees에게 할당한다. */\n if (assignees && assignees instanceof Array && assignees.length > 0) {\n const activityInstance = {\n name: `[Data 수집] ${dataSet.name}`,\n description: dataSet.description,\n activityId: activity.id,\n dueAt: new Date(Date.now() + 24 * 60 * 60 * 1000),\n input: {\n dataSetId: dataSet.id,\n dataSetName: dataSet.name\n },\n assignees\n }\n\n context.state = {\n ...context.state,\n domain,\n tx\n }\n\n await issue(activityInstance, context)\n } else {\n throw new Error(\n `Assignees not set. So Data Collect Activity for ${dataSet.name}($dataSet.id) could not be issued.`\n )\n }\n } else {\n throw new Error(`Data Collect Activity is not installed.`)\n }\n })\n\n context.status = 200\n })\n\n /* When a callback occurs from the scheduler when a scheduled summary is on schedule, data summary procedure for the dataset should be executed. */\n globalPublicRouter.post('/callback-schedule-for-data-summary', async (context, next) => {\n const { client } = context.request.body as ScheduleRegisterRequest\n\n if (!client || typeof client !== 'object') {\n throw new Error('client property should be a part of callback body.')\n }\n\n const { group: domainId, key: dataSetId } = client\n\n if (!domainId || !dataSetId) {\n throw new Error(`group(${domainId}) and key(${dataSetId}) properties should not be empty`)\n }\n\n await getDataSource().transaction(async tx => {\n const domain = await tx.getRepository(Domain).findOneBy({ id: domainId })\n\n if (!domain) {\n throw new Error(`domain(${domainId}) not found`)\n }\n\n const dataSet = await tx\n .getRepository(DataSet)\n .findOne({ where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id: dataSetId } })\n\n // do what you gotta do\n })\n\n context.status = 200\n })\n})\n\nprocess.on('bootstrap-module-global-private-route' as any, (app, globalPrivateRouter) => {\n /*\n * can add global private routes to application (auth required, tenancy not required)\n */\n})\n\nprocess.on('bootstrap-module-domain-public-route' as any, (app, domainPublicRouter) => {\n /*\n * can add domain public routes to application (auth not required, tenancy required)\n */\n})\n\nprocess.on('bootstrap-module-domain-private-route' as any, (app, domainPrivateRouter) => {\n /*\n * can add domain private routes to application (auth required, tenancy required)\n */\n domainPrivateRouter.get('/data-report/jasper', async (context, next) => {\n context.body = await renderJasperReport(context)\n })\n\n domainPrivateRouter.get('/data-report/shiny', async (context, next) => {\n await renderShinyReport(context)\n })\n\n domainPrivateRouter.get('/data-report/:reportType', async (context, next) => {\n let { reportType } = context.params\n context.body = `${reportType} Not Implemented.`\n })\n})\n"]}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../server/routes.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\n\nimport { Domain, getDataSource } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { runScenario } from '@things-factory/integration-base'\nimport { ScheduleRegisterRequest } from '@things-factory/scheduler-client'\n\nimport { createDataSample } from './controllers/create-data-sample'\nimport { renderJasperReport } from './controllers/jasper-report'\nimport { renderShinyReport } from './controllers/shiny-report'\nimport { issueCollectData } from './controllers/issue-collect-data'\nimport { DataSensor } from './service/data-sensor/data-sensor'\nimport { DataSet } from './service/data-set/data-set'\n\nprocess.on('bootstrap-module-global-public-route' as any, (app, globalPublicRouter) => {\n /*\n * can add global public routes to application (auth not required, tenancy not required)\n *\n * ex) routes.get('/path', async(context, next) => {})\n * ex) routes.post('/path', async(context, next) => {})\n */\n\n globalPublicRouter.post('/sensor-data', async (context, next) => {\n // 데이타 검증\n const { deviceId, data, rawData, timestamp = Date.now() } = context.request.body\n if (!deviceId) {\n throw new Error(`The deviceId(${deviceId}) property are mandatory`)\n }\n\n // make new data-sample\n await getDataSource().transaction(async tx => {\n // find sensor through deviceId\n const sensor = await tx.getRepository(DataSensor).findOne({\n where: { deviceId },\n relations: ['domain', 'appliance', 'dataSet', 'decoder']\n })\n\n if (!sensor) {\n throw new Error(`Sensor having given deviceId(${deviceId}) not found`)\n }\n\n if (!sensor.active) {\n throw new Error(`State of the sensor given deviceId(${deviceId}) is not active`)\n }\n\n if (!sensor.appliance) {\n throw new Error(`Appliance of the sensor given deviceId(${deviceId}) is not set up`)\n }\n\n // if (!sensor.dataSet) {\n // throw new Error(`DataSet of the sensor given deviceId(${deviceId}) is not set up`)\n // }\n\n const domain = sensor.domain\n const dataSet = sensor.dataSet\n // const user: User = await tx.getRepository(User).findOne({\n // where: {\n // reference: sensor.appliance.id,\n // userType: 'appliance'\n // }\n // })\n\n context.state = {\n ...context.state,\n domain,\n tx\n }\n\n var decoded\n if (sensor.decoder) {\n const { name: scenarioName } = sensor.decoder\n const variables = {\n dataSensor: sensor,\n source: deviceId,\n data,\n rawData,\n timestamp\n }\n\n decoded = (await runScenario(null, scenarioName, variables, context))?.result\n }\n\n if (dataSet) {\n await createDataSample(\n {\n dataSet,\n data,\n rawData,\n source: deviceId,\n collectedAt: new Date(timestamp),\n ...decoded\n },\n context\n )\n }\n\n context.status = 200\n context.body = {\n data,\n ...decoded\n }\n })\n })\n\n /* When a callback occurs from the scheduler when a scheduled dataset is on schedule, data collection task for the dataset should be issued. */\n globalPublicRouter.post('/callback-schedule-for-dataset', async (context, next) => {\n const { client } = context.request.body as ScheduleRegisterRequest\n\n if (!client || typeof client !== 'object') {\n throw new Error('client property should be a part of callback body.')\n }\n\n const { group: domainId, key: dataSetId } = client\n\n if (!domainId || !dataSetId) {\n throw new Error(`group(${domainId}) and key(${dataSetId}) properties should not be empty`)\n }\n\n await issueCollectData(domainId, dataSetId, context)\n\n context.status = 200\n })\n\n /* When a callback occurs from the scheduler when a scheduled summary is on schedule, data summary procedure for the dataset should be executed. */\n globalPublicRouter.post('/callback-schedule-for-data-summary', async (context, next) => {\n const { client } = context.request.body as ScheduleRegisterRequest\n\n if (!client || typeof client !== 'object') {\n throw new Error('client property should be a part of callback body.')\n }\n\n const { group: domainId, key: dataSetId } = client\n\n if (!domainId || !dataSetId) {\n throw new Error(`group(${domainId}) and key(${dataSetId}) properties should not be empty`)\n }\n\n await getDataSource().transaction(async tx => {\n const domain = await tx.getRepository(Domain).findOneBy({ id: domainId })\n\n if (!domain) {\n throw new Error(`domain(${domainId}) not found`)\n }\n\n const dataSet = await tx.getRepository(DataSet).findOne({ where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id: dataSetId } })\n\n // do what you gotta do\n })\n\n context.status = 200\n })\n})\n\nprocess.on('bootstrap-module-global-private-route' as any, (app, globalPrivateRouter) => {\n /*\n * can add global private routes to application (auth required, tenancy not required)\n */\n})\n\nprocess.on('bootstrap-module-domain-public-route' as any, (app, domainPublicRouter) => {\n /*\n * can add domain public routes to application (auth not required, tenancy required)\n */\n})\n\nprocess.on('bootstrap-module-domain-private-route' as any, (app, domainPrivateRouter) => {\n /*\n * can add domain private routes to application (auth required, tenancy required)\n */\n domainPrivateRouter.get('/data-report/jasper', async (context, next) => {\n context.body = await renderJasperReport(context)\n })\n\n domainPrivateRouter.get('/data-report/shiny', async (context, next) => {\n await renderShinyReport(context)\n })\n\n domainPrivateRouter.get('/data-report/:reportType', async (context, next) => {\n let { reportType } = context.params\n context.body = `${reportType} Not Implemented.`\n })\n})\n"]}
@@ -5,9 +5,11 @@ const tslib_1 = require("tslib");
5
5
  const type_graphql_1 = require("type-graphql");
6
6
  const auth_base_1 = require("@things-factory/auth-base");
7
7
  const shell_1 = require("@things-factory/shell");
8
+ const worklist_1 = require("@things-factory/worklist");
8
9
  const data_set_history_1 = require("../data-set-history/data-set-history");
9
10
  const data_item_type_1 = require("../data-set/data-item-type");
10
11
  const data_set_1 = require("../data-set/data-set");
12
+ const data_sample_1 = require("../data-sample/data-sample");
11
13
  const data_ooc_1 = require("./data-ooc");
12
14
  const data_ooc_type_1 = require("./data-ooc-type");
13
15
  let DataOocQuery = class DataOocQuery {
@@ -38,9 +40,18 @@ let DataOocQuery = class DataOocQuery {
38
40
  }));
39
41
  return (dataSetHistory === null || dataSetHistory === void 0 ? void 0 : dataSetHistory.dataItems) || [];
40
42
  }
43
+ async dataSample(dataOoc) {
44
+ return dataOoc.dataSampleId && (await (0, shell_1.getRepository)(data_sample_1.DataSample).findOneBy({ id: dataOoc.dataSampleId }));
45
+ }
41
46
  async dataSet(dataOoc) {
42
47
  return dataOoc.dataSetId && (await (0, shell_1.getRepository)(data_set_1.DataSet).findOneBy({ id: dataOoc.dataSetId }));
43
48
  }
49
+ async reviewActivityInstance(dataOoc) {
50
+ return dataOoc.reviewActivityInstanceId && (await (0, shell_1.getRepository)(worklist_1.ActivityInstance).findOneBy({ id: dataOoc.reviewActivityInstanceId }));
51
+ }
52
+ async resolveActivityInstance(dataOoc) {
53
+ return dataOoc.resolveActivityInstanceId && (await (0, shell_1.getRepository)(worklist_1.ActivityInstance).findOneBy({ id: dataOoc.resolveActivityInstanceId }));
54
+ }
44
55
  async corrector(dataOoc) {
45
56
  return dataOoc.correctorId && (await (0, shell_1.getRepository)(auth_base_1.User).findOneBy({ id: dataOoc.correctorId }));
46
57
  }
@@ -82,6 +93,13 @@ tslib_1.__decorate([
82
93
  tslib_1.__metadata("design:paramtypes", [data_ooc_1.DataOoc]),
83
94
  tslib_1.__metadata("design:returntype", Promise)
84
95
  ], DataOocQuery.prototype, "dataItems", null);
96
+ tslib_1.__decorate([
97
+ (0, type_graphql_1.FieldResolver)(type => data_sample_1.DataSample),
98
+ tslib_1.__param(0, (0, type_graphql_1.Root)()),
99
+ tslib_1.__metadata("design:type", Function),
100
+ tslib_1.__metadata("design:paramtypes", [data_ooc_1.DataOoc]),
101
+ tslib_1.__metadata("design:returntype", Promise)
102
+ ], DataOocQuery.prototype, "dataSample", null);
85
103
  tslib_1.__decorate([
86
104
  (0, type_graphql_1.FieldResolver)(type => data_set_1.DataSet),
87
105
  tslib_1.__param(0, (0, type_graphql_1.Root)()),
@@ -89,6 +107,20 @@ tslib_1.__decorate([
89
107
  tslib_1.__metadata("design:paramtypes", [data_ooc_1.DataOoc]),
90
108
  tslib_1.__metadata("design:returntype", Promise)
91
109
  ], DataOocQuery.prototype, "dataSet", null);
110
+ tslib_1.__decorate([
111
+ (0, type_graphql_1.FieldResolver)(type => worklist_1.ActivityInstance),
112
+ tslib_1.__param(0, (0, type_graphql_1.Root)()),
113
+ tslib_1.__metadata("design:type", Function),
114
+ tslib_1.__metadata("design:paramtypes", [data_ooc_1.DataOoc]),
115
+ tslib_1.__metadata("design:returntype", Promise)
116
+ ], DataOocQuery.prototype, "reviewActivityInstance", null);
117
+ tslib_1.__decorate([
118
+ (0, type_graphql_1.FieldResolver)(type => worklist_1.ActivityInstance),
119
+ tslib_1.__param(0, (0, type_graphql_1.Root)()),
120
+ tslib_1.__metadata("design:type", Function),
121
+ tslib_1.__metadata("design:paramtypes", [data_ooc_1.DataOoc]),
122
+ tslib_1.__metadata("design:returntype", Promise)
123
+ ], DataOocQuery.prototype, "resolveActivityInstance", null);
92
124
  tslib_1.__decorate([
93
125
  (0, type_graphql_1.FieldResolver)(type => auth_base_1.User),
94
126
  tslib_1.__param(0, (0, type_graphql_1.Root)()),
@@ -1 +1 @@
1
- {"version":3,"file":"data-ooc-query.js","sourceRoot":"","sources":["../../../server/service/data-ooc/data-ooc-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'\n\nimport { User } from '@things-factory/auth-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\n\nimport { DataSetHistory } from '../data-set-history/data-set-history'\nimport { DataItem } from '../data-set/data-item-type'\nimport { DataSet } from '../data-set/data-set'\nimport { DataOoc } from './data-ooc'\nimport { DataOocList } from './data-ooc-type'\n\n@Resolver(DataOoc)\nexport class DataOocQuery {\n @Directive('@privilege(category: \"data-ooc\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataOoc, { description: 'To fetch a DataOoc' })\n async dataOoc(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataOoc> {\n const { domain } = context.state\n\n return await getRepository(DataOoc).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Directive('@privilege(category: \"data-ooc\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataOocList, { description: 'To fetch multiple DataOoc' })\n async dataOocs(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<DataOocList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataOoc),\n params,\n domain,\n searchables: ['name', 'description']\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => [DataItem])\n async dataItems(@Root() dataOoc: DataOoc): Promise<DataItem[]> {\n const dataSetHistory: DataSetHistory =\n dataOoc.dataSetId &&\n (await getRepository(DataSetHistory).findOne({\n where: {\n originalId: dataOoc.dataSetId,\n version: dataOoc.dataSetVersion\n }\n }))\n return dataSetHistory?.dataItems || []\n }\n\n @FieldResolver(type => DataSet)\n async dataSet(@Root() dataOoc: DataOoc): Promise<DataSet> {\n return dataOoc.dataSetId && (await getRepository(DataSet).findOneBy({ id: dataOoc.dataSetId }))\n }\n\n @FieldResolver(type => User)\n async corrector(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.correctorId && (await getRepository(User).findOneBy({ id: dataOoc.correctorId }))\n }\n\n @FieldResolver(type => User)\n async reviewer(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.reviewerId && (await getRepository(User).findOneBy({ id: dataOoc.reviewerId }))\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() dataOoc: DataOoc): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: dataOoc.domainId })\n }\n\n @FieldResolver(type => User)\n async updater(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.updaterId && (await getRepository(User).findOneBy({ id: dataOoc.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.creatorId && (await getRepository(User).findOneBy({ id: dataOoc.creatorId }))\n }\n}\n"]}
1
+ {"version":3,"file":"data-ooc-query.js","sourceRoot":"","sources":["../../../server/service/data-ooc/data-ooc-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'\n\nimport { User } from '@things-factory/auth-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { ActivityInstance } from '@things-factory/worklist'\n\nimport { DataSetHistory } from '../data-set-history/data-set-history'\nimport { DataItem } from '../data-set/data-item-type'\nimport { DataSet } from '../data-set/data-set'\nimport { DataSample } from '../data-sample/data-sample'\nimport { DataOoc } from './data-ooc'\nimport { DataOocList } from './data-ooc-type'\n\n@Resolver(DataOoc)\nexport class DataOocQuery {\n @Directive('@privilege(category: \"data-ooc\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataOoc, { description: 'To fetch a DataOoc' })\n async dataOoc(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataOoc> {\n const { domain } = context.state\n\n return await getRepository(DataOoc).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Directive('@privilege(category: \"data-ooc\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataOocList, { description: 'To fetch multiple DataOoc' })\n async dataOocs(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<DataOocList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataOoc),\n params,\n domain,\n searchables: ['name', 'description']\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => [DataItem])\n async dataItems(@Root() dataOoc: DataOoc): Promise<DataItem[]> {\n const dataSetHistory: DataSetHistory =\n dataOoc.dataSetId &&\n (await getRepository(DataSetHistory).findOne({\n where: {\n originalId: dataOoc.dataSetId,\n version: dataOoc.dataSetVersion\n }\n }))\n return dataSetHistory?.dataItems || []\n }\n\n @FieldResolver(type => DataSample)\n async dataSample(@Root() dataOoc: DataOoc): Promise<DataSample> {\n return dataOoc.dataSampleId && (await getRepository(DataSample).findOneBy({ id: dataOoc.dataSampleId }))\n }\n\n @FieldResolver(type => DataSet)\n async dataSet(@Root() dataOoc: DataOoc): Promise<DataSet> {\n return dataOoc.dataSetId && (await getRepository(DataSet).findOneBy({ id: dataOoc.dataSetId }))\n }\n\n @FieldResolver(type => ActivityInstance)\n async reviewActivityInstance(@Root() dataOoc: DataOoc): Promise<ActivityInstance> {\n return dataOoc.reviewActivityInstanceId && (await getRepository(ActivityInstance).findOneBy({ id: dataOoc.reviewActivityInstanceId }))\n }\n\n @FieldResolver(type => ActivityInstance)\n async resolveActivityInstance(@Root() dataOoc: DataOoc): Promise<ActivityInstance> {\n return dataOoc.resolveActivityInstanceId && (await getRepository(ActivityInstance).findOneBy({ id: dataOoc.resolveActivityInstanceId }))\n }\n\n @FieldResolver(type => User)\n async corrector(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.correctorId && (await getRepository(User).findOneBy({ id: dataOoc.correctorId }))\n }\n\n @FieldResolver(type => User)\n async reviewer(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.reviewerId && (await getRepository(User).findOneBy({ id: dataOoc.reviewerId }))\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() dataOoc: DataOoc): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: dataOoc.domainId })\n }\n\n @FieldResolver(type => User)\n async updater(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.updaterId && (await getRepository(User).findOneBy({ id: dataOoc.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.creatorId && (await getRepository(User).findOneBy({ id: dataOoc.creatorId }))\n }\n}\n"]}