@things-factory/dataset 5.0.0-alpha.2 → 5.0.0-alpha.20

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 (96) hide show
  1. package/README.md +12 -0
  2. package/assets/data-samples.jpg +0 -0
  3. package/client/bootstrap.js +16 -1
  4. package/client/pages/data-entry-form.js +84 -0
  5. package/client/pages/data-item-list.js +58 -16
  6. package/client/pages/data-ooc-view.js +182 -0
  7. package/client/pages/data-ooc.js +469 -0
  8. package/client/pages/data-sample-view.js +97 -0
  9. package/client/pages/data-sample.js +130 -55
  10. package/client/pages/data-sensor.js +8 -18
  11. package/client/pages/data-set.js +126 -25
  12. package/client/route.js +4 -0
  13. package/dist-server/controllers/create-data-sample.js +122 -0
  14. package/dist-server/controllers/create-data-sample.js.map +1 -0
  15. package/dist-server/controllers/data-use-case.js +57 -0
  16. package/dist-server/controllers/data-use-case.js.map +1 -0
  17. package/dist-server/controllers/index.js +17 -0
  18. package/dist-server/controllers/index.js.map +1 -1
  19. package/dist-server/index.js +2 -0
  20. package/dist-server/index.js.map +1 -1
  21. package/dist-server/routes.js +9 -24
  22. package/dist-server/routes.js.map +1 -1
  23. package/dist-server/service/data-item/data-item-mutation.js +5 -1
  24. package/dist-server/service/data-item/data-item-mutation.js.map +1 -1
  25. package/dist-server/service/data-item/data-item-type.js +14 -5
  26. package/dist-server/service/data-item/data-item-type.js.map +1 -1
  27. package/dist-server/service/data-item/data-item.js +20 -7
  28. package/dist-server/service/data-item/data-item.js.map +1 -1
  29. package/dist-server/service/data-ooc/data-ooc-mutation.js +92 -0
  30. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -0
  31. package/dist-server/service/data-ooc/data-ooc-query.js +115 -0
  32. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -0
  33. package/dist-server/service/data-ooc/data-ooc-subscription.js +65 -0
  34. package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -0
  35. package/dist-server/service/data-ooc/data-ooc-type.js +99 -0
  36. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -0
  37. package/dist-server/service/data-ooc/data-ooc.js +227 -0
  38. package/dist-server/service/data-ooc/data-ooc.js.map +1 -0
  39. package/dist-server/service/data-ooc/index.js +10 -0
  40. package/dist-server/service/data-ooc/index.js.map +1 -0
  41. package/dist-server/service/data-sample/data-sample-mutation.js +3 -105
  42. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
  43. package/dist-server/service/data-sample/data-sample-type.js +6 -43
  44. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  45. package/dist-server/service/data-sample/data-sample.js +33 -12
  46. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  47. package/dist-server/service/data-set/data-set-mutation.js +1 -2
  48. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  49. package/dist-server/service/data-set/data-set-query.js +12 -0
  50. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  51. package/dist-server/service/data-set/data-set-type.js +19 -2
  52. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  53. package/dist-server/service/data-set/data-set.js +22 -10
  54. package/dist-server/service/data-set/data-set.js.map +1 -1
  55. package/dist-server/service/data-spec/data-spec-manager.js +20 -0
  56. package/dist-server/service/data-spec/data-spec-manager.js.map +1 -0
  57. package/dist-server/service/data-spec/data-spec-query.js +48 -0
  58. package/dist-server/service/data-spec/data-spec-query.js.map +1 -0
  59. package/dist-server/service/data-spec/data-spec.js +78 -0
  60. package/dist-server/service/data-spec/data-spec.js.map +1 -0
  61. package/dist-server/service/data-spec/index.js +8 -0
  62. package/dist-server/service/data-spec/index.js.map +1 -0
  63. package/dist-server/service/index.js +12 -4
  64. package/dist-server/service/index.js.map +1 -1
  65. package/package.json +15 -12
  66. package/server/controllers/create-data-sample.ts +161 -0
  67. package/server/controllers/data-use-case.ts +85 -0
  68. package/server/controllers/index.ts +1 -0
  69. package/server/index.ts +3 -0
  70. package/server/routes.ts +18 -32
  71. package/server/service/data-item/data-item-mutation.ts +6 -1
  72. package/server/service/data-item/data-item-type.ts +11 -7
  73. package/server/service/data-item/data-item.ts +16 -6
  74. package/server/service/data-ooc/data-ooc-mutation.ts +150 -0
  75. package/server/service/data-ooc/data-ooc-query.ts +63 -0
  76. package/server/service/data-ooc/data-ooc-subscription.ts +51 -0
  77. package/server/service/data-ooc/data-ooc-type.ts +62 -0
  78. package/server/service/data-ooc/data-ooc.ts +195 -0
  79. package/server/service/data-ooc/index.ts +7 -0
  80. package/server/service/data-sample/data-sample-mutation.ts +6 -128
  81. package/server/service/data-sample/data-sample-type.ts +4 -32
  82. package/server/service/data-sample/data-sample.ts +31 -10
  83. package/server/service/data-set/data-set-mutation.ts +1 -4
  84. package/server/service/data-set/data-set-query.ts +8 -1
  85. package/server/service/data-set/data-set-type.ts +17 -6
  86. package/server/service/data-set/data-set.ts +18 -8
  87. package/server/service/data-spec/data-spec-manager.ts +21 -0
  88. package/server/service/data-spec/data-spec-query.ts +21 -0
  89. package/server/service/data-spec/data-spec.ts +44 -0
  90. package/server/service/data-spec/index.ts +5 -0
  91. package/server/service/index.ts +16 -8
  92. package/things-factory.config.js +4 -0
  93. package/translations/en.json +20 -1
  94. package/translations/ko.json +21 -2
  95. package/translations/ms.json +20 -1
  96. package/translations/zh.json +20 -1
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataSpecManager = void 0;
4
+ class DataSpecManager {
5
+ static getDataSpec(type) {
6
+ return DataSpecManager.specRegistry[type];
7
+ }
8
+ static registerDataSpec(type, dataSpec) {
9
+ DataSpecManager.specRegistry[type] = dataSpec;
10
+ }
11
+ static unregisterDataSpec(type) {
12
+ delete DataSpecManager.specRegistry[type];
13
+ }
14
+ static getDataSpecs() {
15
+ return Object.values(DataSpecManager.specRegistry);
16
+ }
17
+ }
18
+ exports.DataSpecManager = DataSpecManager;
19
+ DataSpecManager.specRegistry = {};
20
+ //# sourceMappingURL=data-spec-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-spec-manager.js","sourceRoot":"","sources":["../../../server/service/data-spec/data-spec-manager.ts"],"names":[],"mappings":";;;AAEA,MAAa,eAAe;IAG1B,MAAM,CAAC,WAAW,CAAC,IAAY;QAC7B,OAAO,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;IAC3C,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,IAAY,EAAE,QAAkB;QACtD,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAA;IAC/C,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,IAAY;QACpC,OAAO,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;IAC3C,CAAC;IAED,MAAM,CAAC,YAAY;QACjB,OAAO,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;IACpD,CAAC;;AAjBH,0CAkBC;AAjBQ,4BAAY,GAAiC,EAAE,CAAA"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.DataSpecQuery = void 0;
16
+ const type_graphql_1 = require("type-graphql");
17
+ const data_spec_1 = require("./data-spec");
18
+ const data_spec_manager_1 = require("./data-spec-manager");
19
+ let DataSpecQuery = class DataSpecQuery {
20
+ dataSpec(name) {
21
+ return data_spec_manager_1.DataSpecManager.getDataSpec(name);
22
+ }
23
+ dataSpecs() {
24
+ const items = data_spec_manager_1.DataSpecManager.getDataSpecs();
25
+ return {
26
+ items,
27
+ total: items.length
28
+ };
29
+ }
30
+ };
31
+ __decorate([
32
+ (0, type_graphql_1.Query)(returns => data_spec_1.DataSpec, { description: 'To fetch a data-spec' }),
33
+ __param(0, (0, type_graphql_1.Arg)('name')),
34
+ __metadata("design:type", Function),
35
+ __metadata("design:paramtypes", [String]),
36
+ __metadata("design:returntype", data_spec_1.DataSpec)
37
+ ], DataSpecQuery.prototype, "dataSpec", null);
38
+ __decorate([
39
+ (0, type_graphql_1.Query)(returns => data_spec_1.DataSpecList, { description: 'To fetch all data-specs' }),
40
+ __metadata("design:type", Function),
41
+ __metadata("design:paramtypes", []),
42
+ __metadata("design:returntype", data_spec_1.DataSpecList)
43
+ ], DataSpecQuery.prototype, "dataSpecs", null);
44
+ DataSpecQuery = __decorate([
45
+ (0, type_graphql_1.Resolver)(data_spec_1.DataSpec)
46
+ ], DataSpecQuery);
47
+ exports.DataSpecQuery = DataSpecQuery;
48
+ //# sourceMappingURL=data-spec-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-spec-query.js","sourceRoot":"","sources":["../../../server/service/data-spec/data-spec-query.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,+CAAmD;AACnD,2CAAoD;AACpD,2DAAqD;AAGrD,IAAa,aAAa,GAA1B,MAAa,aAAa;IAExB,QAAQ,CAAc,IAAY;QAChC,OAAO,mCAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IAC1C,CAAC;IAGD,SAAS;QACP,MAAM,KAAK,GAAG,mCAAe,CAAC,YAAY,EAAE,CAAA;QAE5C,OAAO;YACL,KAAK;YACL,KAAK,EAAE,KAAK,CAAC,MAAM;SACpB,CAAA;IACH,CAAC;CACF,CAAA;AAbC;IADC,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,oBAAQ,EAAE,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;IAC1D,WAAA,IAAA,kBAAG,EAAC,MAAM,CAAC,CAAA;;;oCAAgB,oBAAQ;6CAE5C;AAGD;IADC,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,wBAAY,EAAE,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC;;;oCAC9D,wBAAY;8CAOxB;AAdU,aAAa;IADzB,IAAA,uBAAQ,EAAC,oBAAQ,CAAC;GACN,aAAa,CAezB;AAfY,sCAAa"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var _a;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.DataSpecList = exports.DataSpec = exports.DataSpecItem = void 0;
14
+ const type_graphql_1 = require("type-graphql");
15
+ const shell_1 = require("@things-factory/shell");
16
+ let DataSpecItem = class DataSpecItem {
17
+ };
18
+ __decorate([
19
+ (0, type_graphql_1.Field)(),
20
+ __metadata("design:type", String)
21
+ ], DataSpecItem.prototype, "type", void 0);
22
+ __decorate([
23
+ (0, type_graphql_1.Field)(),
24
+ __metadata("design:type", String)
25
+ ], DataSpecItem.prototype, "label", void 0);
26
+ __decorate([
27
+ (0, type_graphql_1.Field)(),
28
+ __metadata("design:type", String)
29
+ ], DataSpecItem.prototype, "name", void 0);
30
+ __decorate([
31
+ (0, type_graphql_1.Field)({ nullable: true }),
32
+ __metadata("design:type", String)
33
+ ], DataSpecItem.prototype, "placeholder", void 0);
34
+ __decorate([
35
+ (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true }),
36
+ __metadata("design:type", typeof (_a = typeof shell_1.ScalarObject !== "undefined" && shell_1.ScalarObject) === "function" ? _a : Object)
37
+ ], DataSpecItem.prototype, "property", void 0);
38
+ DataSpecItem = __decorate([
39
+ (0, type_graphql_1.ObjectType)()
40
+ ], DataSpecItem);
41
+ exports.DataSpecItem = DataSpecItem;
42
+ let DataSpec = class DataSpec {
43
+ };
44
+ __decorate([
45
+ (0, type_graphql_1.Field)(),
46
+ __metadata("design:type", String)
47
+ ], DataSpec.prototype, "name", void 0);
48
+ __decorate([
49
+ (0, type_graphql_1.Field)({ nullable: true }),
50
+ __metadata("design:type", String)
51
+ ], DataSpec.prototype, "description", void 0);
52
+ __decorate([
53
+ (0, type_graphql_1.Field)({ nullable: true }),
54
+ __metadata("design:type", String)
55
+ ], DataSpec.prototype, "help", void 0);
56
+ __decorate([
57
+ (0, type_graphql_1.Field)(type => [DataSpecItem], { nullable: true }),
58
+ __metadata("design:type", Array)
59
+ ], DataSpec.prototype, "specItems", void 0);
60
+ DataSpec = __decorate([
61
+ (0, type_graphql_1.ObjectType)()
62
+ ], DataSpec);
63
+ exports.DataSpec = DataSpec;
64
+ let DataSpecList = class DataSpecList {
65
+ };
66
+ __decorate([
67
+ (0, type_graphql_1.Field)(type => [DataSpec]),
68
+ __metadata("design:type", Array)
69
+ ], DataSpecList.prototype, "items", void 0);
70
+ __decorate([
71
+ (0, type_graphql_1.Field)(type => type_graphql_1.Int),
72
+ __metadata("design:type", Number)
73
+ ], DataSpecList.prototype, "total", void 0);
74
+ DataSpecList = __decorate([
75
+ (0, type_graphql_1.ObjectType)()
76
+ ], DataSpecList);
77
+ exports.DataSpecList = DataSpecList;
78
+ //# sourceMappingURL=data-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-spec.js","sourceRoot":"","sources":["../../../server/service/data-spec/data-spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,+CAAqD;AACrD,iDAAoD;AAGpD,IAAa,YAAY,GAAzB,MAAa,YAAY;CAexB,CAAA;AAbC;IADC,IAAA,oBAAK,GAAE;;0CACI;AAGZ;IADC,IAAA,oBAAK,GAAE;;2CACK;AAGb;IADC,IAAA,oBAAK,GAAE;;0CACI;AAGZ;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDACN;AAGpB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,oBAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACrC,oBAAY,oBAAZ,oBAAY;8CAAA;AAdZ,YAAY;IADxB,IAAA,yBAAU,GAAE;GACA,YAAY,CAexB;AAfY,oCAAY;AAkBzB,IAAa,QAAQ,GAArB,MAAa,QAAQ;CAYpB,CAAA;AAVC;IADC,IAAA,oBAAK,GAAE;;sCACI;AAGZ;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CACP;AAGnB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sCACd;AAGZ;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2CACzB;AAXd,QAAQ;IADpB,IAAA,yBAAU,GAAE;GACA,QAAQ,CAYpB;AAZY,4BAAQ;AAerB,IAAa,YAAY,GAAzB,MAAa,YAAY;CAMxB,CAAA;AAJC;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;;2CACT;AAGjB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC;;2CACN;AALF,YAAY;IADxB,IAAA,yBAAU,GAAE;GACA,YAAY,CAMxB;AANY,oCAAY"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvers = exports.entities = void 0;
4
+ const data_spec_1 = require("./data-spec");
5
+ const data_spec_query_1 = require("./data-spec-query");
6
+ exports.entities = [data_spec_1.DataSpec];
7
+ exports.resolvers = [data_spec_query_1.DataSpecQuery];
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/data-spec/index.ts"],"names":[],"mappings":";;;AAAA,2CAAsC;AACtC,uDAAiD;AAEpC,QAAA,QAAQ,GAAG,CAAC,oBAAQ,CAAC,CAAA;AACrB,QAAA,SAAS,GAAG,CAAC,+BAAa,CAAC,CAAA"}
@@ -15,30 +15,38 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.schema = exports.entities = void 0;
18
+ const data_item_1 = require("./data-item");
18
19
  /* IMPORT ENTITIES AND RESOLVERS */
