@things-factory/dataset 4.3.0-alpha.0

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 (114) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE.md +21 -0
  3. package/client/bootstrap.js +3 -0
  4. package/client/index.js +0 -0
  5. package/client/pages/data-item-list.js +280 -0
  6. package/client/pages/data-sample.js +272 -0
  7. package/client/pages/data-set-importer.js +103 -0
  8. package/client/pages/data-set.js +394 -0
  9. package/client/route.js +11 -0
  10. package/dist-server/controllers/create-data-sample.js +133 -0
  11. package/dist-server/controllers/create-data-sample.js.map +1 -0
  12. package/dist-server/controllers/data-use-case.js +57 -0
  13. package/dist-server/controllers/data-use-case.js.map +1 -0
  14. package/dist-server/controllers/index.js +1 -0
  15. package/dist-server/controllers/index.js.map +1 -0
  16. package/dist-server/index.js +21 -0
  17. package/dist-server/index.js.map +1 -0
  18. package/dist-server/middlewares/index.js +8 -0
  19. package/dist-server/middlewares/index.js.map +1 -0
  20. package/dist-server/migrations/index.js +12 -0
  21. package/dist-server/migrations/index.js.map +1 -0
  22. package/dist-server/routes.js +25 -0
  23. package/dist-server/routes.js.map +1 -0
  24. package/dist-server/service/data-item/data-item-mutation.js +69 -0
  25. package/dist-server/service/data-item/data-item-mutation.js.map +1 -0
  26. package/dist-server/service/data-item/data-item-query.js +100 -0
  27. package/dist-server/service/data-item/data-item-query.js.map +1 -0
  28. package/dist-server/service/data-item/data-item-type.js +80 -0
  29. package/dist-server/service/data-item/data-item-type.js.map +1 -0
  30. package/dist-server/service/data-item/data-item.js +136 -0
  31. package/dist-server/service/data-item/data-item.js.map +1 -0
  32. package/dist-server/service/data-item/index.js +9 -0
  33. package/dist-server/service/data-item/index.js.map +1 -0
  34. package/dist-server/service/data-ooc/data-ooc-mutation.js +92 -0
  35. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
  36. package/dist-server/service/data-ooc/data-ooc-query.js +120 -0
  37. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
  38. package/dist-server/service/data-ooc/data-ooc-subscription.js +65 -0
  39. package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -0
  40. package/dist-server/service/data-ooc/data-ooc-type.js +107 -0
  41. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
  42. package/dist-server/service/data-ooc/data-ooc.js +237 -0
  43. package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
  44. package/dist-server/service/data-ooc/index.js +10 -0
  45. package/dist-server/service/data-ooc/index.js.map +1 -0
  46. package/dist-server/service/data-sample/data-sample-mutation.js +142 -0
  47. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -0
  48. package/dist-server/service/data-sample/data-sample-query.js +100 -0
  49. package/dist-server/service/data-sample/data-sample-query.js.map +1 -0
  50. package/dist-server/service/data-sample/data-sample-type.js +82 -0
  51. package/dist-server/service/data-sample/data-sample-type.js.map +1 -0
  52. package/dist-server/service/data-sample/data-sample.js +105 -0
  53. package/dist-server/service/data-sample/data-sample.js.map +1 -0
  54. package/dist-server/service/data-sample/index.js +9 -0
  55. package/dist-server/service/data-sample/index.js.map +1 -0
  56. package/dist-server/service/data-sensor/data-sensor-mutation.js +120 -0
  57. package/dist-server/service/data-sensor/data-sensor-mutation.js.map +1 -0
  58. package/dist-server/service/data-sensor/data-sensor-query.js +113 -0
  59. package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -0
  60. package/dist-server/service/data-sensor/data-sensor-type.js +147 -0
  61. package/dist-server/service/data-sensor/data-sensor-type.js.map +1 -0
  62. package/dist-server/service/data-sensor/data-sensor.js +168 -0
  63. package/dist-server/service/data-sensor/data-sensor.js.map +1 -0
  64. package/dist-server/service/data-sensor/index.js +9 -0
  65. package/dist-server/service/data-sensor/index.js.map +1 -0
  66. package/dist-server/service/data-set/data-set-mutation.js +216 -0
  67. package/dist-server/service/data-set/data-set-mutation.js.map +1 -0
  68. package/dist-server/service/data-set/data-set-query.js +102 -0
  69. package/dist-server/service/data-set/data-set-query.js.map +1 -0
  70. package/dist-server/service/data-set/data-set-type.js +77 -0
  71. package/dist-server/service/data-set/data-set-type.js.map +1 -0
  72. package/dist-server/service/data-set/data-set.js +103 -0
  73. package/dist-server/service/data-set/data-set.js.map +1 -0
  74. package/dist-server/service/data-set/index.js +9 -0
  75. package/dist-server/service/data-set/index.js.map +1 -0
  76. package/dist-server/service/data-spec/data-spec-manager.js +20 -0
  77. package/dist-server/service/data-spec/data-spec-manager.js.map +1 -0
  78. package/dist-server/service/data-spec/data-spec-query.js +48 -0
  79. package/dist-server/service/data-spec/data-spec-query.js.map +1 -0
  80. package/dist-server/service/data-spec/data-spec.js +78 -0
  81. package/dist-server/service/data-spec/data-spec.js.map +1 -0
  82. package/dist-server/service/data-spec/index.js +8 -0
  83. package/dist-server/service/data-spec/index.js.map +1 -0
  84. package/dist-server/service/index.js +40 -0
  85. package/dist-server/service/index.js.map +1 -0
  86. package/package.json +38 -0
  87. package/server/controllers/index.ts +0 -0
  88. package/server/index.ts +5 -0
  89. package/server/middlewares/index.ts +3 -0
  90. package/server/migrations/index.ts +9 -0
  91. package/server/routes.ts +28 -0
  92. package/server/service/data-item/data-item-mutation.ts +56 -0
  93. package/server/service/data-item/data-item-query.ts +53 -0
  94. package/server/service/data-item/data-item-type.ts +50 -0
  95. package/server/service/data-item/data-item.ts +113 -0
  96. package/server/service/data-item/index.ts +6 -0
  97. package/server/service/data-sample/data-sample-mutation.ts +137 -0
  98. package/server/service/data-sample/data-sample-query.ts +53 -0
  99. package/server/service/data-sample/data-sample-type.ts +50 -0
  100. package/server/service/data-sample/data-sample.ts +84 -0
  101. package/server/service/data-sample/index.ts +6 -0
  102. package/server/service/data-set/data-set-mutation.ts +209 -0
  103. package/server/service/data-set/data-set-query.ts +55 -0
  104. package/server/service/data-set/data-set-type.ts +45 -0
  105. package/server/service/data-set/data-set.ts +84 -0
  106. package/server/service/data-set/index.ts +6 -0
  107. package/server/service/index.ts +25 -0
  108. package/things-factory.config.js +17 -0
  109. package/translations/en.json +8 -0
  110. package/translations/ko.json +8 -0
  111. package/translations/ms.json +8 -0
  112. package/translations/zh.json +8 -0
  113. package/tsconfig.json +9 -0
  114. package/yarn-error.log +23244 -0
