@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,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"}
@@ -0,0 +1,40 @@
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
+ exports.schema = exports.entities = void 0;
18
+ /* IMPORT ENTITIES AND RESOLVERS */
19
+ const data_sample_1 = require("./data-sample");
20
+ const data_item_1 = require("./data-item");
21
+ const data_set_1 = require("./data-set");
22
+ /* EXPORT ENTITY TYPES */
23
+ __exportStar(require("./data-sample/data-sample"), exports);
24
+ __exportStar(require("./data-item/data-item"), exports);
25
+ __exportStar(require("./data-set/data-set"), exports);
26
+ exports.entities = [
27
+ /* ENTITIES */
28
+ ...data_sample_1.entities,
29
+ ...data_item_1.entities,
30
+ ...data_set_1.entities
31
+ ];
32
+ exports.schema = {
33
+ resolverClasses: [
34
+ /* RESOLVER CLASSES */
35
+ ...data_sample_1.resolvers,
36
+ ...data_item_1.resolvers,
37
+ ...data_set_1.resolvers
38
+ ]
39
+ };
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mCAAmC;AACnC,+CAAgG;AAChG,2CAA0F;AAC1F,yCAAuF;AAEvF,yBAAyB;AACzB,4DAAyC;AACzC,wDAAqC;AACrC,sDAAmC;AAEtB,QAAA,QAAQ,GAAG;IACtB,cAAc;IACf,GAAG,sBAAkB;IACpB,GAAG,oBAAgB;IACnB,GAAG,mBAAe;CACnB,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACxB,GAAG,uBAAmB;QACpB,GAAG,qBAAiB;QACpB,GAAG,oBAAgB;KACpB;CACF,CAAA"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@things-factory/dataset",
3
+ "version": "4.3.0-alpha.0",
4
+ "main": "dist-server/index.js",
5
+ "browser": "client/index.js",
6
+ "things-factory": true,
7
+ "license": "MIT",
8
+ "author": "heartyoh",
9
+ "description": "module for handling data collection",
10
+ "publishConfig": {
11
+ "access": "public",
12
+ "@things-factory:registry": "https://registry.npmjs.org"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/hatiolab/things-factory.git",
17
+ "directory": "packages/dataset"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc --p tsconfig.json",
21
+ "build:server": "npm run clean:server && tsc",
22
+ "clean:server": "rm -rf dist-server",
23
+ "clean": "npm run clean:server",
24
+ "migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
25
+ },
26
+ "dependencies": {
27
+ "@operato/data-grist": "^0.4.5",
28
+ "@operato/graphql": "^0.4.5",
29
+ "@operato/i18n": "^0.4.5",
30
+ "@operato/layout": "^0.4.5",
31
+ "@operato/shell": "^0.4.5",
32
+ "@operato/styles": "^0.4.5",
33
+ "@operato/utils": "^0.4.5",
34
+ "@things-factory/auth-base": "^4.3.0-alpha.0",
35
+ "@things-factory/shell": "^4.3.0-alpha.0"
36
+ },
37
+ "gitHead": "6467d1b2a5b2f8abb1bc3982e4651a5742ad4043"
38
+ }
File without changes
@@ -0,0 +1,5 @@
1
+ import './routes'
2
+
3
+ export * from './migrations'
4
+ export * from './middlewares'
5
+ export * from './service'
@@ -0,0 +1,3 @@
1
+ export function initMiddlewares(app) {
2
+ /* can add middlewares into app */
3
+ }
@@ -0,0 +1,9 @@
1
+ const glob = require('glob')
2
+ const path = require('path')
3
+
4
+ export var migrations = []
5
+
6
+ glob.sync(path.resolve(__dirname, '.', '**', '*.js')).forEach(function(file) {
7
+ if (file.indexOf('index.js') !== -1) return
8
+ migrations = migrations.concat(Object.values(require(path.resolve(file))) || [])
9
+ })
@@ -0,0 +1,28 @@
1
+ const debug = require('debug')('things-factory:dataset:routes')
2
+
3
+ process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRouter) => {
4
+ /*
5
+ * can add global public routes to application (auth not required, tenancy not required)
6
+ *
7
+ * ex) routes.get('/path', async(context, next) => {})
8
+ * ex) routes.post('/path', async(context, next) => {})
9
+ */
10
+ })
11
+
12
+ process.on('bootstrap-module-global-private-route' as any, (app, globalPrivateRouter) => {
13
+ /*
14
+ * can add global private routes to application (auth required, tenancy not required)
15
+ */
16
+ })
17
+
18
+ process.on('bootstrap-module-domain-public-route' as any, (app, domainPublicRouter) => {
19
+ /*
20
+ * can add domain public routes to application (auth not required, tenancy required)
21
+ */
22
+ })
23
+
24
+ process.on('bootstrap-module-domain-private-route' as any, (app, domainPrivateRouter) => {
25
+ /*
26
+ * can add domain private routes to application (auth required, tenancy required)
27
+ */
28
+ })
@@ -0,0 +1,56 @@
1
+ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
+ import { In } from 'typeorm'
3
+
4
+ import { DataSet } from '../data-set/data-set'
5
+ import { DataItem } from './data-item'
6
+ import { DataItemPatch } from './data-item-type'
7
+
8
+ @Resolver(DataItem)
9
+ export class DataItemMutation {
10
+ @Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
11
+ @Directive('@transaction')
12
+ @Mutation(returns => [DataItem], { description: "To modify multiple DataItems' information" })
13
+ async updateMultipleDataItem(
14
+ @Arg('dataSetId') dataSetId: string,
15
+ @Arg('patches', type => [DataItemPatch]) patches: DataItemPatch[],
16
+ @Ctx() context: any
17
+ ): Promise<DataItem[]> {
18
+ const { domain, user, tx } = context.state
19
+
20
+ let results = []
21
+ const dataItemRepo = tx.getRepository(DataItem)
22
+ const dataSet = await tx.getRepository(DataSet).findOne(dataSetId)
23
+
24
+ await dataItemRepo.delete({ domain, dataSet: dataSetId })
25
+
26
+ for (let i = 0; i < patches.length; i++) {
27
+ const result = await dataItemRepo.save({
28
+ quota: 1,
29
+ ...patches[i],
30
+ sequence: i,
31
+ dataSet,
32
+ domain,
33
+ creator: user,
34
+ updater: user
35
+ })
36
+
37
+ results.push({ ...result, cuFlag: '+' })
38
+ }
39
+
40
+ return results
41
+ }
42
+
43
+ @Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
44
+ @Directive('@transaction')
45
+ @Mutation(returns => Boolean, { description: 'To delete multiple dataItems' })
46
+ async deleteDataItems(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<boolean> {
47
+ const { domain, tx } = context.state
48
+
49
+ await tx.getRepository(DataItem).delete({
50
+ domain,
51
+ id: In(ids)
52
+ })
53
+
54
+ return true
55
+ }
56
+ }
@@ -0,0 +1,53 @@
1
+ import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
+ import { getRepository } from 'typeorm'
3
+
4
+ import { User } from '@things-factory/auth-base'
5
+ import { convertListParams, Domain, ListParam } from '@things-factory/shell'
6
+
7
+ import { DataSet } from '../data-set/data-set'
8
+ import { DataItem } from './data-item'
9
+ import { DataItemList } from './data-item-type'
10
+
11
+ @Resolver(DataItem)
12
+ export class DataItemQuery {
13
+ @Directive('@privilege(category: "data-set", privilege: "query", domainOwnerGranted: true)')
14
+ @Query(returns => DataItem, { description: 'To fetch a DataItem' })
15
+ async dataItem(@Arg('id') id: string, @Ctx() context: any): Promise<DataItem> {
16
+ const { domain } = context.state
17
+
18
+ return await getRepository(DataItem).findOne({
19
+ where: { domain, id }
20
+ })
21
+ }
22
+
23
+ @Directive('@privilege(category: "data-set", privilege: "query", domainOwnerGranted: true)')
24
+ @Query(returns => DataItemList, { description: 'To fetch multiple DataItems' })
25
+ async dataItems(@Args() params: ListParam, @Ctx() context: any): Promise<DataItemList> {
26
+ const { domain } = context.state
27
+
28
+ const convertedParams = convertListParams(params, domain.id)
29
+ const [items, total] = await getRepository(DataItem).findAndCount(convertedParams)
30
+
31
+ return { items, total }
32
+ }
33
+
34
+ @FieldResolver(type => DataSet)
35
+ async dataSet(@Root() dataItem: DataItem): Promise<DataSet> {
36
+ return await getRepository(DataSet).findOne(dataItem.dataSetId)
37
+ }
38
+
39
+ @FieldResolver(type => Domain)
40
+ async domain(@Root() dataItem: DataItem): Promise<Domain> {
41
+ return await getRepository(Domain).findOne(dataItem.domainId)
42
+ }
43
+
44
+ @FieldResolver(type => User)
45
+ async updater(@Root() dataItem: DataItem): Promise<User> {
46
+ return await getRepository(User).findOne(dataItem.updaterId)
47
+ }
48
+
49
+ @FieldResolver(type => User)
50
+ async creator(@Root() dataItem: DataItem): Promise<User> {
51
+ return await getRepository(User).findOne(dataItem.creatorId)
52
+ }
53
+ }
@@ -0,0 +1,50 @@
1
+ import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
+
3
+ import { ScalarObject } from '@things-factory/shell'
4
+
5
+ import { DataItem, DataItemType } from './data-item'
6
+
7
+ @InputType()
8
+ export class DataItemPatch {
9
+ @Field(type => ID, { nullable: true })
10
+ id?: string
11
+
12
+ @Field({ nullable: true })
13
+ dataSetId?: string
14
+
15
+ @Field({ nullable: true })
16
+ name?: string
17
+
18
+ @Field({ nullable: true })
19
+ description?: string
20
+
21
+ @Field(type => Int, { nullable: true })
22
+ sequence?: number
23
+
24
+ @Field(type => DataItemType, { nullable: true })
25
+ type?: DataItemType
26
+
27
+ @Field(type => Int, { nullable: true })
28
+ quota?: number
29
+
30
+ @Field({ nullable: true })
31
+ options?: string
32
+
33
+ @Field({ nullable: true })
34
+ active?: boolean
35
+
36
+ @Field(type => ScalarObject, { nullable: true })
37
+ spec?: object
38
+
39
+ @Field({ nullable: true })
40
+ cuFlag?: string
41
+ }
42
+
43
+ @ObjectType()
44
+ export class DataItemList {
45
+ @Field(type => [DataItem])
46
+ items: DataItem[]
47
+
48
+ @Field(type => Int)
49
+ total: number
50
+ }
@@ -0,0 +1,113 @@
1
+ import { Field, ID, Int, ObjectType, registerEnumType } from 'type-graphql'
2
+ import {
3
+ Column,
4
+ CreateDateColumn,
5
+ Entity,
6
+ Index,
7
+ ManyToOne,
8
+ PrimaryGeneratedColumn,
9
+ RelationId,
10
+ UpdateDateColumn
11
+ } from 'typeorm'
12
+
13
+ import { User } from '@things-factory/auth-base'
14
+ import { Domain, ScalarObject } from '@things-factory/shell'
15
+
16
+ import { DataSet } from '../data-set/data-set'
17
+
18
+ export enum DataItemType {
19
+ number = 'number',
20
+ text = 'text',
21
+ boolean = 'boolean',
22
+ select = 'select'
23
+ }
24
+
25
+ registerEnumType(DataItemType, {
26
+ name: 'DataItemType',
27
+ description: 'state enumeration of a data-item'
28
+ })
29
+
30
+ @Entity()
31
+ @Index('ix_data_item_0', (dataItem: DataItem) => [dataItem.domain, dataItem.dataSet, dataItem.name], { unique: true })
32
+ @ObjectType({ description: 'Entity for DataItem' })
33
+ export class DataItem {
34
+ @PrimaryGeneratedColumn('uuid')
35
+ @Field(type => ID)
36
+ readonly id: string
37
+
38
+ @ManyToOne(type => Domain)
39
+ @Field({ nullable: true })
40
+ domain?: Domain
41
+
42
+ @RelationId((dataItem: DataItem) => dataItem.domain)
43
+ domainId?: string
44
+
45
+ @Column()
46
+ @Field()
47
+ name: string
48
+
49
+ @Column({
50
+ nullable: true
51
+ })
52
+ @Field({ nullable: true })
53
+ description?: string
54
+
55
+ @ManyToOne(type => DataSet, dataSet => dataSet.dataItems, { onDelete: 'CASCADE' })
56
+ @Field(type => DataSet, { nullable: true })
57
+ dataSet?: DataSet
58
+
59
+ @RelationId((dataItem: DataItem) => dataItem.dataSet)
60
+ dataSetId?: string
61
+
62
+ @Column()
63
+ @Field(type => Int, { nullable: true })
64
+ sequence: number
65
+
66
+ @Column({
67
+ nullable: true
68
+ })
69
+ @Field({ nullable: true })
70
+ active?: boolean
71
+
72
+ @Column({
73
+ nullable: true
74
+ })
75
+ @Field({ nullable: true })
76
+ type?: DataItemType
77
+
78
+ @Column({
79
+ nullable: true
80
+ })
81
+ @Field(type => Int, { nullable: true })
82
+ quota: number
83
+
84
+ @Column('simple-json', { nullable: true })
85
+ @Field(type => ScalarObject, { nullable: true })
86
+ spec?: object
87
+
88
+ @CreateDateColumn()
89
+ @Field({ nullable: true })
90
+ createdAt?: Date
91
+
92
+ @UpdateDateColumn()
93
+ @Field({ nullable: true })
94
+ updatedAt?: Date
95
+
96
+ @ManyToOne(type => User, {
97
+ nullable: true
98
+ })
99
+ @Field({ nullable: true })
100
+ creator?: User
101
+
102
+ @RelationId((dataItem: DataItem) => dataItem.creator)
103
+ creatorId?: string
104
+
105
+ @ManyToOne(type => User, {
106
+ nullable: true
107
+ })
108
+ @Field({ nullable: true })
109
+ updater?: User
110
+
111
+ @RelationId((dataItem: DataItem) => dataItem.creator)
112
+ updaterId?: string
113
+ }
@@ -0,0 +1,6 @@
1
+ import { DataItem } from './data-item'
2
+ import { DataItemQuery } from './data-item-query'
3
+ import { DataItemMutation } from './data-item-mutation'
4
+
5
+ export const entities = [DataItem]
6
+ export const resolvers = [DataItemQuery, DataItemMutation]
@@ -0,0 +1,137 @@
1
+ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
+ import { In } from 'typeorm'
3
+
4
+ import { DataItem } from '../data-item/data-item'
5
+ import { DataSet } from '../data-set/data-set'
6
+ import { DataSample } from './data-sample'
7
+ import { DataSamplePatch, NewDataSample } from './data-sample-type'
8
+
9
+ @Resolver(DataSample)
10
+ export class DataSampleMutation {
11
+ @Directive('@privilege(category: "data-sample", privilege: "mutation", domainOwnerGranted: true)')
12
+ @Directive('@transaction')
13
+ @Mutation(returns => DataSample, { description: 'To create new data sample' })
14
+ async createDataSample(@Arg('dataSample') dataSample: NewDataSample, @Ctx() context: any): Promise<DataSample> {
15
+ const { domain, user, tx } = context.state
16
+
17
+ const dataSet = await tx.getRepository(DataSet).findOne({ id: dataSample.dataSetId })
18
+ const dataItems = await tx.getRepository(DataItem).find({
19
+ select: {
20
+ domain,
21
+ dataSetId: dataSample.dataSetId
22
+ },
23
+ order: {
24
+ sequence: 'DESC'
25
+ }
26
+ })
27
+
28
+ var spec = {} as any
29
+
30
+ dataItems.sortforEach(dataItem => {
31
+ spec[dataItem.name] = dataItem.spec
32
+ })
33
+
34
+ return await tx.getRepository(DataSample).save({
35
+ name: dataSet.name,
36
+ description: dataSet.description,
37
+ ...dataSample,
38
+ domain,
39
+ spec,
40
+ creator: user,
41
+ updater: user
42
+ })
43
+ }
44
+
45
+ @Directive('@privilege(category: "data-sample", privilege: "mutation", domainOwnerGranted: true)')
46
+ @Directive('@transaction')
47
+ @Mutation(returns => DataSample, { description: 'To modify data sample information' })
48
+ async updateDataSample(
49
+ @Arg('id') id: string,
50
+ @Arg('patch') patch: DataSamplePatch,
51
+ @Ctx() context: any
52
+ ): Promise<DataSample> {
53
+ const { domain, user, tx } = context.state
54
+
55
+ const repository = tx.getRepository(DataSample)
56
+ const dataSample = await repository.findOne({
57
+ where: { domain, id }
58
+ })
59
+
60
+ return await repository.save({
61
+ ...dataSample,
62
+ ...patch,
63
+ updater: user
64
+ })
65
+ }
66
+
67
+ @Directive('@privilege(category: "data-sample", privilege: "mutation", domainOwnerGranted: true)')
68
+ @Directive('@transaction')
69
+ @Mutation(returns => [DataSample], { description: "To modify multiple data samples' information" })
70
+ async updateMultipleDataSample(
71
+ @Arg('patches', type => [DataSamplePatch]) patches: DataSamplePatch[],
72
+ @Ctx() context: any
73
+ ): Promise<DataSample[]> {
74
+ const { domain, user, tx } = context.state
75
+
76
+ let results = []
77
+ const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
78
+ const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
79
+ const dataSampleRepo = tx.getRepository(DataSample)
80
+
81
+ if (_createRecords.length > 0) {
82
+ for (let i = 0; i < _createRecords.length; i++) {
83
+ const newRecord = _createRecords[i]
84
+
85
+ const result = await dataSampleRepo.save({
86
+ ...newRecord,
87
+ domain,
88
+ creator: user,
89
+ updater: user
90
+ })
91
+
92
+ results.push({ ...result, cuFlag: '+' })
93
+ }
94
+ }
95
+
96
+ if (_updateRecords.length > 0) {
97
+ for (let i = 0; i < _updateRecords.length; i++) {
98
+ const newRecord = _updateRecords[i]
99
+ const dataSample = await dataSampleRepo.findOne(newRecord.id)
100
+
101
+ const result = await dataSampleRepo.save({
102
+ ...dataSample,
103
+ ...newRecord,
104
+ updater: user
105
+ })
106
+
107
+ results.push({ ...result, cuFlag: 'M' })
108
+ }
109
+ }
110
+
111
+ return results
112
+ }
113
+
114
+ @Directive('@privilege(category: "data-sample", privilege: "mutation", domainOwnerGranted: true)')
115
+ @Directive('@transaction')
116
+ @Mutation(returns => Boolean, { description: 'To delete a data sample' })
117
+ async deleteDataSample(@Arg('id') id: string, @Ctx() context: any): Promise<boolean> {
118
+ const { domain, tx } = context.state
119
+
120
+ await tx.getRepository(DataSample).delete({ domain, id })
121
+ return true
122
+ }
123
+
124
+ @Directive('@privilege(category: "data-sample", privilege: "mutation", domainOwnerGranted: true)')
125
+ @Directive('@transaction')
126
+ @Mutation(returns => Boolean, { description: 'To delete multiple data samples' })
127
+ async deleteDataSamples(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<boolean> {
128
+ const { domain, tx } = context.state
129
+
130
+ await tx.getRepository(DataSample).delete({
131
+ domain,
132
+ id: In(ids)
133
+ })
134
+
135
+ return true
136
+ }
137
+ }