19
- const data_sensor_1 = require("./data-sensor");
20
+ const data_ooc_1 = require("./data-ooc");
20
21
  const data_sample_1 = require("./data-sample");
21
- const data_item_1 = require("./data-item");
22
+ const data_sensor_1 = require("./data-sensor");
22
23
  const data_set_1 = require("./data-set");
24
+ const data_spec_1 = require("./data-spec");
23
25
  /* EXPORT ENTITY TYPES */
26
+ __exportStar(require("./data-ooc/data-ooc"), exports);
24
27
  __exportStar(require("./data-sensor/data-sensor"), exports);
25
28
  __exportStar(require("./data-sample/data-sample"), exports);
26
29
  __exportStar(require("./data-item/data-item"), exports);
27
30
  __exportStar(require("./data-set/data-set"), exports);
31
+ __exportStar(require("./data-spec/data-spec"), exports);
28
32
  exports.entities = [
29
33
  /* ENTITIES */
34
+ ...data_ooc_1.entities,
30
35
  ...data_sensor_1.entities,
31
36
  ...data_sample_1.entities,
32
37
  ...data_item_1.entities,
33
- ...data_set_1.entities
38
+ ...data_set_1.entities,
39
+ ...data_spec_1.entities
34
40
  ];
35
41
  exports.schema = {
36
42
  resolverClasses: [
37
43
  /* RESOLVER CLASSES */
44
+ ...data_ooc_1.resolvers,
38
45
  ...data_sensor_1.resolvers,
39
46
  ...data_sample_1.resolvers,
40
47
  ...data_item_1.resolvers,
41
- ...data_set_1.resolvers
48
+ ...data_set_1.resolvers,
49
+ ...data_spec_1.resolvers
42
50
  ]
43
51
  };