@@ -0,0 +1,394 @@
1
+ import '@operato/data-grist'
2
+ import './data-item-list'
3
+ import './data-set-importer'
4
+
5
+ import gql from 'graphql-tag'
6
+ import { css, html } from 'lit'
7
+ import { connect } from 'pwa-helpers/connect-mixin'
8
+
9
+ import { client } from '@operato/graphql'
10
+ import { i18next, localize } from '@operato/i18n'
11
+ import { notify, openPopup } from '@operato/layout'
12
+ import { PageView, store } from '@operato/shell'
13
+ import { CommonButtonStyles, ScrollbarStyles } from '@operato/styles'
14
+ import { isMobileDevice } from '@operato/utils'
15
+
16
+ export class DataSet extends connect(store)(localize(i18next)(PageView)) {
17
+ static get properties() {
18
+ return {
19
+ active: String,
20
+ gristConfig: Object
21
+ }
22
+ }
23
+
24
+ static get styles() {
25
+ return [
26
+ ScrollbarStyles,
27
+ css`
28
+ :host {
29
+ display: flex;
30
+ flex-direction: column;
31
+
32
+ overflow: hidden;
33
+ }
34
+
35
+ ox-grist {
36
+ overflow-y: auto;
37
+ flex: 1;
38
+ }
39
+
40
+ #filters {
41
+ display: flex;
42
+ flex-direction: row;
43
+ justify-content: space-between;
44
+
45
+ background-color: white;
46
+ }
47
+
48
+ #filters > * {
49
+ padding: var(--padding-default) var(--padding-wide);
50
+ }
51
+ `
52
+ ]
53
+ }
54
+
55
+ get context() {
56
+ return {
57
+ title: i18next.t('title.data-set list'),
58
+ help: 'integration/ui/data-set',
59
+ actions: [
60
+ {
61
+ title: i18next.t('button.copy'),
62
+ action: this._copyDataSet.bind(this),
63
+ ...CommonButtonStyles.copy
64
+ },
65
+ {
66
+ title: i18next.t('button.save'),
67
+ action: this._updateDataSet.bind(this),
68
+ ...CommonButtonStyles.save
69
+ },
70
+ {
71
+ title: i18next.t('button.delete'),
72
+ action: this._deleteDataSet.bind(this),
73
+ ...CommonButtonStyles.delete
74
+ }
75
+ ],
76
+ exportable: {
77
+ name: i18next.t('title.data-set list'),
78
+ data: this.exportHandler.bind(this)
79
+ },
80
+ importable: {
81
+ handler: this.importHandler.bind(this)
82
+ }
83
+ }
84
+ }
85
+
86
+ render() {
87
+ return html`
88
+ <ox-grist
89
+ .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
90
+ .config=${this.gristConfig}
91
+ .fetchHandler=${this.fetchHandler.bind(this)}
92
+ >
93
+ <div slot="headroom" id="filters">
94
+ <ox-filters-form></ox-filters-form>
95
+ </div>
96
+ </ox-grist>
97
+ `
98
+ }
99
+
100
+ get grist() {
101
+ return this.renderRoot.querySelector('ox-grist')
102
+ }
103
+
104
+ // update with url params value
105
+ _updateSearchConfig(lifecycle) {
106
+ // this.searchConfig = this.searchConfig.map(conf => {
107
+ // if (conf.name in lifecycle.params) {
108
+ // conf.value = lifecycle.params[conf.name]
109
+ // } else {
110
+ // delete conf.value
111
+ // }
112
+ // return conf
113
+ // })
114
+ }
115
+
116
+ // set default field value to record with searchConfig
117
+ _setDefaultFieldsValue(fields) {
118
+ // this.searchConfig.forEach(conf => {
119
+ // if (!fields[conf.name] && conf.value) {
120
+ // fields[conf.name] = conf.value
121
+ // }
122
+ // })
123
+ }
124
+
125
+ async pageInitialized(lifecycle) {
126
+ this._updateSearchConfig(lifecycle)
127
+
128
+ this.gristConfig = {
129
+ list: { fields: ['name', 'description', 'schedule', 'active'] },
130
+ columns: [
131
+ { type: 'gutter', gutterName: 'sequence' },
132
+ { type: 'gutter', gutterName: 'row-selector', multiple: true },
133
+ {
134
+ type: 'gutter',
135
+ gutterName: 'button',
136
+ icon: 'reorder',
137
+ handlers: {
138
+ click: (columns, data, column, record, rowIndex) => {
139
+ if (!record.id) return
140
+ openPopup(html` <data-item-list .dataSet=${record}></data-item-list> `, {
141
+ backdrop: true,
142
+ help: 'data-set/ui/data-item-list',
143
+ size: 'large',
144
+ title: i18next.t('title.data-item list')
145
+ })
146
+ }
147
+ }
148
+ },
149
+ {
150
+ type: 'string',
151
+ name: 'name',
152
+ label: true,
153
+ header: i18next.t('field.name'),
154
+ record: {
155
+ editable: true
156
+ },
157
+ filter: 'search',
158
+ sortable: true,
159
+ width: 150
160
+ },
161
+ {
162
+ type: 'string',
163
+ name: 'description',
164
+ label: true,
165
+ header: i18next.t('field.description'),
166
+ record: {
167
+ editable: true
168
+ },
169
+ filter: 'search',
170
+ width: 200
171
+ },
172
+ {
173
+ type: 'checkbox',
174
+ name: 'active',
175
+ label: true,
176
+ header: i18next.t('field.active'),
177
+ record: {
178
+ editable: true
179
+ },
180
+ sortable: true,
181
+ width: 60
182
+ },
183
+ {
184
+ type: 'object',
185
+ name: 'updater',
186
+ header: i18next.t('field.updater'),
187
+ record: {
188
+ editable: false
189
+ },
190
+ sortable: true,
191
+ width: 120
192
+ },
193
+ {
194
+ type: 'datetime',
195
+ name: 'updatedAt',
196
+ header: i18next.t('field.updated_at'),
197
+ record: {
198
+ editable: false
199
+ },
200
+ sortable: true,
201
+ width: 180
202
+ }
203
+ ],
204
+ rows: {
205
+ selectable: {
206
+ multiple: true
207
+ }
208
+ },
209
+ sorters: [
210
+ {
211
+ name: 'name'
212
+ }
213
+ ]
214
+ }
215
+
216
+ await this.updateComplete
217
+
218
+ this.grist.fetch()
219
+ }
220
+
221
+ async pageUpdated(changes, lifecycle) {
222
+ if (this.active) {
223
+ // update with url params value
224
+ this._updateSearchConfig(lifecycle)
225
+ await this.updateComplete
226
+
227
+ this.grist.fetch()
228
+ }
229
+ }
230
+
231
+ async fetchHandler({ page, limit, sortings = [], filters = [] }) {
232
+ const response = await client.query({
233
+ query: gql`
234
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
235
+ responses: dataSets(filters: $filters, pagination: $pagination, sortings: $sortings) {
236
+ items {
237
+ id
238
+ name
239
+ description
240
+ active
241
+ updater {
242
+ id
243
+ name
244
+ }
245
+ updatedAt
246
+ dataItems {
247
+ name
248
+ description
249
+ sequence
250
+ active
251
+ type
252
+ quota
253
+ spec
254
+ }
255
+ }
256
+ total
257
+ }
258
+ }
259
+ `,
260
+ variables: {
261
+ filters,
262
+ pagination: { page, limit },
263
+ sortings
264
+ }
265
+ })
266
+
267
+ return {
268
+ total: response.data.responses.total || 0,
269
+ records: response.data.responses.items || []
270
+ }
271
+ }
272
+
273
+ async _deleteDataSet() {
274
+ if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
275
+ const ids = this.grist.selected.map(record => record.id)
276
+ if (ids && ids.length > 0) {
277
+ const response = await client.mutate({
278
+ mutation: gql`
279
+ mutation ($ids: [String!]!) {
280
+ deleteDataSets(ids: $ids)
281
+ }
282
+ `,
283
+ variables: {
284
+ ids
285
+ }
286
+ })
287
+
288
+ if (!response.errors) {
289
+ this.grist.fetch()
290
+ notify({
291
+ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })
292
+ })
293
+ }
294
+ }
295
+ }
296
+ }
297
+
298
+ async stateChanged(state) {
299
+ if (this.active && this._currentPopupName && !state.layout.viewparts[this._currentPopupName]) {
300
+ this.grist.fetch()
301
+ this._currentPopupName = null
302
+ }
303
+ }
304
+
305
+ async _copyDataSet() {
306
+ var selected = this.grist.selected
307
+ if (selected.length == 0) return
308
+
309
+ if (!confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.copy') }))) return
310
+ var response = await client.mutate({
311
+ mutation: gql`
312
+ mutation ($ids: [String!]!) {
313
+ copyDataSets(ids: $ids) {
314
+ id
315
+ }
316
+ }
317
+ `,
318
+ variables: {
319
+ ids: selected.map(r => r.id)
320
+ }
321
+ })
322
+
323
+ if (!response.errors) this.grist.fetch()
324
+ }
325
+
326
+ async _updateDataSet() {
327
+ let patches = this.grist.dirtyRecords
328
+ if (patches && patches.length) {
329
+ patches = patches.map(patch => {
330
+ let patchField = patch.id ? { id: patch.id } : {}
331
+ const dirtyFields = patch.__dirtyfields__
332
+ for (let key in dirtyFields) {
333
+ if (['message', 'step', 'steps', 'progress', 'rounds'].indexOf(key) == -1) {
334
+ patchField[key] = dirtyFields[key].after
335
+ }
336
+ }
337
+ this._setDefaultFieldsValue(patchField)
338
+ patchField.cuFlag = patch.__dirty__
339
+
340
+ return patchField
341
+ })
342
+
343
+ const response = await client.mutate({
344
+ mutation: gql`
345
+ mutation ($patches: [DataSetPatch!]!) {
346
+ updateMultipleDataSet(patches: $patches) {
347
+ name
348
+ }
349
+ }
350
+ `,
351
+ variables: {
352
+ patches
353
+ }
354
+ })
355
+
356
+ if (!response.errors) this.grist.fetch()
357
+ }
358
+ }
359
+
360
+ async exportHandler() {
361
+ const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records
362
+ const targetFieldSet = new Set(['id', 'name', 'type', 'description', 'active', 'dataItems'])
363
+
364
+ return exportTargets.map(dataSet => {
365
+ let tempObj = {}
366
+ for (const field of targetFieldSet) {
367
+ tempObj[field] = dataSet[field]
368
+ }
369
+
370
+ return tempObj
371
+ })
372
+ }
373
+
374
+ async importHandler(records) {
375
+ openPopup(
376
+ html`
377
+ <data-set-importer
378
+ .dataSets="${records}"
379
+ @imported="${() => {
380
+ history.back()
381
+ this.grist.fetch()
382
+ }}"
383
+ ></data-set-importer>
384
+ `,
385
+ {
386
+ backdrop: true,
387
+ size: 'large',
388
+ title: i18next.t('title.import data-set')
389
+ }
390
+ )
391
+ }
392
+ }
393
+
394
+ window.customElements.define('data-set-page', DataSet)
@@ -0,0 +1,11 @@
1
+ export default function route(page) {
2
+ switch (page) {
3
+ case 'data-set':
4
+ import('./pages/data-set')
5
+ return page
6
+
7
+ case 'data-sample':
8
+ import('./pages/data-sample')
9
+ return page
10
+ }
11
+ }
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createDataSample = void 0;
7
+ const moment_timezone_1 = __importDefault(require("moment-timezone"));
8
+ const shell_1 = require("@things-factory/shell");
9
+ const data_item_1 = require("../service/data-item/data-item");
10
+ const data_ooc_1 = require("../service/data-ooc/data-ooc");
11
+ const data_sample_1 = require("../service/data-sample/data-sample");
12
+ const data_set_1 = require("../service/data-set/data-set");
13
+ const data_use_case_1 = require("./data-use-case");
14
+ const work_shift_1 = require("@things-factory/work-shift");
15
+ const debug = require('debug')('things-factory:dataset:controller/save-data-sample');
16
+ // parse variable javascript string pattern
17
+ const replaceVariables = (keys, dic) => {
18
+ for (const k in keys) {
19
+ const matches = keys[k].match(/\$\{\w*\}/g);
20
+ matches &&
21
+ matches.forEach(m => {
22
+ keys[k] = keys[k].replace(m, dic[m.slice(2, -1)]);
23
+ });
24
+ }
25
+ return keys;
26
+ };
27
+ // It is required UTC date for Partitioning File System like AWS S3 from Athena.
28
+ // ex) %YYYY, %MM, %DD
29
+ const formatDate = (keys, _moment) => {
30
+ for (const k in keys) {
31
+ const matches = keys[k].match(/%\w*/g);
32
+ matches &&
33
+ matches.forEach(m => {
34
+ keys[k] = keys[k].replace(m, _moment.format(m.substr(1)));
35
+ });
36
+ }
37
+ return keys;
38
+ };
39
+ async function createDataSample(dataSample, context) {
40
+ const { domain, user, tx } = context.state;
41
+ const dataSet = await tx.getRepository(data_set_1.DataSet).findOne({
42
+ where: { id: dataSample.dataSet.id }
43
+ });
44
+ const dataItems = await tx.getRepository(data_item_1.DataItem).find({
45
+ where: {
46
+ domain,
47
+ dataSet
48
+ },
49
+ order: {
50
+ sequence: 'DESC'
51
+ }
52
+ });
53
+ const spec = dataItems.reduce((spec, dataItem) => {
54
+ spec[dataItem.tag] = Object.assign(Object.assign({}, dataItem.spec), { name: dataItem.name, hidden: dataItem.hidden });
55
+ return spec;
56
+ }, {});
57
+ const collectedAt = dataSample.collectedAt || new Date();
58
+ const timezone = dataSet.timezone || domain.timezone || 'UTC';
59
+ const format = 'YYYY-MM-DD';
60
+ // workDate ex) 2022-04-04
61
+ const { workDate, workShift } = await (0, work_shift_1.getWorkDateAndShift)(domain, collectedAt, { timezone, format });
62
+ // local time dataSet timezone or domain timezone or default 'UTC'
63
+ // const collectedAt = dataSample.collectedAt || new Date()
64
+ const localDateTz = (0, moment_timezone_1.default)(collectedAt).tz(timezone);
65
+ const defaultPartitionKeys = {
66
+ domain: domain.subdomain,
67
+ datasetid: dataSample.dataSet.id,
68
+ date: localDateTz.format(format),
69
+ workdate: workDate,
70
+ workshift: workShift
71
+ };
72
+ var partitionKeys = Object.assign(Object.assign({}, defaultPartitionKeys), dataSet.partitionKeys);
73
+ partitionKeys = formatDate(partitionKeys, localDateTz);
74
+ partitionKeys = replaceVariables(partitionKeys, Object.assign({}, dataSample.data));
75
+ const { ooc, oos } = data_use_case_1.DataUseCase.evaluate(dataSet, dataItems, dataSample.data) || {};
76
+ const result = await tx.getRepository(data_sample_1.DataSample).save(Object.assign(Object.assign({ name: dataSet.name, description: dataSet.description, useCase: dataSet.useCase }, dataSample), { domain,
77
+ partitionKeys,
78
+ spec,
79
+ ooc,
80
+ oos,
81
+ collectedAt,
82
+ workDate,
83
+ workShift, creator: user, updater: user }));
84
+ if (ooc || oos) {
85
+ const dataOoc = await tx.getRepository(data_ooc_1.DataOoc).save({
86
+ name: dataSet.name,
87
+ description: dataSet.description,
88
+ useCase: dataSet.useCase,
89
+ dataSet,
90
+ dataSample: result,
91
+ data: dataSample.data,
92
+ rawData: dataSample.rawData,
93
+ domain,
94
+ partitionKeys,
95
+ spec,
96
+ ooc,
97
+ oos,
98
+ history: [
99
+ {
100
+ user: {
101
+ id: user.id,
102
+ name: user.name
103
+ },
104
+ state: data_ooc_1.DataOocStatus.CREATED,
105
+ timestamp: Date.now()
106
+ }
107
+ ],
108
+ state: data_ooc_1.DataOocStatus.CREATED,
109
+ workDate,
110
+ workShift,
111
+ collectedAt,
112
+ creator: user,
113
+ updater: user
114
+ });
115
+ shell_1.pubsub.publish('data-ooc', {
116
+ dataOoc,
117
+ supervisoryRoleId: dataSet.supervisoryRoleId
118
+ });
119
+ shell_1.pubsub.publish('notification', {
120
+ notification: {
121
+ domain,
122
+ type: 'error',
123
+ title: `Data OOC occurred on '${dataSet.name}'`,
124
+ body: `Data OOC occurred on '${dataSet.name}'`,
125
+ url: (0, shell_1.getRedirectSubdomainPath)(context, domain.subdomain, `/data-ooc/${dataOoc.id}`),
126
+ timestamp: collectedAt
127
+ }
128
+ });
129
+ }
130
+ return result;
131
+ }
132
+ exports.createDataSample = createDataSample;
133
+ //# sourceMappingURL=create-data-sample.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-data-sample.js","sourceRoot":"","sources":["../../server/controllers/create-data-sample.ts"],"names":[],"mappings":";;;;;;AAAA,sEAAoC;AAIpC,iDAAgF;AAEhF,8DAAyD;AACzD,2DAAqE;AACrE,oEAA+D;AAE/D,2DAAsD;AACtD,mDAA6C;AAC7C,2DAAgE;AAGhE,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,oDAAoD,CAAC,CAAA;AAEpF,2CAA2C;AAC3C,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACrC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAC3C,OAAO;YACL,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAClB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACnD,CAAC,CAAC,CAAA;KACL;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,gFAAgF;AAChF,sBAAsB;AACtB,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;IACnC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACtC,OAAO;YACL,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAClB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC3D,CAAC,CAAC,CAAA;KACL;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAEM,KAAK,UAAU,gBAAgB,CACpC,UAAyB,EACzB,OAMC;IAED,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAE1C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,kBAAO,CAAC,CAAC,OAAO,CAAC;QACtD,KAAK,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE;KACrC,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,oBAAQ,CAAC,CAAC,IAAI,CAAC;QACtD,KAAK,EAAE;YACL,MAAM;YACN,OAAO;SACR;QACD,KAAK,EAAE;YACL,QAAQ,EAAE,MAAM;SACjB;KACF,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;QAC/C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,mCACb,QAAQ,CAAC,IAAI,KAChB,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,MAAM,EAAE,QAAQ,CAAC,MAAM,GACxB,CAAA;QAED,OAAO,IAAI,CAAA;IACb,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAA;IAExD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAA;IAC7D,MAAM,MAAM,GAAG,YAAY,CAAA;IAE3B,0BAA0B;IAC1B,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,IAAA,gCAAmB,EAAC,MAAM,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;IAEpG,kEAAkE;IAElE,2DAA2D;IAC3D,MAAM,WAAW,GAAG,IAAA,yBAAM,EAAC,WAAW,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAA;IACpD,MAAM,oBAAoB,GAAG;QAC3B,MAAM,EAAE,MAAM,CAAC,SAAS;QACxB,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE;QAChC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;QAChC,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE,SAAS;KACrB,CAAA;IAED,IAAI,aAAa,mCACZ,oBAAoB,GACpB,OAAO,CAAC,aAAa,CACzB,CAAA;IAED,aAAa,GAAG,UAAU,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;IACtD,aAAa,GAAG,gBAAgB,CAAC,aAAa,oBACzC,UAAU,CAAC,IAAI,EAClB,CAAA;IAEF,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,2BAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IACpF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,wBAAU,CAAC,CAAC,IAAI,+BACpD,IAAI,EAAE,OAAO,CAAC,IAAI,EAClB,WAAW,EAAE,OAAO,CAAC,WAAW,EAChC,OAAO,EAAE,OAAO,CAAC,OAAO,IACrB,UAAU,KACb,MAAM;QACN,aAAa;QACb,IAAI;QACJ,GAAG;QACH,GAAG;QACH,WAAW;QACX,QAAQ;QACR,SAAS,EACT,OAAO,EAAE,IAAI,EACb,OAAO,EAAE,IAAI,IACb,CAAA;IAEF,IAAI,GAAG,IAAI,GAAG,EAAE;QACd,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,kBAAO,CAAC,CAAC,IAAI,CAAC;YACnD,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO;YACP,UAAU,EAAE,MAAM;YAClB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,MAAM;YACN,aAAa;YACb,IAAI;YACJ,GAAG;YACH,GAAG;YACH,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE;wBACJ,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,IAAI,EAAE,IAAI,CAAC,IAAI;qBAChB;oBACD,KAAK,EAAE,wBAAa,CAAC,OAAO;oBAC5B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB;aACF;YACD,KAAK,EAAE,wBAAa,CAAC,OAAO;YAC5B,QAAQ;YACR,SAAS;YACT,WAAW;YACX,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;SACd,CAAC,CAAA;QAEF,cAAM,CAAC,OAAO,CAAC,UAAU,EAAE;YACzB,OAAO;YACP,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;SAC7C,CAAC,CAAA;QAEF,cAAM,CAAC,OAAO,CAAC,cAAc,EAAE;YAC7B,YAAY,EAAE;gBACZ,MAAM;gBACN,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,yBAAyB,OAAO,CAAC,IAAI,GAAG;gBAC/C,IAAI,EAAE,yBAAyB,OAAO,CAAC,IAAI,GAAG;gBAC9C,GAAG,EAAE,IAAA,gCAAwB,EAAC,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,aAAa,OAAO,CAAC,EAAE,EAAE,CAAC;gBACnF,SAAS,EAAE,WAAW;aACvB;SACF,CAAC,CAAA;KACH;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAtID,4CAsIC"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataUseCase = void 0;
4
+ class DataUseCase {
5
+ static registerUseCase(name, provider) {
6
+ DataUseCase.registry[name] = provider;
7
+ }
8
+ static getUseCaseNames() {
9
+ return Object.keys(DataUseCase.registry);
10
+ }
11
+ static getUseCase(name) {
12
+ return DataUseCase.registry[name];
13
+ }
14
+ static evaluate(dataSet, dataItems, data) {
15
+ var _a;
16
+ var ooc = false;
17
+ var oos = false;
18
+ if (!dataSet.useCase) {
19
+ return { ooc, oos };
20
+ }
21
+ const useCaseNames = dataSet.useCase.split(',').map(useCaseName => useCaseName.trim());
22
+ const useCases = useCaseNames.map(useCaseName => DataUseCase.getUseCase(useCaseName)).filter(useCase => !!useCase);
23
+ for (let i = 0; i < dataItems.length; i++) {
24
+ const dataItem = dataItems[i];
25
+ const { active, tag } = dataItem;
26
+ if (!active || !tag) {
27
+ continue;
28
+ }
29
+ let values = data[tag];
30
+ if (typeof values === 'undefined') {
31
+ continue; // TODO what if in case no value ?
32
+ }
33
+ if (!(values instanceof Array)) {
34
+ values = [values];
35
+ }
36
+ for (let j = 0; j < useCases.length; j++) {
37
+ const useCase = useCases[j];
38
+ const specs = (_a = dataItem.spec) === null || _a === void 0 ? void 0 : _a[dataSet.useCase];
39
+ if (!specs) {
40
+ continue;
41
+ }
42
+ const result = useCase.evaluate(specs, values);
43
+ if (result) {
44
+ ooc || (ooc = result.ooc);
45
+ oos || (oos = result.oos);
46
+ }
47
+ // if (ooc && oos) {
48
+ // return { ooc, oos }
49
+ // }
50
+ }
51
+ }
52
+ return { ooc, oos };
53
+ }
54
+ }
55
+ exports.DataUseCase = DataUseCase;
56
+ DataUseCase.registry = {};
57
+ //# sourceMappingURL=data-use-case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-use-case.js","sourceRoot":"","sources":["../../server/controllers/data-use-case.ts"],"names":[],"mappings":";;;AAiBA,MAAsB,WAAW;IAGxB,MAAM,CAAC,eAAe,CAAC,IAAY,EAAE,QAAqB;QAC/D,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAA;IACvC,CAAC;IAEM,MAAM,CAAC,eAAe;QAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;IAC1C,CAAC;IAEM,MAAM,CAAC,UAAU,CAAC,IAAY;QACnC,OAAO,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC;IAEM,MAAM,CAAC,QAAQ,CAAC,OAAgB,EAAE,SAAqB,EAAE,IAAS;;QACvE,IAAI,GAAG,GAAG,KAAK,CAAA;QACf,IAAI,GAAG,GAAG,KAAK,CAAA;QAEf,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACpB,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;SACpB;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAA;QACtF,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QAElH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACzC,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;YAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAA;YAChC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE;gBACnB,SAAQ;aACT;YAED,IAAI,MAAM,GAAgB,IAAI,CAAC,GAAG,CAAC,CAAA;YACnC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;gBACjC,SAAQ,CAAC,kCAAkC;aAC5C;YAED,IAAI,CAAC,CAAC,MAAM,YAAY,KAAK,CAAC,EAAE;gBAC9B,MAAM,GAAG,CAAC,MAAM,CAAC,CAAA;aAClB;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;gBAE3B,MAAM,KAAK,GAAG,MAAA,QAAQ,CAAC,IAAI,0CAAG,OAAO,CAAC,OAAO,CAAC,CAAA;gBAC9C,IAAI,CAAC,KAAK,EAAE;oBACV,SAAQ;iBACT;gBAED,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;gBAE9C,IAAI,MAAM,EAAE;oBACV,GAAG,KAAH,GAAG,GAAK,MAAM,CAAC,GAAG,EAAA;oBAClB,GAAG,KAAH,GAAG,GAAK,MAAM,CAAC,GAAG,EAAA;iBACnB;gBAED,oBAAoB;gBACpB,wBAAwB;gBACxB,IAAI;aACL;SACF;QAED,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IACrB,CAAC;;AAhEH,kCAmEC;AAlEQ,oBAAQ,GAAoC,EAAE,CAAA"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/controllers/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ require("./routes");
18
+ __exportStar(require("./migrations"), exports);
19
+ __exportStar(require("./middlewares"), exports);
20
+ __exportStar(require("./service"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oBAAiB;AAEjB,+CAA4B;AAC5B,gDAA6B;AAC7B,4CAAyB"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initMiddlewares = void 0;
4
+ function initMiddlewares(app) {
5
+ /* can add middlewares into app */
6
+ }
7
+ exports.initMiddlewares = initMiddlewares;
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/middlewares/index.ts"],"names":[],"mappings":";;;AAAA,SAAgB,eAAe,CAAC,GAAG;IACjC,kCAAkC;AACpC,CAAC;AAFD,0CAEC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.migrations = void 0;
4
+ const glob = require('glob');
5
+ const path = require('path');
6
+ exports.migrations = [];
7
+ glob.sync(path.resolve(__dirname, '.', '**', '*.js')).forEach(function (file) {
8
+ if (file.indexOf('index.js') !== -1)
9
+ return;
10
+ exports.migrations = exports.migrations.concat(Object.values(require(path.resolve(file))) || []);
11
+ });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/migrations/index.ts"],"names":[],"mappings":";;;AAAA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAEjB,QAAA,UAAU,GAAG,EAAE,CAAA;AAE1B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,UAAS,IAAI;IACzE,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAAE,OAAM;IAC3C,kBAAU,GAAG,kBAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAClF,CAAC,CAAC,CAAA"}