@steedos/service-metadata-database 3.0.0-beta.8

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 (52) hide show
  1. package/LICENSE.txt +661 -0
  2. package/lib/actions/index.d.ts +0 -0
  3. package/lib/actions/index.js +1 -0
  4. package/lib/actions/index.js.map +1 -0
  5. package/lib/constants.d.ts +1 -0
  6. package/lib/constants.js +5 -0
  7. package/lib/constants.js.map +1 -0
  8. package/lib/handles/apps.d.ts +8 -0
  9. package/lib/handles/apps.js +37 -0
  10. package/lib/handles/apps.js.map +1 -0
  11. package/lib/handles/base.d.ts +13 -0
  12. package/lib/handles/base.js +49 -0
  13. package/lib/handles/base.js.map +1 -0
  14. package/lib/handles/index.d.ts +5 -0
  15. package/lib/handles/index.js +9 -0
  16. package/lib/handles/index.js.map +1 -0
  17. package/lib/handles/objects.d.ts +9 -0
  18. package/lib/handles/objects.js +89 -0
  19. package/lib/handles/objects.js.map +1 -0
  20. package/lib/handles/restriction_rules.d.ts +8 -0
  21. package/lib/handles/restriction_rules.js +37 -0
  22. package/lib/handles/restriction_rules.js.map +1 -0
  23. package/lib/handles/share_rules.d.ts +8 -0
  24. package/lib/handles/share_rules.js +37 -0
  25. package/lib/handles/share_rules.js.map +1 -0
  26. package/lib/handles/tabs.d.ts +8 -0
  27. package/lib/handles/tabs.js +37 -0
  28. package/lib/handles/tabs.js.map +1 -0
  29. package/lib/handles/triggers.d.ts +9 -0
  30. package/lib/handles/triggers.js +110 -0
  31. package/lib/handles/triggers.js.map +1 -0
  32. package/lib/index.d.ts +1 -0
  33. package/lib/index.js +77 -0
  34. package/lib/index.js.map +1 -0
  35. package/lib/methods/index.d.ts +0 -0
  36. package/lib/methods/index.js +1 -0
  37. package/lib/methods/index.js.map +1 -0
  38. package/package.json +21 -0
  39. package/package.service.js +10 -0
  40. package/src/actions/index.ts +0 -0
  41. package/src/constants.ts +1 -0
  42. package/src/handles/apps.ts +28 -0
  43. package/src/handles/base.ts +48 -0
  44. package/src/handles/index.ts +5 -0
  45. package/src/handles/objects.ts +102 -0
  46. package/src/handles/restriction_rules.ts +40 -0
  47. package/src/handles/share_rules.ts +28 -0
  48. package/src/handles/tabs.ts +28 -0
  49. package/src/handles/triggers.ts +111 -0
  50. package/src/index.ts +120 -0
  51. package/src/methods/index.ts +0 -0
  52. package/tsconfig.json +34 -0
