@steedos/service-package-loader 2.6.1-beta.7 → 2.6.2-beta.2
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.
- package/README.md +10 -1
- package/index.js +80 -56
- package/lib/imports/Base.d.ts +3 -0
- package/lib/imports/Base.js +3 -0
- package/lib/imports/Base.js.map +1 -0
- package/lib/imports/ImportCsv.d.ts +7 -0
- package/lib/imports/ImportCsv.js +27 -0
- package/lib/imports/ImportCsv.js.map +1 -0
- package/lib/imports/ImportExcel.d.ts +7 -0
- package/lib/imports/ImportExcel.js +20 -0
- package/lib/imports/ImportExcel.js.map +1 -0
- package/lib/imports/ImportJson.d.ts +7 -0
- package/lib/imports/ImportJson.js +28 -0
- package/lib/imports/ImportJson.js.map +1 -0
- package/lib/methods/importData.d.ts +1 -0
- package/lib/methods/importData.js +33 -0
- package/lib/methods/importData.js.map +1 -0
- package/lib/methods/index.d.ts +1 -0
- package/lib/methods/index.js +5 -0
- package/lib/methods/index.js.map +1 -0
- package/package.json +9 -5
- package/src/consts.ts +0 -17
- package/src/importLoader/index.ts +0 -36
- package/src/importLoader/types/import.ts +0 -26
- package/src/importLoader/types/index.ts +0 -1
- package/src/index.ts +0 -12
- package/src/loader/triggerYmlLoader.ts +0 -57
- package/src/processLoader/index.ts +0 -115
- package/src/processLoader/types/index.ts +0 -1
- package/src/processLoader/types/process.ts +0 -19
- package/src/processTriggerLoader/index.ts +0 -45
- package/src/processTriggerLoader/types/index.ts +0 -1
- package/src/processTriggerLoader/types/trigger.ts +0 -6
- package/src/triggerLoader/index.ts +0 -153
- package/tsconfig.json +0 -34
package/README.md
CHANGED
|
@@ -1,2 +1,11 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
* @Author: 孙浩林 sunhaolin@steedos.com
|
|
3
|
+
* @Date: 2021-10-21 14:19:05
|
|
4
|
+
* @LastEditors: 孙浩林 sunhaolin@steedos.com
|
|
5
|
+
* @LastEditTime: 2023-10-27 13:00:22
|
|
6
|
+
* @FilePath: /steedos-platform-2.3/services/service-package-loader/README.md
|
|
7
|
+
* @Description:
|
|
8
|
+
-->
|
|
1
9
|
## 功能说明
|
|
2
|
-
- 用于加载自定义对象
|
|
10
|
+
- 用于加载自定义对象
|
|
11
|
+
- 工作区初始化完成后默认导入软件包main/default/data文件夹下的{objectname}.data.json、{objectname}.data.csv、{flowApiname}.flow.data.json数据
|
package/index.js
CHANGED
|
@@ -9,15 +9,35 @@ const path = require('path');
|
|
|
9
9
|
const _ = require('lodash');
|
|
10
10
|
const fs = require("fs");
|
|
11
11
|
const metaDataCore = require('@steedos/metadata-core');
|
|
12
|
-
const { registerMetadataConfigs, loadStandardMetadata, loadRouters
|
|
12
|
+
const { registerMetadataConfigs, loadStandardMetadata, loadRouters } = require('@steedos/metadata-registrar');
|
|
13
|
+
const moment = require('moment');
|
|
14
|
+
const objectMixin = require('@steedos/service-object-mixin')
|
|
15
|
+
|
|
13
16
|
const loadFlowFile = new metaDataCore.LoadFlowFile();
|
|
14
17
|
|
|
18
|
+
const getPackageYmlData = (packagePath)=>{
|
|
19
|
+
let packageYmlData = {};
|
|
20
|
+
if(fs.existsSync(path.join(packagePath, 'package.service.yml'))){
|
|
21
|
+
packageYmlData = metaDataCore.loadFile(path.join(packagePath, 'package.service.yml')) || {};
|
|
22
|
+
}
|
|
23
|
+
if(fs.existsSync(path.join(packagePath, 'README.md'))){
|
|
24
|
+
packageYmlData.readme = metaDataCore.loadFile(path.join(packagePath, 'README.md'));
|
|
25
|
+
}else if(fs.existsSync(path.join(packagePath, 'readme.md'))){
|
|
26
|
+
packageYmlData.readme = metaDataCore.loadFile(path.join(packagePath, 'readme.md'));
|
|
27
|
+
}
|
|
28
|
+
return packageYmlData;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const methods = require('./lib/methods')
|
|
32
|
+
|
|
15
33
|
/**
|
|
16
34
|
* @typedef {import('moleculer').Context} Context Moleculer's Context
|
|
17
35
|
*/
|
|
18
36
|
|
|
19
37
|
module.exports = {
|
|
20
38
|
name: "service-package-loader",
|
|
39
|
+
|
|
40
|
+
mixins: [objectMixin],
|
|
21
41
|
|
|
22
42
|
triggerLoader,
|
|
23
43
|
|
|
@@ -36,7 +56,7 @@ module.exports = {
|
|
|
36
56
|
/**
|
|
37
57
|
* Dependencies
|
|
38
58
|
*/
|
|
39
|
-
dependencies: ['metadata-server', '
|
|
59
|
+
dependencies: ['metadata-server', '@steedos/service-project', '@steedos/service-packages', 'objectql', '@steedos/data-import'],
|
|
40
60
|
|
|
41
61
|
/**
|
|
42
62
|
* Actions
|
|
@@ -55,8 +75,12 @@ module.exports = {
|
|
|
55
75
|
}
|
|
56
76
|
},
|
|
57
77
|
"space.initialized": {
|
|
58
|
-
async handler() {
|
|
59
|
-
|
|
78
|
+
async handler(ctx) {
|
|
79
|
+
const spaceDoc = ctx.params
|
|
80
|
+
const spaceId = spaceDoc._id
|
|
81
|
+
// 扫描main/default/data文件夹
|
|
82
|
+
await this.importData(path.join(this.settings.packageInfo.path, 'main', 'default', 'data'), false, spaceId);
|
|
83
|
+
await this.loadDataOnServiceStarted(spaceId);
|
|
60
84
|
}
|
|
61
85
|
}
|
|
62
86
|
},
|
|
@@ -65,6 +89,8 @@ module.exports = {
|
|
|
65
89
|
* Methods
|
|
66
90
|
*/
|
|
67
91
|
methods: {
|
|
92
|
+
...methods,
|
|
93
|
+
|
|
68
94
|
checkPackageMetadataFiles: async function (packagePath) {
|
|
69
95
|
|
|
70
96
|
if(this.core){
|
|
@@ -76,16 +102,6 @@ module.exports = {
|
|
|
76
102
|
this.broker.logger.warn(`The public folder has been deprecated. ${publicPath}`);
|
|
77
103
|
}
|
|
78
104
|
|
|
79
|
-
// 扫描软件包中的元数据, 如果有 .client.js 文件, 则输出警告信息
|
|
80
|
-
const filePatten = [
|
|
81
|
-
path.join(packagePath, "**", "*.client.js"),
|
|
82
|
-
"!" + path.join(packagePath, "node_modules"),
|
|
83
|
-
]
|
|
84
|
-
const matchedPaths = metaDataCore.syncMatchFiles(filePatten);
|
|
85
|
-
for await (const filePath of matchedPaths) {
|
|
86
|
-
this.broker.logger.warn(`The client.js file has been deprecated. ${filePath}`);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
105
|
// 扫描软件包中的元数据, 如果有 .object.js 文件, 则输出警告信息
|
|
90
106
|
const filePatten2 = [
|
|
91
107
|
path.join(packagePath, "**", "*.object.js"),
|
|
@@ -106,38 +122,38 @@ module.exports = {
|
|
|
106
122
|
this.broker.logger.warn(`The router.js file has been deprecated. ${filePath}`);
|
|
107
123
|
}
|
|
108
124
|
},
|
|
109
|
-
sendPackageFlowToDb: async function(packagePath, name) {
|
|
110
|
-
if(!canLoadMetadata('Flow')){
|
|
111
|
-
return ;
|
|
112
|
-
}
|
|
125
|
+
sendPackageFlowToDb: async function(packagePath, name, spaceId) {
|
|
113
126
|
const flows = loadFlowFile.load(path.join(packagePath, '**'));
|
|
114
127
|
for (const apiName in flows) {
|
|
115
128
|
const flow = flows[apiName];
|
|
116
129
|
const flowFilePath = flow.__filename;
|
|
117
130
|
delete flow.__filename;
|
|
118
131
|
try {
|
|
119
|
-
await this.importFlow(flow, name);
|
|
132
|
+
await this.importFlow(flow, name, spaceId);
|
|
120
133
|
} catch (error) {
|
|
121
134
|
console.error(`importFlow error`, flowFilePath, error)
|
|
122
135
|
}
|
|
123
136
|
}
|
|
124
137
|
},
|
|
125
138
|
|
|
126
|
-
importFlow: async function(flow, name) {
|
|
127
|
-
return await this.broker.call('steedos-server.importFlow', {flow, name});
|
|
139
|
+
importFlow: async function(flow, name, spaceId) {
|
|
140
|
+
return await this.broker.call('steedos-server.importFlow', {flow, name, spaceId});
|
|
128
141
|
},
|
|
129
|
-
|
|
142
|
+
/**
|
|
143
|
+
* @param {string} spaceId 非必传
|
|
144
|
+
* @returns
|
|
145
|
+
*/
|
|
146
|
+
loadDataOnServiceStarted: async function(spaceId){
|
|
130
147
|
let packageInfo = this.settings.packageInfo;
|
|
131
148
|
if (!packageInfo) {
|
|
132
149
|
return;
|
|
133
150
|
}
|
|
134
151
|
const { path : _path } = packageInfo;
|
|
152
|
+
|
|
135
153
|
this.loadPackagePublicFiles(_path);
|
|
136
154
|
if(_path){
|
|
137
|
-
this.sendPackageFlowToDb(_path)
|
|
138
|
-
|
|
139
|
-
processLoader.sendPackageProcessToDb(_path);
|
|
140
|
-
}
|
|
155
|
+
this.sendPackageFlowToDb(_path, null, spaceId)
|
|
156
|
+
processLoader.sendPackageProcessToDb(_path);
|
|
141
157
|
}
|
|
142
158
|
},
|
|
143
159
|
loadPackageMetadataFiles: async function (packagePath, name, datasourceName) {
|
|
@@ -147,28 +163,18 @@ module.exports = {
|
|
|
147
163
|
datasourceName = 'default';
|
|
148
164
|
}
|
|
149
165
|
if(this.objectql){
|
|
150
|
-
await loadStandardMetadata(name, datasourceName);
|
|
151
166
|
await this.initDataSource(packagePath, datasourceName);
|
|
167
|
+
await loadStandardMetadata(name, datasourceName);
|
|
152
168
|
}
|
|
153
169
|
await registerMetadataConfigs(packagePath, datasourceName, name);
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
if(canLoadMetadata('ProcessTrigger')){
|
|
158
|
-
await processTriggerLoader.load(this.broker, packagePath, name);
|
|
159
|
-
}
|
|
160
|
-
if(canLoadMetadata('TriggerYml')){
|
|
161
|
-
await triggerYmlLoader.load(this.broker, packagePath, name);
|
|
162
|
-
}
|
|
170
|
+
await triggerLoader.load(this.broker, packagePath, name);
|
|
171
|
+
await processTriggerLoader.load(this.broker, packagePath, name);
|
|
172
|
+
await triggerYmlLoader.load(this.broker, packagePath, name);
|
|
163
173
|
await importLoader.load(this.broker, packagePath, name);
|
|
164
174
|
if(this.core){
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
}
|
|
168
|
-
if(canLoadMetadata('Router')){
|
|
169
|
-
const routersInfo = await this.loadPackageRouters(packagePath, name);
|
|
170
|
-
await this.broker.call(`@steedos/service-packages.setPackageRoutersInfo`, {packageName: name, data: routersInfo});
|
|
171
|
-
}
|
|
175
|
+
// this.core.loadClientScripts();
|
|
176
|
+
const routersInfo = await this.loadPackageRouters(packagePath, name);
|
|
177
|
+
await this.broker.call(`@steedos/service-packages.setPackageRoutersInfo`, {packageName: name, data: routersInfo});
|
|
172
178
|
}
|
|
173
179
|
await this.broker.emit(`translations.object.change`, {});
|
|
174
180
|
return;
|
|
@@ -194,9 +200,6 @@ module.exports = {
|
|
|
194
200
|
},
|
|
195
201
|
loadPackagePublicFiles: {
|
|
196
202
|
handler(packagePath) {
|
|
197
|
-
if(!canLoadMetadata('PublicFolder')){
|
|
198
|
-
return ;
|
|
199
|
-
}
|
|
200
203
|
if (!this.settings.packageInfo.loadPublicFolder) {
|
|
201
204
|
return;
|
|
202
205
|
}
|
|
@@ -208,6 +211,7 @@ module.exports = {
|
|
|
208
211
|
} catch (error) {
|
|
209
212
|
return
|
|
210
213
|
}
|
|
214
|
+
|
|
211
215
|
try {
|
|
212
216
|
const express = require('express');
|
|
213
217
|
this.settings.loadedPackagePublicFiles = true;
|
|
@@ -218,7 +222,6 @@ module.exports = {
|
|
|
218
222
|
routerPath = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX;
|
|
219
223
|
}
|
|
220
224
|
const cacheTime = 86400000 * 1; // one day
|
|
221
|
-
// console.log(`static router`, routerPath, publicPath)
|
|
222
225
|
router.use(routerPath, express.static(publicPath, { maxAge: cacheTime }));
|
|
223
226
|
// WebApp.connectHandlers.use(router);
|
|
224
227
|
} catch (error) {
|
|
@@ -232,13 +235,19 @@ module.exports = {
|
|
|
232
235
|
},
|
|
233
236
|
async errorHandler(error) {
|
|
234
237
|
this.broker.logger.error(`[${this.name}] 启动失败: ${error.message}`);
|
|
235
|
-
await await this.broker.call(
|
|
238
|
+
await await this.broker.call(`@steedos/service-project.disablePackage`, {
|
|
236
239
|
module: this.schema.packageName
|
|
237
240
|
})
|
|
238
241
|
return await this.broker.destroyService(this);
|
|
239
242
|
},
|
|
240
243
|
async onStarted(){
|
|
241
244
|
|
|
245
|
+
// 扫描main/default/data文件夹,在加载.flow.json前执行
|
|
246
|
+
const primarySpaceId = await this.broker.call("objectql.getPrimarySpaceId");
|
|
247
|
+
if (primarySpaceId) {
|
|
248
|
+
await this.importData(path.join(this.settings.packageInfo.path, 'main', 'default', 'data'), true, primarySpaceId);
|
|
249
|
+
}
|
|
250
|
+
|
|
242
251
|
this.checkPackageMetadataFiles(this.settings.packageInfo.path)
|
|
243
252
|
|
|
244
253
|
if(this.beforeStart){
|
|
@@ -249,7 +258,7 @@ module.exports = {
|
|
|
249
258
|
}
|
|
250
259
|
}
|
|
251
260
|
|
|
252
|
-
|
|
261
|
+
const startTime = moment();
|
|
253
262
|
let packageInfo = this.settings.packageInfo;
|
|
254
263
|
if (!packageInfo) {
|
|
255
264
|
return;
|
|
@@ -267,18 +276,25 @@ module.exports = {
|
|
|
267
276
|
await this.loadPackageMetadataFiles(_path, this.name, datasource);
|
|
268
277
|
if(isPackage !== false){
|
|
269
278
|
try {
|
|
270
|
-
|
|
271
|
-
|
|
279
|
+
let _packageInfo = {};
|
|
280
|
+
if(fs.existsSync(path.join(_path, 'package.json'))){
|
|
281
|
+
_packageInfo = metaDataCore.loadJSONFile(path.join(_path, 'package.json'));
|
|
282
|
+
}else if(fs.existsSync(path.join(_path, '..','package.json'))){
|
|
283
|
+
_packageInfo = metaDataCore.loadJSONFile(path.join(_path, '..', 'package.json'));
|
|
284
|
+
}
|
|
285
|
+
const packageYmlData = getPackageYmlData(_path);
|
|
286
|
+
await this.broker.call(`@steedos/service-packages.online`, {serviceInfo: {packageYmlData: packageYmlData, name: this.name, nodeID: this.broker.nodeID, instanceID: this.broker.instanceID, path: _path, version: _packageInfo.version, description: _packageInfo.description}})
|
|
272
287
|
} catch (error) {
|
|
273
|
-
|
|
288
|
+
console.log(`error`, error)
|
|
274
289
|
}
|
|
275
290
|
}
|
|
276
|
-
|
|
291
|
+
|
|
277
292
|
await this.loadPackageMetadataServices(_path);
|
|
278
293
|
|
|
279
294
|
// await this.loadPackagePublicFiles(_path);
|
|
280
295
|
this.started = true;
|
|
281
|
-
|
|
296
|
+
const endTime = moment();
|
|
297
|
+
console.log(`service ${this.name} started:`, `${endTime.diff(startTime, 'seconds', true)}s`);
|
|
282
298
|
if(this.afterStart){
|
|
283
299
|
try {
|
|
284
300
|
await this.afterStart();
|
|
@@ -349,7 +365,15 @@ module.exports = {
|
|
|
349
365
|
|
|
350
366
|
schema.settings.packageInfo = {
|
|
351
367
|
...schema.settings.packageInfo,
|
|
352
|
-
...(schema.metadata && schema.metadata.$package ? schema.metadata.$package : {})
|
|
368
|
+
...(schema.metadata && schema.metadata.$package ? schema.metadata.$package : {}),
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
const _path = schema.settings.packageInfo.path;
|
|
372
|
+
let packageYmlData = getPackageYmlData(_path);
|
|
373
|
+
|
|
374
|
+
schema.settings.packageInfo = {
|
|
375
|
+
...schema.settings.packageInfo,
|
|
376
|
+
...packageYmlData
|
|
353
377
|
}
|
|
354
378
|
},
|
|
355
379
|
|
|
@@ -385,7 +409,7 @@ module.exports = {
|
|
|
385
409
|
})
|
|
386
410
|
}
|
|
387
411
|
await this.objectql.deletePackageClientScripts(this.name);
|
|
388
|
-
await this.core.loadClientScripts();
|
|
412
|
+
// await this.core.loadClientScripts();
|
|
389
413
|
}
|
|
390
414
|
this.broker.call(`@steedos/service-packages.offline`, {serviceInfo: {name: this.name, nodeID: this.broker.nodeID, instanceID: this.broker.instanceID}})
|
|
391
415
|
await this.broker.call(`metadata.refreshServiceMetadatas`, { offlinePackageServices: [{
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Base.js","sourceRoot":"","sources":["../../src/imports/Base.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const ImportJson_1 = require("./ImportJson");
|
|
5
|
+
const csv = require("csvtojson");
|
|
6
|
+
const path = require("path");
|
|
7
|
+
const metadata_core_1 = require("@steedos/metadata-core");
|
|
8
|
+
class ImportCsv extends ImportJson_1.default {
|
|
9
|
+
readFile(filePath) {
|
|
10
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
11
|
+
let results = [];
|
|
12
|
+
const filePatten = [
|
|
13
|
+
path.join(filePath, "**", "*.data.csv"),
|
|
14
|
+
"!" + path.join(filePath, "node_modules"),
|
|
15
|
+
];
|
|
16
|
+
const matchedPaths = (0, metadata_core_1.syncMatchFiles)(filePatten);
|
|
17
|
+
for (const matchedPath of matchedPaths) {
|
|
18
|
+
let records = yield csv().fromFile(matchedPath);
|
|
19
|
+
let objectName = path.basename(matchedPath).split('.')[0];
|
|
20
|
+
results.push({ objectName: objectName, records: records });
|
|
21
|
+
}
|
|
22
|
+
return results;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.default = ImportCsv;
|
|
27
|
+
//# sourceMappingURL=ImportCsv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImportCsv.js","sourceRoot":"","sources":["../../src/imports/ImportCsv.ts"],"names":[],"mappings":";;;AAQA,6CAAsC;AACtC,iCAAkC;AAClC,6BAA8B;AAC9B,0DAAwD;AAExD,MAAqB,SAAU,SAAQ,oBAAU;IAEvC,QAAQ,CAAC,QAAgB;;YAC3B,IAAI,OAAO,GAAQ,EAAE,CAAA;YACrB,MAAM,UAAU,GAAG;gBACf,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC;gBACvC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC;aAC5C,CAAA;YACD,MAAM,YAAY,GAAa,IAAA,8BAAc,EAAC,UAAU,CAAC,CAAC;YAC1D,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;gBACpC,IAAI,OAAO,GAAG,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAChD,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;aAC9D;YACD,OAAO,OAAO,CAAA;QAClB,CAAC;KAAA;CACJ;AAhBD,4BAgBC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const node_xlsx_1 = require("node-xlsx");
|
|
4
|
+
class ImportExcel {
|
|
5
|
+
readFile(filePath, options = {}) {
|
|
6
|
+
const { sheetIndex = 0, headerIndex = 0 } = options;
|
|
7
|
+
let workbook = node_xlsx_1.default.parse(filePath, {
|
|
8
|
+
cellDates: true,
|
|
9
|
+
});
|
|
10
|
+
const data = workbook[sheetIndex].data;
|
|
11
|
+
const headers = data[headerIndex];
|
|
12
|
+
const datas = data.slice(1);
|
|
13
|
+
return {
|
|
14
|
+
headers,
|
|
15
|
+
datas
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.default = ImportExcel;
|
|
20
|
+
//# sourceMappingURL=ImportExcel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImportExcel.js","sourceRoot":"","sources":["../../src/imports/ImportExcel.ts"],"names":[],"mappings":";;AAQA,yCAA6B;AAG7B,MAAqB,WAAW;IAE5B,QAAQ,CAAC,QAAgB,EAAE,UAAe,EAAE;QACxC,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;QACpD,IAAI,QAAQ,GAAG,mBAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YAChC,SAAS,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,OAAO;YACH,OAAO;YACP,KAAK;SACR,CAAC;IACN,CAAC;CAEJ;AAhBD,8BAgBC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
5
|
+
const metadata_core_1 = require("@steedos/metadata-core");
|
|
6
|
+
const path = require("path");
|
|
7
|
+
const fs = require("fs");
|
|
8
|
+
class ImportJson {
|
|
9
|
+
readFile(filePath) {
|
|
10
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
11
|
+
let results = [];
|
|
12
|
+
const filePatten = [
|
|
13
|
+
path.join(filePath, "**", "*.data.json"),
|
|
14
|
+
"!" + path.join(filePath, "**", "*.flow.data.json"),
|
|
15
|
+
"!" + path.join(filePath, "node_modules")
|
|
16
|
+
];
|
|
17
|
+
const matchedPaths = (0, metadata_core_1.syncMatchFiles)(filePatten);
|
|
18
|
+
(0, lodash_1.each)(matchedPaths, (matchedPath) => {
|
|
19
|
+
let records = JSON.parse(fs.readFileSync(matchedPath, 'utf8').normalize('NFC'));
|
|
20
|
+
let objectName = path.basename(matchedPath).split('.')[0];
|
|
21
|
+
results.push({ objectName: objectName, records: records });
|
|
22
|
+
});
|
|
23
|
+
return results;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.default = ImportJson;
|
|
28
|
+
//# sourceMappingURL=ImportJson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImportJson.js","sourceRoot":"","sources":["../../src/imports/ImportJson.ts"],"names":[],"mappings":";;;AAQA,mCAA8B;AAE9B,0DAAwD;AACxD,6BAA8B;AAC9B,yBAA0B;AAE1B,MAAqB,UAAU;IAErB,QAAQ,CAAC,QAAgB;;YAC3B,IAAI,OAAO,GAAQ,EAAE,CAAA;YACrB,MAAM,UAAU,GAAG;gBACf,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,aAAa,CAAC;gBACxC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,kBAAkB,CAAC;gBACnD,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC;aAAC,CAAC;YAE/C,MAAM,YAAY,GAAa,IAAA,8BAAc,EAAC,UAAU,CAAC,CAAC;YAC1D,IAAA,aAAI,EAAC,YAAY,EAAE,CAAC,WAAmB,EAAE,EAAE;gBACvC,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gBAChF,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAA;YACF,OAAO,OAAO,CAAA;QAClB,CAAC;KAAA;CAEJ;AAlBD,6BAkBC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function handler(filePath: string, onlyInsert: boolean, spaceId: string): Promise<void>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handler = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const ImportJson_1 = require("../imports/ImportJson");
|
|
6
|
+
const ImportCsv_1 = require("../imports/ImportCsv");
|
|
7
|
+
const fs = require("fs");
|
|
8
|
+
function handler(filePath, onlyInsert, spaceId) {
|
|
9
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
10
|
+
if (!filePath) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (!fs.existsSync(filePath)) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const importer = {
|
|
17
|
+
csv: new ImportCsv_1.default(),
|
|
18
|
+
json: new ImportJson_1.default(),
|
|
19
|
+
};
|
|
20
|
+
const csvData = yield importer.csv.readFile(filePath);
|
|
21
|
+
const jsonData = yield importer.json.readFile(filePath);
|
|
22
|
+
yield this.broker.call("@steedos/data-import.importData", {
|
|
23
|
+
data: {
|
|
24
|
+
"csv": csvData,
|
|
25
|
+
"json": jsonData,
|
|
26
|
+
},
|
|
27
|
+
spaceId,
|
|
28
|
+
onlyInsert,
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
exports.handler = handler;
|
|
33
|
+
//# sourceMappingURL=importData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"importData.js","sourceRoot":"","sources":["../../src/methods/importData.ts"],"names":[],"mappings":";;;;AAQA,sDAA+C;AAC/C,oDAA4C;AAE5C,yBAA0B;AAE1B,SAAsB,OAAO,CAAC,QAAgB,EAAE,UAAmB,EAAE,OAAe;;QAChF,IAAI,CAAC,QAAQ,EAAE;YACX,OAAM;SACT;QACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;YAC1B,OAAM;SACT;QAED,MAAM,QAAQ,GAAG;YACb,GAAG,EAAE,IAAI,mBAAS,EAAE;YACpB,IAAI,EAAE,IAAI,oBAAU,EAAE;SACzB,CAAA;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEtD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAGxD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;YACtD,IAAI,EAAE;gBACF,KAAK,EAAE,OAAO;gBACd,MAAM,EAAE,QAAQ;aACnB;YACD,OAAO;YACP,UAAU;SACb,CAAC,CAAA;IAEN,CAAC;CAAA;AA3BD,0BA2BC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * as importData from './importData';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/methods/index.ts"],"names":[],"mappings":";;;AAQA,6CAA2C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@steedos/service-package-loader",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.2-beta.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -10,11 +10,15 @@
|
|
|
10
10
|
"author": "",
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@steedos/metadata-core": "2.6.
|
|
14
|
-
"@steedos/metadata-registrar": "2.6.
|
|
15
|
-
"@steedos/router": "2.6.
|
|
13
|
+
"@steedos/metadata-core": "2.6.2-beta.2",
|
|
14
|
+
"@steedos/metadata-registrar": "2.6.2-beta.2",
|
|
15
|
+
"@steedos/router": "2.6.2-beta.2",
|
|
16
|
+
"@steedos/service-object-mixin": "2.6.2-beta.2",
|
|
16
17
|
"clone": "^2.1.2",
|
|
18
|
+
"csvtojson": "~2.0.10",
|
|
17
19
|
"moleculer": "^0.14.25",
|
|
20
|
+
"moment": "^2.24.0",
|
|
21
|
+
"node-xlsx": "^0.16.1",
|
|
18
22
|
"underscore": "^1.12.0"
|
|
19
23
|
},
|
|
20
24
|
"devDependencies": {
|
|
@@ -24,5 +28,5 @@
|
|
|
24
28
|
"publishConfig": {
|
|
25
29
|
"access": "public"
|
|
26
30
|
},
|
|
27
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "ddef9fbc34afc7b57c59a31e9ed4f56818dc4c31"
|
|
28
32
|
}
|
package/src/consts.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: 孙浩林 sunhaolin@steedos.com
|
|
3
|
-
* @Date: 2023-07-10 13:54:16
|
|
4
|
-
* @LastEditors: 孙浩林 sunhaolin@steedos.com
|
|
5
|
-
* @LastEditTime: 2023-07-10 13:59:34
|
|
6
|
-
* @Description:
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
// 加载元数据文件时给的默认权限
|
|
10
|
-
export const METADATA_SYSTEM_PERMISSION = {
|
|
11
|
-
is_system: true,
|
|
12
|
-
record_permissions: {
|
|
13
|
-
allowEdit: false,
|
|
14
|
-
allowDelete: false,
|
|
15
|
-
allowRead: true,
|
|
16
|
-
}
|
|
17
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: 孙浩林 sunhaolin@steedos.com
|
|
3
|
-
* @Date: 2023-07-10 13:49:21
|
|
4
|
-
* @LastEditors: 孙浩林 sunhaolin@steedos.com
|
|
5
|
-
* @LastEditTime: 2023-07-10 14:05:05
|
|
6
|
-
* @FilePath: /project-template/Users/sunhaolin/Documents/GitHub/steedos-platform-2.3/services/service-package-loader/src/importLoader/index.ts
|
|
7
|
-
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { LoadImportFile } from '@steedos/metadata-core'
|
|
11
|
-
import { registerImport } from '@steedos/metadata-registrar'
|
|
12
|
-
import path = require('path');
|
|
13
|
-
import _ = require('lodash');
|
|
14
|
-
import { Import } from './types';
|
|
15
|
-
import { METADATA_SYSTEM_PERMISSION } from '../consts';
|
|
16
|
-
|
|
17
|
-
const loadImportFile = new LoadImportFile();
|
|
18
|
-
|
|
19
|
-
export async function load(broker: any, packagePath: string, packageServiceName: string) {
|
|
20
|
-
let filePath = path.join(packagePath, "**");
|
|
21
|
-
const metadatasJSON = loadImportFile.load(filePath);
|
|
22
|
-
if (_.isEmpty(metadatasJSON)) {
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// 注册到元数据中心
|
|
27
|
-
const data = [];
|
|
28
|
-
for (const apiName in metadatasJSON) {
|
|
29
|
-
const doc: Import = metadatasJSON[apiName];
|
|
30
|
-
data.push(Object.assign(doc, METADATA_SYSTEM_PERMISSION));
|
|
31
|
-
}
|
|
32
|
-
if (data.length > 0) {
|
|
33
|
-
await registerImport.mregister(broker, packageServiceName, data)
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: 孙浩林 sunhaolin@steedos.com
|
|
3
|
-
* @Date: 2023-07-10 13:50:03
|
|
4
|
-
* @LastEditors: 孙浩林 sunhaolin@steedos.com
|
|
5
|
-
* @LastEditTime: 2023-07-10 15:06:59
|
|
6
|
-
* @Description:
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
type FieldMapping = {
|
|
10
|
-
header: string, // 表头
|
|
11
|
-
api_name?: string, // 导入对象的字段
|
|
12
|
-
matched_by?: string, // 关联对象的key
|
|
13
|
-
save_key_while_fail?: boolean // 关联失败时保存key
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export type Import = {
|
|
17
|
-
name: string, // API Name
|
|
18
|
-
description?: string, // 导入描述
|
|
19
|
-
object_name: string, // 导入对象
|
|
20
|
-
encoding?: string, // 字符代码 UTF8
|
|
21
|
-
value_separator?: string, // 值分隔符 ','
|
|
22
|
-
operation: 'insert' | 'update' | 'upsert', // 导入操作
|
|
23
|
-
field_mappings: [FieldMapping], // 映射关系
|
|
24
|
-
external_id_name?: string, // 表示数据唯一性字段(重复执行导入时根据此字段更新记录)
|
|
25
|
-
}
|
|
26
|
-
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './import';
|
package/src/index.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: sunhaolin@hotoa.com
|
|
3
|
-
* @Date: 2022-05-14 10:16:03
|
|
4
|
-
* @LastEditors: 孙浩林 sunhaolin@steedos.com
|
|
5
|
-
* @LastEditTime: 2023-07-10 14:02:11
|
|
6
|
-
* @Description:
|
|
7
|
-
*/
|
|
8
|
-
export * as triggerLoader from "./triggerLoader"
|
|
9
|
-
export * as processLoader from "./processLoader"
|
|
10
|
-
export * as processTriggerLoader from "./processTriggerLoader"
|
|
11
|
-
export * as triggerYmlLoader from './loader/triggerYmlLoader';
|
|
12
|
-
export * as importLoader from './importLoader'
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: baozhoutao@steedos.com
|
|
3
|
-
* @Date: 2023-04-25 16:52:28
|
|
4
|
-
* @LastEditors: baozhoutao@steedos.com
|
|
5
|
-
* @LastEditTime: 2023-05-18 09:27:20
|
|
6
|
-
* @Description:
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { LoadTriggerFile } from '@steedos/metadata-core'
|
|
10
|
-
import path = require('path');
|
|
11
|
-
import _ = require('lodash');
|
|
12
|
-
|
|
13
|
-
const loadTriggerFile = new LoadTriggerFile();
|
|
14
|
-
function isPatternTrigger(data){
|
|
15
|
-
const {listenTo} = data;
|
|
16
|
-
if(listenTo === '*'){
|
|
17
|
-
return true;
|
|
18
|
-
}else if(_.isArray(listenTo)){
|
|
19
|
-
return true;
|
|
20
|
-
}else if(_.isRegExp(listenTo)){
|
|
21
|
-
return true;
|
|
22
|
-
}else if(_.isString(listenTo) && listenTo.startsWith("/")){
|
|
23
|
-
try {
|
|
24
|
-
if(_.isRegExp(eval(listenTo))){
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
} catch (error) {
|
|
28
|
-
return false
|
|
29
|
-
}
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
34
|
-
export async function load(broker: any, packagePath: string, packageServiceName: string) {
|
|
35
|
-
let filePath = path.join(packagePath, "**");
|
|
36
|
-
let triggers: any = loadTriggerFile.load(filePath);
|
|
37
|
-
if (_.isEmpty(triggers)) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
for (const apiName in triggers) {
|
|
41
|
-
const trigger = triggers[apiName];
|
|
42
|
-
if(isPatternTrigger(trigger)){
|
|
43
|
-
trigger.isPattern = true
|
|
44
|
-
}
|
|
45
|
-
await broker.call(`object_triggers.add`, { apiName: `${trigger.listenTo}.${trigger.name}`, data: trigger }, {
|
|
46
|
-
meta: {
|
|
47
|
-
metadataServiceName: packageServiceName,
|
|
48
|
-
caller: {
|
|
49
|
-
nodeID: broker.nodeID,
|
|
50
|
-
service: {
|
|
51
|
-
name: packageServiceName,
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}});
|
|
55
|
-
broker.broadcast('metadata.object_triggers.change', {apiName: `${trigger.listenTo}.${trigger.name}`, listenTo: trigger.listenTo})
|
|
56
|
-
}
|
|
57
|
-
}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: sunhaolin@hotoa.com
|
|
3
|
-
* @Date: 2022-03-30 11:49:53
|
|
4
|
-
* @LastEditors: baozhoutao@steedos.com
|
|
5
|
-
* @LastEditTime: 2023-05-30 09:33:01
|
|
6
|
-
* @Description:
|
|
7
|
-
*/
|
|
8
|
-
import * as _ from "underscore";
|
|
9
|
-
import * as path from "path";
|
|
10
|
-
import { Process } from "./types";
|
|
11
|
-
import { LoadProcessFile } from '@steedos/metadata-core';
|
|
12
|
-
import { registerProcess } from '@steedos/metadata-registrar';
|
|
13
|
-
const loadProcessFile = new LoadProcessFile();
|
|
14
|
-
|
|
15
|
-
function getObject(objectName: string) {
|
|
16
|
-
try {
|
|
17
|
-
const objectql = require('@steedos/objectql');
|
|
18
|
-
return objectql.getObject(objectName);
|
|
19
|
-
} catch (error) {
|
|
20
|
-
return null
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export async function load(broker: any, packagePath: string, packageServiceName: string) {
|
|
25
|
-
let filePath = path.join(packagePath, "**");
|
|
26
|
-
let processes = loadProcessFile.load(filePath);
|
|
27
|
-
if (_.isEmpty(processes)) {
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const data = [];
|
|
32
|
-
for (const apiName in processes) {
|
|
33
|
-
const process: Process = processes[apiName];
|
|
34
|
-
data.push(Object.assign(process, {
|
|
35
|
-
is_system: true,
|
|
36
|
-
record_permissions: {
|
|
37
|
-
allowEdit: false,
|
|
38
|
-
allowDelete: false,
|
|
39
|
-
allowRead: true,
|
|
40
|
-
}
|
|
41
|
-
}));
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
if (data.length > 0) {
|
|
45
|
-
await registerProcess.mregister(broker, packageServiceName, data)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// 软件包中的process元数据直接加载到库中
|
|
51
|
-
export async function sendPackageProcessToDb(packagePath: string) {
|
|
52
|
-
let filePath = path.join(packagePath, "**");
|
|
53
|
-
let processes = loadProcessFile.load(filePath);
|
|
54
|
-
|
|
55
|
-
if (_.isEmpty(processes)) {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const processObj = getObject('process');
|
|
60
|
-
const processVersionsObj = getObject('process_versions');
|
|
61
|
-
const spaceObj = getObject('spaces');
|
|
62
|
-
if(!processObj || !processVersionsObj || !spaceObj){
|
|
63
|
-
return ;
|
|
64
|
-
}
|
|
65
|
-
const spaceDoc = (await spaceObj.find({}))[0];
|
|
66
|
-
// 如果没有工作区信息则说明为空库,不加载
|
|
67
|
-
if (!spaceDoc) {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const now = new Date();
|
|
71
|
-
const ownerId = spaceDoc.owner;
|
|
72
|
-
const baseInfo = {
|
|
73
|
-
space: spaceDoc._id,
|
|
74
|
-
owner: ownerId,
|
|
75
|
-
created: now,
|
|
76
|
-
modified: now,
|
|
77
|
-
created_by: ownerId,
|
|
78
|
-
modified_by: ownerId,
|
|
79
|
-
}
|
|
80
|
-
for (const apiName in processes) {
|
|
81
|
-
const processCount = await processObj.count({ filters: [['name', '=', apiName]] });
|
|
82
|
-
if (processCount > 0) {
|
|
83
|
-
console.log(`process ${apiName} already exists`);
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
const process: Process = processes[apiName];
|
|
87
|
-
const processId = await processObj._makeNewID();
|
|
88
|
-
let processDoc = {
|
|
89
|
-
_id: processId,
|
|
90
|
-
name: process.name,
|
|
91
|
-
label: process.label,
|
|
92
|
-
object_name: process.object_name,
|
|
93
|
-
engine: process.engine,
|
|
94
|
-
is_active: false,
|
|
95
|
-
description: process.description || '',
|
|
96
|
-
entry_criteria: process.entry_criteria || '',
|
|
97
|
-
when: process.when || '',
|
|
98
|
-
ext: process.ext || '',
|
|
99
|
-
...baseInfo
|
|
100
|
-
};
|
|
101
|
-
let processVersionDoc = {
|
|
102
|
-
process: processId,
|
|
103
|
-
is_active: false,
|
|
104
|
-
description: process.description || '',
|
|
105
|
-
entry_criteria: process.entry_criteria || '',
|
|
106
|
-
when: process.when || '',
|
|
107
|
-
schema: process.schema || '',
|
|
108
|
-
version: 1,
|
|
109
|
-
...baseInfo
|
|
110
|
-
};
|
|
111
|
-
await processObj.directInsert(processDoc);
|
|
112
|
-
await processVersionsObj.directInsert(processVersionDoc);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './process';
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: sunhaolin@hotoa.com
|
|
3
|
-
* @Date: 2022-03-30 11:49:53
|
|
4
|
-
* @LastEditors: sunhaolin@hotoa.com
|
|
5
|
-
* @LastEditTime: 2022-03-30 21:24:32
|
|
6
|
-
* @Description: Process 元数据格式
|
|
7
|
-
*/
|
|
8
|
-
export type Process = {
|
|
9
|
-
name: string,
|
|
10
|
-
label: string,
|
|
11
|
-
object_name: string,
|
|
12
|
-
engine: string,
|
|
13
|
-
is_active?: boolean,
|
|
14
|
-
description?: string,
|
|
15
|
-
entry_criteria: string,
|
|
16
|
-
when: 'afterInsert' | 'afterUpdate',
|
|
17
|
-
schema?: string,
|
|
18
|
-
ext: string
|
|
19
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: baozhoutao@steedos.com
|
|
3
|
-
* @Date: 2022-05-16 11:55:06
|
|
4
|
-
* @LastEditors: baozhoutao@steedos.com
|
|
5
|
-
* @LastEditTime: 2023-05-30 09:47:15
|
|
6
|
-
* @Description:
|
|
7
|
-
*/
|
|
8
|
-
import * as _ from "underscore";
|
|
9
|
-
import * as path from "path";
|
|
10
|
-
import { getMD5, JSONStringify } from '@steedos/metadata-core';
|
|
11
|
-
import { Trigger } from "./types";
|
|
12
|
-
import { registerProcessTrigger, loadProcessTriggers } from "@steedos/metadata-registrar";
|
|
13
|
-
|
|
14
|
-
const ENUM_WHEN = ['beforeDraftInsert', 'afterDraftInsert', 'beforeDraftSubmit', 'afterDraftSubmit', 'beforeStepSubmit', 'afterStepSubmit', 'cacluateNextStepUsers',
|
|
15
|
-
'beforeCancel', 'afterCancel', 'beforeTerminate', 'afterTerminate', 'beforeEnd', 'afterEnd'];
|
|
16
|
-
const LISTENTO_ALL_FLOWS = 'LISTENTO_ALL_FLOWS';
|
|
17
|
-
|
|
18
|
-
export async function load(broker: any, packagePath: string, packageServiceName: string) {
|
|
19
|
-
let filePath = path.join(packagePath, "**");
|
|
20
|
-
let wTriggers = loadProcessTriggers(filePath);
|
|
21
|
-
if (_.isEmpty(wTriggers)) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
for (const wt of wTriggers) {
|
|
25
|
-
|
|
26
|
-
if (_.isString(wt.listenTo)) {
|
|
27
|
-
for (const when of ENUM_WHEN) {
|
|
28
|
-
let handler = wt[when];
|
|
29
|
-
if (!handler) {
|
|
30
|
-
continue;
|
|
31
|
-
}
|
|
32
|
-
let name = wt.name || getMD5(JSONStringify(wt));
|
|
33
|
-
let config: Trigger = {
|
|
34
|
-
name: name,
|
|
35
|
-
"listenTo": wt.listenTo == '*' ? LISTENTO_ALL_FLOWS : wt.listenTo,
|
|
36
|
-
"when": when,
|
|
37
|
-
"handler": handler.toString()
|
|
38
|
-
}
|
|
39
|
-
await registerProcessTrigger.register(broker, packageServiceName, config);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './trigger';
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: sunhaolin@hotoa.com
|
|
3
|
-
* @Date: 2022-06-12 19:08:48
|
|
4
|
-
* @LastEditors: baozhoutao@steedos.com
|
|
5
|
-
* @LastEditTime: 2023-05-30 09:52:23
|
|
6
|
-
* @Description: 加载*.trigger.js文件注册为新版action trigger
|
|
7
|
-
*/
|
|
8
|
-
import * as _ from "underscore";
|
|
9
|
-
import * as path from "path";
|
|
10
|
-
import { JSONStringify, getMD5 } from "@steedos/metadata-core";
|
|
11
|
-
import { loadObjectTriggers } from "@steedos/metadata-registrar";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const TRIGGERKEYS = ['beforeFind', 'beforeInsert', 'beforeUpdate', 'beforeDelete', 'afterFind', 'afterInsert', 'afterUpdate', 'afterDelete', 'afterFindOne', 'afterCount']
|
|
16
|
-
|
|
17
|
-
function getObject(objectName: string) {
|
|
18
|
-
try {
|
|
19
|
-
const objectql = require('@steedos/objectql');
|
|
20
|
-
return objectql.getObject(objectName);
|
|
21
|
-
} catch (error) {
|
|
22
|
-
return null
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export async function load(broker: any, packagePath: string, packageServiceName: string) {
|
|
27
|
-
let actions = {};
|
|
28
|
-
let serviceName = `~triggers-${packageServiceName}`;
|
|
29
|
-
let filePath = path.join(packagePath, "**");
|
|
30
|
-
let objTriggers = loadObjectTriggers(filePath, packageServiceName);
|
|
31
|
-
if (_.isEmpty(objTriggers)) {
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
/** objTriggers格式
|
|
35
|
-
[
|
|
36
|
-
{
|
|
37
|
-
beforeInsert: [AsyncFunction: beforeInsert],
|
|
38
|
-
beforeUpdate: [AsyncFunction: beforeUpdate],
|
|
39
|
-
beforeDelete: [AsyncFunction: beforeDelete],
|
|
40
|
-
afterInsert: [AsyncFunction: afterInsert],
|
|
41
|
-
afterUpdate: [AsyncFunction: afterUpdate],
|
|
42
|
-
afterDelete: [AsyncFunction: afterDelete],
|
|
43
|
-
metadataServiceName: '~packages-my-steedos-package',
|
|
44
|
-
listenTo: 'company'
|
|
45
|
-
}
|
|
46
|
-
]
|
|
47
|
-
*/
|
|
48
|
-
for (const trigger of objTriggers) {
|
|
49
|
-
// 转换为action trigger
|
|
50
|
-
/** action trigger 格式
|
|
51
|
-
spaceUsersBeforeUpdate: {
|
|
52
|
-
trigger: {
|
|
53
|
-
listenTo: 'space_users',
|
|
54
|
-
when: ['beforeInsert', 'beforeUpdate']
|
|
55
|
-
},
|
|
56
|
-
async handler(ctx) {
|
|
57
|
-
this.broker.logger.debug('spaceUsersBeforeUpdate', ctx)
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
*/
|
|
61
|
-
const actionTriggerName = getMD5(JSONStringify(trigger));
|
|
62
|
-
actions[actionTriggerName] = generateActionTrigger(trigger)
|
|
63
|
-
|
|
64
|
-
broker.emit('trigger.loaded', {
|
|
65
|
-
objectName: trigger['listenTo']
|
|
66
|
-
})
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
let serviceConfig = {
|
|
70
|
-
name: serviceName,
|
|
71
|
-
actions: actions
|
|
72
|
-
};
|
|
73
|
-
let service = broker.createService(serviceConfig);
|
|
74
|
-
if (!broker.started) {
|
|
75
|
-
await broker._restartService(service)
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// 生成action trigger
|
|
81
|
-
function generateActionTrigger(trigger) {
|
|
82
|
-
const when = [];
|
|
83
|
-
for (const key in trigger) {
|
|
84
|
-
if (Object.hasOwnProperty.call(trigger, key)) {
|
|
85
|
-
if (_.contains(TRIGGERKEYS, key)) {
|
|
86
|
-
when.push(key);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
const actionTrigger = {
|
|
91
|
-
trigger: {
|
|
92
|
-
listenTo: trigger.listenTo,
|
|
93
|
-
when: when
|
|
94
|
-
},
|
|
95
|
-
async handler(ctx) {
|
|
96
|
-
// 调用trigger.js的处理函数
|
|
97
|
-
const {
|
|
98
|
-
isInsert, isUpdate, isDelete, isFind, isBefore, isAfter, isFindOne, isCount,
|
|
99
|
-
id, doc, previousDoc,
|
|
100
|
-
// size,
|
|
101
|
-
userId, spaceId, objectName, query, data }: any = ctx.params;
|
|
102
|
-
|
|
103
|
-
const context: any = {
|
|
104
|
-
id,
|
|
105
|
-
userId,
|
|
106
|
-
spaceId,
|
|
107
|
-
doc,
|
|
108
|
-
previousDoc,
|
|
109
|
-
query,
|
|
110
|
-
data,
|
|
111
|
-
objectName
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
let when = ''
|
|
115
|
-
if (isBefore) {
|
|
116
|
-
if (isFind) {
|
|
117
|
-
when = 'beforeFind'
|
|
118
|
-
} else if (isInsert) {
|
|
119
|
-
when = 'beforeInsert'
|
|
120
|
-
} else if (isUpdate) {
|
|
121
|
-
when = 'beforeUpdate'
|
|
122
|
-
} else if (isDelete) {
|
|
123
|
-
when = 'beforeDelete'
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
else if (isAfter) {
|
|
127
|
-
if (isFind) {
|
|
128
|
-
when = 'afterFind'
|
|
129
|
-
} else if (isInsert) {
|
|
130
|
-
when = 'afterInsert'
|
|
131
|
-
} else if (isUpdate) {
|
|
132
|
-
when = 'afterUpdate'
|
|
133
|
-
} else if (isDelete) {
|
|
134
|
-
when = 'afterDelete'
|
|
135
|
-
} else if (isFindOne) {
|
|
136
|
-
when = 'afterFindOne'
|
|
137
|
-
} else if (isCount) {
|
|
138
|
-
when = 'afterCount'
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
if (when) {
|
|
143
|
-
const object = getObject(objectName);
|
|
144
|
-
if(!object){
|
|
145
|
-
return ;
|
|
146
|
-
}
|
|
147
|
-
await object.runTriggers(when, context);
|
|
148
|
-
return context;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
|
-
return actionTrigger;
|
|
153
|
-
}
|
package/tsconfig.json
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
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
|
-
}
|