44
52
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mCAAmC;AACnC,+CAAgG;AAChG,+CAAgG;AAChG,2CAA0F;AAC1F,yCAAuF;AAEvF,yBAAyB;AACzB,4DAAyC;AACzC,4DAAyC;AACzC,wDAAqC;AACrC,sDAAmC;AAEtB,QAAA,QAAQ,GAAG;IACtB,cAAc;IACf,GAAG,sBAAkB;IACrB,GAAG,sBAAkB;IACpB,GAAG,oBAAgB;IACnB,GAAG,mBAAe;CACnB,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACxB,GAAG,uBAAmB;QACtB,GAAG,uBAAmB;QACpB,GAAG,qBAAiB;QACpB,GAAG,oBAAgB;KACpB;CACF,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,2CAA0F;AAC1F,mCAAmC;AACnC,yCAAuF;AACvF,+CAAgG;AAChG,+CAAgG;AAChG,yCAAuF;AACvF,2CAA0F;AAE1F,yBAAyB;AACzB,sDAAmC;AACnC,4DAAyC;AACzC,4DAAyC;AACzC,wDAAqC;AACrC,sDAAmC;AACnC,wDAAqC;AAExB,QAAA,QAAQ,GAAG;IACtB,cAAc;IACd,GAAG,mBAAe;IAClB,GAAG,sBAAkB;IACrB,GAAG,sBAAkB;IACrB,GAAG,oBAAgB;IACnB,GAAG,mBAAe;IAClB,GAAG,oBAAgB;CACpB,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACtB,GAAG,oBAAgB;QACnB,GAAG,uBAAmB;QACtB,GAAG,uBAAmB;QACtB,GAAG,qBAAiB;QACpB,GAAG,oBAAgB;QACnB,GAAG,qBAAiB;KACrB;CACF,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/dataset",
3
- "version": "5.0.0-alpha.2",
3
+ "version": "5.0.0-alpha.20",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -24,16 +24,19 @@
24
24
  "migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