package/package.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@steedos/service-metadata-database",
3
+ "version": "3.0.0-beta.8",
4
+ "main": "package.service.js",
5
+ "scripts": {
6
+ "build": "rm -rf ./lib && tsc"
7
+ },
8
+ "dependencies": {
9
+ "@steedos/metadata-registrar": "3.0.0-beta.8",
10
+ "@steedos/objectql": "3.0.0-beta.8",
11
+ "lodash": "^4.17.21"
12
+ },
13
+ "author": "",
14
+ "license": "ISC",
15
+ "description": "",
16
+ "private": false,
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "gitHead": "723d92765db5342a374c7aacb5b835e69f77ca4b"
21
+ }
@@ -0,0 +1,10 @@
1
+ /*
2
+ * @Author: baozhoutao@steedos.com
3
+ * @Date: 2024-11-22 16:45:46
4
+ * @LastEditors: baozhoutao@steedos.com
5
+ * @LastEditTime: 2024-12-05 19:29:41
6
+ * @Description:
7
+ */
8
+
9
+ const service = require("./lib/index.js");
10
+ module.exports = service;
File without changes
@@ -0,0 +1 @@
1
+ export const DB_OBJECT_SERVICE_NAME = "~database-objects";
@@ -0,0 +1,28 @@
1
+ import { addAppConfig, getObject, removeApp } from "@steedos/objectql";
2
+ import { BaseHandle } from "./base";
3
+ import { DB_OBJECT_SERVICE_NAME } from "../constants";
4
+
5
+ export class AppsHandle extends BaseHandle {
6
+ constructor() {
7
+ super("apps");
8
+ }
9
+
10
+ async init() {
11
+ const dbApps = await getObject("apps").directFind();
12
+ for (const dbApp of dbApps) {
13
+ await this.inserted(dbApp);
14
+ }
15
+ }
16
+
17
+ async inserted(data) {
18
+ return addAppConfig(data, DB_OBJECT_SERVICE_NAME);
19
+ }
20
+
21
+ async updated(data) {
22
+ return addAppConfig(data, DB_OBJECT_SERVICE_NAME);
23
+ }
24
+
25
+ async deleted(data) {
26
+ return removeApp(data._id);
27
+ }
28
+ }
@@ -0,0 +1,48 @@
1
+ export type ActionData = {
2
+ name: string;
3
+ [key: string]: unknown;
4
+ };
5
+
6
+ export class BaseHandle {
7
+ type: string;
8
+
9
+ constructor(type: string) {
10
+ this.type = type;
11
+ }
12
+
13
+ async init() {
14
+ console.log(`todo: ${this.type} init`);
15
+ }
16
+
17
+ async handleAction(
18
+ action: "inserted" | "updated" | "deleted",
19
+ data: ActionData,
20
+ ) {
21
+ console.log("BaseHandle handleAction", action, JSON.stringify(data));
22
+ switch (action) {
23
+ case "inserted":
24
+ await this.inserted(data);
25
+ break;
26
+ case "updated":
27
+ await this.updated(data);
28
+ break;
29
+ case "deleted":
30
+ await this.deleted(data);
31
+ break;
32
+ default:
33
+ console.warn(`未知的操作类型: ${action}`);
34
+ }
35
+ }
36
+
37
+ async inserted(data: ActionData) {
38
+ console.log(`todo: ${this.type} inserted`, data);
39
+ }
40
+
41
+ async updated(data: ActionData) {
42
+ console.log(`todo: ${this.type} updated`, data);
43
+ }
44
+
45
+ async deleted(data: ActionData) {
46
+ console.log(`todo: ${this.type} deleted`, data);
47
+ }
48
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./objects";
2
+ export * from "./apps";
3
+ export * from "./tabs";
4
+ export * from "./triggers";
5
+ export * from "./share_rules";
@@ -0,0 +1,102 @@
1
+ import { getObject } from "@steedos/objectql";
2
+ import * as _ from "lodash";
3
+ import { MetadataRegister } from "@steedos/metadata-registrar";
4
+ import { DB_OBJECT_SERVICE_NAME } from "../constants";
5
+ import { BaseHandle } from "./base";
6
+
7
+ export class ObjectsHandle extends BaseHandle {
8
+ constructor() {
9
+ super("objects");
10
+ }
11
+
12
+ async init() {
13
+ const dbObjects = await getObject("objects").directFind({
14
+ fields: ["name"],
15
+ });
16
+ for (const dbObject of dbObjects) {
17
+ await this.handle(dbObject.name);
18
+ }
19
+ }
20
+
21
+ async inserted(data) {
22
+ return this.handle(data.name);
23
+ }
24
+
25
+ async updated(data) {
26
+ return this.handle(data.name);
27
+ }
28
+
29
+ async deleted(data) {
30
+ broker.call("objects.removeConfig", {
31
+ objectName: data.name,
32
+ });
33
+ }
34
+
35
+ async handle(objectName) {
36
+ try {
37
+ console.log("ObjectHandle handle", objectName);
38
+ const records = await getObject("objects").directFind({
39
+ filters: ["name", "=", objectName],
40
+ });
41
+ if (!records || records.length === 0) {
42
+ return null;
43
+ }
44
+
45
+ const record = records[0];
46
+
47
+ // 查询字段
48
+ const fieldRecords = await getObject("object_fields").directFind({
49
+ filters: ["object", "=", objectName],
50
+ });
51
+ const fields = {};
52
+ _.map(fieldRecords, (field) => {
53
+ fields[field.name] = field;
54
+ });
55
+
56
+ // 查询按钮
57
+ const btnRecords = await getObject("object_actions").directFind({
58
+ filters: ["object", "=", objectName],
59
+ });
60
+
61
+ const actions = {};
62
+ _.map(btnRecords, (action) => {
63
+ actions[action.name] = action;
64
+ });
65
+
66
+ // 查询列表视图
67
+ const lvRecords = await getObject("object_listviews").directFind({
68
+ filters: ["object_name", "=", objectName],
69
+ });
70
+
71
+ const list_views = {};
72
+ _.map(lvRecords, (listview) => {
73
+ list_views[listview.name] = listview;
74
+ });
75
+
76
+ // console.log(
77
+ // `addObjectConfig record`,
78
+ // JSON.stringify(
79
+ // Object.assign({}, record, {
80
+ // isMain: true,
81
+ // fields,
82
+ // actions,
83
+ // list_views,
84
+ // }),
85
+ // ),
86
+ // );
87
+ await MetadataRegister.addObjectConfig(
88
+ DB_OBJECT_SERVICE_NAME,
89
+ Object.assign({}, record, {
90
+ isMain: true,
91
+ fields,
92
+ actions,
93
+ list_views,
94
+ }),
95
+ );
96
+ broker.broadcast("$packages.statisticsActivatedPackages", {});
97
+ } catch (error) {
98
+ console.error(error);
99
+ throw error;
100
+ }
101
+ }
102
+ }
@@ -0,0 +1,40 @@
1
+ import { registerRestrictionRules, getObject } from "@steedos/objectql";
2
+ import { BaseHandle } from "./base";
3
+ import { DB_OBJECT_SERVICE_NAME } from "../constants";
4
+
5
+ export class RestrictionRulesHandle extends BaseHandle {
6
+ constructor() {
7
+ super("restriction_rules");
8
+ }
9
+
10
+ async init() {
11
+ const dbRecords = await getObject("restriction_rules").directFind();
12
+ for (const dbRecord of dbRecords) {
13
+ await this.inserted(dbRecord);
14
+ }
15
+ }
16
+
17
+ async inserted(data) {
18
+ return registerRestrictionRules.register(
19
+ broker,
20
+ DB_OBJECT_SERVICE_NAME,
21
+ data,
22
+ );
23
+ }
24
+
25
+ async updated(data) {
26
+ return registerRestrictionRules.register(
27
+ broker,
28
+ DB_OBJECT_SERVICE_NAME,
29
+ data,
30
+ );
31
+ }
32
+
33
+ async deleted(data) {
34
+ return registerRestrictionRules.remove(
35
+ broker,
36
+ DB_OBJECT_SERVICE_NAME,
37
+ data,
38
+ );
39
+ }
40
+ }
@@ -0,0 +1,28 @@
1
+ import { registerShareRules, getObject } from "@steedos/objectql";
2
+ import { BaseHandle } from "./base";
3
+ import { DB_OBJECT_SERVICE_NAME } from "../constants";
4
+
5
+ export class ShareRulesHandle extends BaseHandle {
6
+ constructor() {
7
+ super("share_rules");
8
+ }
9
+
10
+ async init() {
11
+ const dbRecords = await getObject("share_rules").directFind();
12
+ for (const dbRecord of dbRecords) {
13
+ await this.inserted(dbRecord);
14
+ }
15
+ }
16
+
17
+ async inserted(data) {
18
+ return registerShareRules.register(broker, DB_OBJECT_SERVICE_NAME, data);
19
+ }
20
+
21
+ async updated(data) {
22
+ return registerShareRules.register(broker, DB_OBJECT_SERVICE_NAME, data);
23
+ }
24
+
25
+ async deleted(data) {
26
+ return registerShareRules.remove(broker, DB_OBJECT_SERVICE_NAME, data);
27
+ }
28
+ }
@@ -0,0 +1,28 @@
1
+ import { addTabConfig, getObject, removeTab } from "@steedos/objectql";
2
+ import { BaseHandle } from "./base";
3
+ import { DB_OBJECT_SERVICE_NAME } from "../constants";
4
+
5
+ export class TabsHandle extends BaseHandle {
6
+ constructor() {
7
+ super("tabs");
8
+ }
9
+
10
+ async init() {
11
+ const dbTabs = await getObject("tabs").directFind();
12
+ for (const dbTab of dbTabs) {
13
+ await this.inserted(dbTab);
14
+ }
15
+ }
16
+
17
+ async inserted(data) {
18
+ return addTabConfig(data, DB_OBJECT_SERVICE_NAME);
19
+ }
20
+
21
+ async updated(data) {
22
+ return addTabConfig(data, DB_OBJECT_SERVICE_NAME);
23
+ }
24
+
25
+ async deleted(data) {
26
+ return removeTab(data.name);
27
+ }
28
+ }
@@ -0,0 +1,111 @@
1
+ import { getObject } from "@steedos/objectql";
2
+ import { BaseHandle } from "./base";
3
+ import { DB_OBJECT_SERVICE_NAME } from "../constants";
4
+ import * as _ from "lodash";
5
+
6
+ export class TriggersHandle extends BaseHandle {
7
+ constructor() {
8
+ super("object_triggers");
9
+ }
10
+
11
+ async init() {
12
+ const dbTriggers = await getObject("object_triggers").directFind();
13
+ for (const dbTrigger of dbTriggers) {
14
+ await this.inserted(dbTrigger);
15
+ }
16
+ }
17
+
18
+ async inserted(trigger) {
19
+ if (this.isPatternTrigger(trigger)) {
20
+ trigger.isPattern = true;
21
+ }
22
+ await broker.call(
23
+ `object_triggers.add`,
24
+ { apiName: `${trigger.listenTo}.${trigger.name}`, data: trigger },
25
+ {
26
+ meta: {
27
+ metadataServiceName: DB_OBJECT_SERVICE_NAME,
28
+ caller: {
29
+ nodeID: broker.nodeID,
30
+ service: {
31
+ name: DB_OBJECT_SERVICE_NAME,
32
+ },
33
+ },
34
+ },
35
+ },
36
+ );
37
+ broker.broadcast("metadata.object_triggers.change", {
38
+ apiName: `${trigger.listenTo}.${trigger.name}`,
39
+ listenTo: trigger.listenTo,
40
+ });
41
+ }
42
+
43
+ async updated(trigger) {
44
+ if (this.isPatternTrigger(trigger)) {
45
+ trigger.isPattern = true;
46
+ }
47
+ await broker.call(
48
+ `object_triggers.add`,
49
+ { apiName: `${trigger.listenTo}.${trigger.name}`, data: trigger },
50
+ {
51
+ meta: {
52
+ metadataServiceName: DB_OBJECT_SERVICE_NAME,
53
+ caller: {
54
+ nodeID: broker.nodeID,
55
+ service: {
56
+ name: DB_OBJECT_SERVICE_NAME,
57
+ },
58
+ },
59
+ },
60
+ },
61
+ );
62
+ broker.broadcast("metadata.object_triggers.change", {
63
+ apiName: `${trigger.listenTo}.${trigger.name}`,
64
+ listenTo: trigger.listenTo,
65
+ });
66
+ }
67
+
68
+ async deleted(trigger) {
69
+ await broker.call(
70
+ `object_triggers.delete`,
71
+ { apiName: `${trigger.listenTo}.${trigger.name}` },
72
+ {
73
+ meta: {
74
+ metadataServiceName: DB_OBJECT_SERVICE_NAME,
75
+ caller: {
76
+ nodeID: broker.nodeID,
77
+ service: {
78
+ name: DB_OBJECT_SERVICE_NAME,
79
+ },
80
+ },
81
+ },
82
+ },
83
+ );
84
+ broker.broadcast("metadata.object_triggers.change", {
85
+ apiName: `${trigger.listenTo}.${trigger.name}`,
86
+ listenTo: trigger.listenTo,
87
+ });
88
+ }
89
+
90
+ private isPatternTrigger(data) {
91
+ const { listenTo } = data;
92
+ if (listenTo === "*") {
93
+ return true;
94
+ } else if (_.isArray(listenTo)) {
95
+ return true;
96
+ } else if (_.isRegExp(listenTo)) {
97
+ return true;
98
+ } else if (_.isString(listenTo) && listenTo.startsWith("/")) {
99
+ try {
100
+ if (_.isRegExp(eval(listenTo))) {
101
+ return true;
102
+ }
103
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
104
+ } catch (error) {
105
+ return false;
106
+ }
107
+ return false;
108
+ }
109
+ return false;
110
+ }
111
+ }
package/src/index.ts ADDED
@@ -0,0 +1,120 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ /*
3
+ * @Author: sunhaolin@hotoa.com
4
+ * @Date: 2022-03-04 17:02:52
5
+ * @LastEditors: baozhoutao@steedos.com
6
+ * @LastEditTime: 2025-03-12 15:11:33
7
+ * @Description:
8
+ */
9
+ "use strict";
10
+ // import * as actions from './actions';
11
+ // import * as methods from './methods';
12
+ import {
13
+ ObjectsHandle,
14
+ AppsHandle,
15
+ TabsHandle,
16
+ TriggersHandle,
17
+ ShareRulesHandle,
18
+ } from "./handles";
19
+ import { RestrictionRulesHandle } from "./handles/restriction_rules";
20
+
21
+ const project = require("../package.json");
22
+ const packageName = project.name;
23
+
24
+ module.exports = {
25
+ name: packageName,
26
+ namespace: "steedos",
27
+ mixins: [],
28
+
29
+ /**
30
+ * Dependencies
31
+ */
32
+ dependencies: ["@steedos/service-core-objects"],
33
+
34
+ /**
35
+ * Actions
36
+ */
37
+ actions: {
38
+ // ...actions
39
+ },
40
+
41
+ /**
42
+ * Events
43
+ */
44
+ events: {
45
+ "$metadata.*": function (payload, sender, event, ctx) {
46
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
47
+ const self = this;
48
+ // console.log(`Event '${event}' received from ${sender} node:`, payload);
49
+ const { type, action, data } = payload;
50
+ switch (type) {
51
+ case "apps":
52
+ self.appsHandle.handleAction(action, data);
53
+ break;
54
+ case "tabs":
55
+ self.tabsHandle.handleAction(action, data);
56
+ break;
57
+ case "object_listviews":
58
+ self.objectsHandle.handleAction(action, { name: data.object_name });
59
+ break;
60
+ case "object_fields":
61
+ self.objectsHandle.handleAction(action, { name: data.object });
62
+ break;
63
+ case "object_actions":
64
+ self.objectsHandle.handleAction(action, { name: data.object });
65
+ break;
66
+ case "objects":
67
+ self.objectsHandle.handleAction(action, data);
68
+ break;
69
+ case "object_triggers":
70
+ self.triggersHandle.handleAction(action, data);
71
+ break;
72
+ case "share_rules":
73
+ self.shareRulesHandle.handleAction(action, data);
74
+ break;
75
+ case "restriction_rules":
76
+ self.restrictionRulesHandle.handleAction(action, data);
77
+ break;
78
+ default:
79
+ break;
80
+ }
81
+ },
82
+ },
83
+
84
+ /**
85
+ * Methods
86
+ */
87
+ methods: {
88
+ // ...methods
89
+ },
90
+
91
+ /**
92
+ * Service created lifecycle event handler
93
+ */
94
+ async created() {
95
+ this.objectsHandle = new ObjectsHandle();
96
+ this.appsHandle = new AppsHandle();
97
+ this.tabsHandle = new TabsHandle();
98
+ this.triggersHandle = new TriggersHandle();
99
+ this.shareRulesHandle = new ShareRulesHandle();
100
+ this.restrictionRulesHandle = new RestrictionRulesHandle();
101
+ },
102
+
103
+ /**
104
+ * Service started lifecycle event handler
105
+ */
106
+ async started() {
107
+ console.log(`Service ${packageName} started`);
108
+ await this.appsHandle.init();
109
+ await this.tabs;
110
+ await this.objectsHandle.init();
111
+ await this.triggersHandle.init();
112
+ await this.shareRulesHandle.init();
113
+ await this.restrictionRulesHandle.init();
114
+ },
115
+
116
+ /**
117
+ * Service stopped lifecycle event handler
118
+ */
119
+ async stopped() {},
120
+ };
File without changes
package/tsconfig.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "compilerOptions": {
3
+ "outDir": "./lib",
4
+ "target": "es6",
5
+ "module": "commonjs",
6
+ "moduleResolution": "node",
7
+ "importHelpers": true,
8
+ "emitDecoratorMetadata": true,
9
+ "experimentalDecorators": true,
10
+ "sourceMap": true,
11
+ "noImplicitAny": false,
12
+ "declaration": true,
13
+ "noFallthroughCasesInSwitch": true,
14
+ //"noImplicitReturns": true,
15
+ "stripInternal": true,
16
+ "pretty": true,
17
+ "strictNullChecks": false,
18
+ "noUnusedLocals": true,
19
+ "downlevelIteration": true,
20
+ "skipLibCheck": true,
21
+ "lib": [
22
+ "es5",
23
+ "es6",
24
+ "es2015",
25
+ "es2016",
26
+ "es2017",
27
+ "esnext"
28
+ ],
29
+ "removeComments": true
30
+ },
31
+ "include": [
32
+ "./src/**/*"
33
+ ]
34
+ }