25
25
  },
26
26
  "dependencies": {
27
- "@operato/data-grist": "^0.4.3",
28
- "@operato/graphql": "^0.4.3",
29
- "@operato/i18n": "^0.4.3",
30
- "@operato/layout": "^0.4.3",
31
- "@operato/shell": "^0.4.3",
32
- "@operato/styles": "^0.4.3",
33
- "@operato/utils": "^0.4.3",
34
- "@things-factory/auth-base": "^5.0.0-alpha.2",
35
- "@things-factory/env": "^5.0.0-alpha.2",
36
- "@things-factory/shell": "^5.0.0-alpha.2"
27
+ "@operato/app": "1.0.0-alpha.41",
28
+ "@operato/data-grist": "1.0.0-alpha.41",
29
+ "@operato/dataset": "1.0.0-alpha.41",
30
+ "@operato/graphql": "1.0.0-alpha.41",
31
+ "@operato/i18n": "1.0.0-alpha.41",
32
+ "@operato/layout": "1.0.0-alpha.41",
33
+ "@operato/shell": "1.0.0-alpha.41",
34
+ "@operato/styles": "1.0.0-alpha.41",
35
+ "@operato/utils": "1.0.0-alpha.41",
36
+ "@things-factory/auth-base": "^5.0.0-alpha.20",
37
+ "@things-factory/env": "^5.0.0-alpha.20",
38
+ "@things-factory/shell": "^5.0.0-alpha.20",
39
+ "moment": "^2.29.1"
37
40
  },
38
- "gitHead": "055536f981d229d51ae63f46585036b35fa86602"
41
+ "gitHead": "47487b293458170f7eeb97612dfa8bbb750f092f"
39
42
  }
@@ -0,0 +1,161 @@
1
+ import { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'
2
+ import { Domain, getRedirectSubdomainPath, pubsub } from '@things-factory/shell'
3
+
4
+ import { DataItem } from '../service/data-item/data-item'
5
+ import { DataSample } from '../service/data-sample/data-sample'
6
+ import { DataSet } from '../service/data-set/data-set'
7
+ import { DataUseCase } from './data-use-case'
8
+ import { EntityManager } from 'typeorm'
9
+ import { NewDataSample } from '../service/data-sample/data-sample-type'
10
+ import { User } from '@things-factory/auth-base'
11
+ import moment from 'moment'
12
+
13
+ const debug = require('debug')('things-factory:dataset:controller/save-data-sample')
14
+
15
+ // parse variable javascript string pattern
16
+ const replaceVariables = (keys, dic) => {
17
+ for (const k in keys) {
18
+ const matches = keys[k].match(/\$\{\w*\}/g)
19
+ matches &&
20
+ matches.forEach(m => {
21
+ keys[k] = keys[k].replace(m, dic[m.slice(2, -1)])
22
+ })
23
+ }
24
+ return keys
25
+ }
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
+
40
+ export async function createDataSample(
41
+ dataSample: NewDataSample,
42
+ context: {
43
+ state: {
44
+ domain: Domain
45
+ user: User
46
+ tx: EntityManager
47
+ }
48
+ }
49
+ ): Promise<DataSample> {
50
+ const { domain, user, tx } = context.state
51
+
52
+ const dataSet = await tx.getRepository(DataSet).findOne({
53
+ where: { id: dataSample.dataSet.id }
54
+ })
55
+
56
+ const dataItems = await tx.getRepository(DataItem).find({
57
+ where: {
58
+ domain,
59
+ dataSet
60
+ },
61
+ order: {
62
+ sequence: 'DESC'
63
+ }
64
+ })
65
+
66
+ const spec = dataItems.reduce((spec, dataItem) => {
67
+ spec[dataItem.tag] = {
68
+ ...dataItem.spec,
69
+ name: dataItem.name /* do we need ? */
70
+ }
71
+
72
+ return spec
73
+ }, {})
74
+
75
+ const collectedAt = dataSample.collectedAt || new Date()
76
+ const momentUtc = moment(collectedAt).utc()
77
+ const defaultPartitionKeys = {
78
+ domain: domain.subdomain,
79
+ dataSetId: dataSample.dataSet.id,
80
+ year: momentUtc.format('Y'),
81
+ month: momentUtc.format('M'),
82
+ day: momentUtc.format('D')
83
+ }
84
+
85
+ var partitionKeys = {
86
+ ...defaultPartitionKeys,
87
+ ...dataSet.partitionKeys
88
+ }
89
+
90
+ partitionKeys = formatDate(partitionKeys, momentUtc)
91
+ partitionKeys = replaceVariables(partitionKeys, {
92
+ ...dataSample.data
93
+ })
94
+
95
+ const { ooc, oos } = DataUseCase.evaluate(dataSet, dataItems, dataSample.data) || {}
96
+
97
+ const result = await tx.getRepository(DataSample).save({
98
+ name: dataSet.name,
99
+ description: dataSet.description,
100
+ useCase: dataSet.useCase,
101
+ ...dataSample,
102
+ domain,
103
+ partitionKeys,
104
+ spec,
105
+ ooc,
106
+ oos,
107
+ collectedAt,
108
+ creator: user,
109
+ updater: user
110
+ })
111
+
112
+ if (ooc || oos) {
113
+ const dataOoc = await tx.getRepository(DataOoc).save({
114
+ name: dataSet.name,
115
+ description: dataSet.description,
116
+ useCase: dataSet.useCase,
117
+ dataSet,
118
+ dataSample: result,
119
+ data: dataSample.data,
120
+ domain,
121
+ partitionKeys,
122
+ spec,
123
+ ooc,
124
+ oos,
125
+ history: [
126
+ {
127
+ user: {
128
+ id: user.id,
129
+ name: user.name
130
+ },
131
+ state: DataOocStatus.CREATED,
132
+ timestamp: Date.now()
133
+ }
134
+ ],
135
+ state: DataOocStatus.CREATED,
136
+ collectedAt,
137
+ creator: user,
138
+ updater: user
139
+ })
140
+
141
+ debug('dataOoc is about to publish...', dataOoc)
142
+
143
+ pubsub.publish('data-ooc', {
144
+ dataOoc,
145
+ supervisoryRoleId: dataSet.supervisoryRoleId
146
+ })
147
+
148
+ pubsub.publish('notification', {
149
+ notification: {
150
+ domain,
151
+ type: 'error',
152
+ title: `Data OOC occurred on '${dataSet.name}'`,
153
+ body: `Data OOC occurred on '${dataSet.name}'`,
154
+ url: getRedirectSubdomainPath(context, domain.subdomain, `/data-ooc/${dataOoc.id}`),
155
+ timestamp: collectedAt
156
+ }
157
+ })
158
+ }
159
+
160
+ return result
161
+ }
@@ -0,0 +1,85 @@
1
+ import { DataItem, DataSet } from 'server/service'
2
+
3
+ export type DataItemSpec = {
4
+ type: string
5
+ label: string
6
+ name: string
7
+ property: { [option: string]: any }
8
+ }
9
+
10
+ export type DataItemSpecSet = {
11
+ name: string
12
+ description: string
13
+ specs: DataItemSpec[]
14
+ }
15
+
16
+ export type EvaluationResult = { oos: boolean; ooc: boolean }
17
+
18
+ export abstract class DataUseCase {
19
+ static registry: { [name: string]: DataUseCase } = {}
20
+
21
+ public static registerUseCase(name: string, provider: DataUseCase) {
22
+ DataUseCase.registry[name] = provider
23
+ }
24
+
25
+ public static getUseCaseNames() {
26
+ return Object.keys(DataUseCase.registry)
27
+ }
28
+
29
+ public static getUseCase(name: string): DataUseCase | undefined {
30
+ return DataUseCase.registry[name]
31
+ }
32
+
33
+ public static evaluate(dataSet: DataSet, dataItems: DataItem[], data: any): EvaluationResult {
34
+ var ooc = false
35
+ var oos = false
36
+
37
+ if (!dataSet.useCase) {
38
+ return { ooc, oos }
39
+ }
40
+
41
+ const useCaseNames = dataSet.useCase.split(',').map(useCaseName => useCaseName.trim())
42
+ const useCases = useCaseNames.map(useCaseName => DataUseCase.getUseCase(useCaseName)).filter(useCase => !!useCase)
43
+
44
+ for (let i = 0; i < dataItems.length; i++) {
45
+ const dataItem = dataItems[i]
46
+ const { active, tag } = dataItem
47
+ if (!active || !tag) {
48
+ continue
49
+ }
50
+
51
+ let values: any | any[] = data[tag]
52
+ if (typeof values === 'undefined') {
53
+ continue // TODO what if in case no value ?
54
+ }
55
+
56
+ if (!(values instanceof Array)) {
57
+ values = [values]
58
+ }
59
+
60
+ for (let j = 0; j < useCases.length; j++) {
61
+ const useCase = useCases[j]
62
+
63
+ const specs = dataItem.spec?.[dataSet.useCase]
64
+ if (!specs) {
65
+ continue
66
+ }
67
+
68
+ const result = useCase.evaluate(specs, values)
69
+
70
+ if (result) {
71
+ ooc ||= result.ooc
72
+ oos ||= result.oos
73
+ }
74
+
75
+ // if (ooc && oos) {
76
+ // return { ooc, oos }
77
+ // }
78
+ }
79
+ }
80
+
81
+ return { ooc, oos }
82
+ }
83
+
84
+ public abstract evaluate(specs: any, values: any[]): EvaluationResult
85
+ }
@@ -0,0 +1 @@
1
+ export * from './data-use-case'
package/server/index.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  import './routes'
2
2
 
3
+ export * from './controllers'
3
4
  export * from './migrations'
4
5
  export * from './middlewares'
5
6
  export * from './service'
7
+
8
+ export * from './service/data-spec/data-spec-manager'
package/server/routes.ts CHANGED
@@ -1,7 +1,8 @@
1
- import { getConnection } from 'typeorm'
1
+ import { getConnection, getRepository } from 'typeorm'
2
2
 
3
- import { DataSample } from './service'
4
- import { DataItem } from './service/data-item/data-item'
3
+ import { User } from '@things-factory/auth-base'
4
+
5
+ import { createDataSample } from './controllers/create-data-sample'
5
6
  import { DataSensor } from './service/data-sensor/data-sensor'
6
7
 
7
8
  const debug = require('debug')('things-factory:dataset:routes')
@@ -47,41 +48,26 @@ process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRout
47
48
 
48
49
  const domain = sensor.domain
49
50
  const dataSet = sensor.dataSet
50
- const user = sensor.appliance
51
-
52
- const dataItems = await tx.getRepository(DataItem).find({
51
+ const user: User = await tx.getRepository(User).findOne({
53
52
  where: {
54
- domain,
55
- dataSet
56
- },
57
- order: {
58
- sequence: 'DESC'
53
+ reference: sensor.appliance.id,
54
+ userType: 'appliance'
59
55
  }
60
56
  })
61
57
 
62
- var spec = {} as any
63
-
64
- dataItems.forEach(dataItem => {
65
- spec[dataItem.name] = dataItem.spec
66
- })
67
-
68
- await tx.getRepository(DataSample).save({
69
- domain,
70
- name: dataSet.name,
71
- description: dataSet.description,
72
- partitionKeys: dataSet.partitionKeys,
73
- dataSet,
74
- data,
75
- rawData,
76
- spec,
77
- source: deviceId,
78
- collectedAt: new Date(timestamp),
79
- creator: user,
80
- updater: user
81
- })
58
+ return await createDataSample(
59
+ {
60
+ dataSet,
61
+ data,
62
+ rawData,
63
+ source: deviceId,
64
+ collectedAt: new Date(timestamp)
65
+ },
66
+ { state: { domain, user, tx } }
67
+ )
82
68
  })
83
69
 
84
- return 'OK'
70
+ context.status = 200
85
71
  })
86
72
  })
87
73
 
@@ -24,9 +24,14 @@ export class DataItemMutation {
24
24
  await dataItemRepo.delete({ domain, dataSet: dataSetId })
25
25
 
26
26
  for (let i = 0; i < patches.length; i++) {
27
+ const patch = patches[i]
28
+ if (!patch.options) {
29
+ patch.options = {}
30
+ }
31
+
27
32
  const result = await dataItemRepo.save({
28
33
  quota: 1,
29
- ...patches[i],
34
+ ...patch,
30
35
  sequence: i,
31
36
  dataSet,
32
37
  domain,
@@ -1,16 +1,14 @@
1
- import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
-
3
- import { ScalarObject } from '@things-factory/shell'
4
-
5
1
  import { DataItem, DataItemType } from './data-item'
2
+ import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
3
+ import { ObjectRef, ScalarObject } from '@things-factory/shell'
6
4
 
7
5
  @InputType()
8
6
  export class DataItemPatch {
9
7
  @Field(type => ID, { nullable: true })
10
8
  id?: string
11
9
 
12
- @Field({ nullable: true })
13
- dataSetId?: string
10
+ @Field(type => ObjectRef, { nullable: true })
11
+ dataSet?: ObjectRef
14
12
 
15
13
  @Field({ nullable: true })
16
14
  name?: string
@@ -27,6 +25,12 @@ export class DataItemPatch {
27
25
  @Field(type => DataItemType, { nullable: true })
28
26
  type?: DataItemType
29
27
 
28
+ @Field(type => ScalarObject, { nullable: true })
29
+ options?: ScalarObject
30
+
31
+ @Field({ nullable: true })
32
+ unit?: string
33
+
30
34
  @Field(type => Int, { nullable: true })
31
35
  quota?: number
32
36
 
@@ -34,7 +38,7 @@ export class DataItemPatch {
34
38
  active?: boolean
35
39
 
36
40
  @Field(type => ScalarObject, { nullable: true })
37
- spec?: object
41
+ spec?: ScalarObject
38
42
 
39
43
  @Field({ nullable: true })
40
44
  cuFlag?: string