@steedos/service-package-loader 2.6.1-beta.6 → 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 +82 -56
- package/lib/consts.d.ts +8 -0
- package/lib/consts.js +12 -0
- package/lib/consts.js.map +1 -0
- package/lib/importLoader/index.d.ts +1 -0
- package/lib/importLoader/index.js +29 -0
- package/lib/importLoader/index.js.map +1 -0
- package/lib/importLoader/types/import.d.ts +17 -0
- package/lib/importLoader/types/import.js +3 -0
- package/lib/importLoader/types/import.js.map +1 -0
- package/lib/importLoader/types/index.d.ts +1 -0
- package/lib/importLoader/types/index.js +5 -0
- package/lib/importLoader/types/index.js.map +1 -0
- 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/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/index.js.map +1 -1
- 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/index.ts +0 -11
- 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
|
@@ -4,19 +4,40 @@ const triggerLoader = require('./lib').triggerLoader;
|
|
|
4
4
|
const processLoader = require('./lib').processLoader;
|
|
5
5
|
const processTriggerLoader = require('./lib').processTriggerLoader;
|
|
6
6
|
const triggerYmlLoader = require('./lib').triggerYmlLoader;
|
|
7
|
+
const importLoader = require('./lib').importLoader;
|
|
7
8
|
const path = require('path');
|
|
8
9
|
const _ = require('lodash');
|
|
9
10
|
const fs = require("fs");
|
|
10
11
|
const metaDataCore = require('@steedos/metadata-core');
|
|
11
|
-
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
|
+
|
|
12
16
|
const loadFlowFile = new metaDataCore.LoadFlowFile();
|
|
13
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
|
+
|
|
14
33
|
/**
|
|
15
34
|
* @typedef {import('moleculer').Context} Context Moleculer's Context
|
|
16
35
|
*/
|
|
17
36
|
|
|
18
37
|
module.exports = {
|
|
19
38
|
name: "service-package-loader",
|
|
39
|
+
|
|
40
|
+
mixins: [objectMixin],
|
|
20
41
|
|
|
21
42
|
triggerLoader,
|
|
22
43
|
|
|
@@ -35,7 +56,7 @@ module.exports = {
|
|
|
35
56
|
/**
|
|
36
57
|
* Dependencies
|
|
37
58
|
*/
|
|
38
|
-
dependencies: ['metadata-server', '
|
|
59
|
+
dependencies: ['metadata-server', '@steedos/service-project', '@steedos/service-packages', 'objectql', '@steedos/data-import'],
|
|
39
60
|
|
|
40
61
|
/**
|
|
41
62
|
* Actions
|
|
@@ -54,8 +75,12 @@ module.exports = {
|
|
|
54
75
|
}
|
|
55
76
|
},
|
|
56
77
|
"space.initialized": {
|
|
57
|
-
async handler() {
|
|
58
|
-
|
|
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);
|
|
59
84
|
}
|
|
60
85
|
}
|
|
61
86
|
},
|
|
@@ -64,6 +89,8 @@ module.exports = {
|
|
|
64
89
|
* Methods
|
|
65
90
|
*/
|
|
66
91
|
methods: {
|
|
92
|
+
...methods,
|
|
93
|
+
|
|
67
94
|
checkPackageMetadataFiles: async function (packagePath) {
|
|
68
95
|
|
|
69
96
|
if(this.core){
|
|
@@ -75,16 +102,6 @@ module.exports = {
|
|
|
75
102
|
this.broker.logger.warn(`The public folder has been deprecated. ${publicPath}`);
|
|
76
103
|
}
|
|
77
104
|
|
|
78
|
-
// 扫描软件包中的元数据, 如果有 .client.js 文件, 则输出警告信息
|
|
79
|
-
const filePatten = [
|
|
80
|
-
path.join(packagePath, "**", "*.client.js"),
|
|
81
|
-
"!" + path.join(packagePath, "node_modules"),
|
|
82
|
-
]
|
|
83
|
-
const matchedPaths = metaDataCore.syncMatchFiles(filePatten);
|
|
84
|
-
for await (const filePath of matchedPaths) {
|
|
85
|
-
this.broker.logger.warn(`The client.js file has been deprecated. ${filePath}`);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
105
|
// 扫描软件包中的元数据, 如果有 .object.js 文件, 则输出警告信息
|
|
89
106
|
const filePatten2 = [
|
|
90
107
|
path.join(packagePath, "**", "*.object.js"),
|
|
@@ -105,38 +122,38 @@ module.exports = {
|
|
|
105
122
|
this.broker.logger.warn(`The router.js file has been deprecated. ${filePath}`);
|
|
106
123
|
}
|
|
107
124
|
},
|
|
108
|
-
sendPackageFlowToDb: async function(packagePath, name) {
|
|
109
|
-
if(!canLoadMetadata('Flow')){
|
|
110
|
-
return ;
|
|
111
|
-
}
|
|
125
|
+
sendPackageFlowToDb: async function(packagePath, name, spaceId) {
|
|
112
126
|
const flows = loadFlowFile.load(path.join(packagePath, '**'));
|
|
113
127
|
for (const apiName in flows) {
|
|
114
128
|
const flow = flows[apiName];
|
|
115
129
|
const flowFilePath = flow.__filename;
|
|
116
130
|
delete flow.__filename;
|
|
117
131
|
try {
|
|
118
|
-
await this.importFlow(flow, name);
|
|
132
|
+
await this.importFlow(flow, name, spaceId);
|
|
119
133
|
} catch (error) {
|
|
120
134
|
console.error(`importFlow error`, flowFilePath, error)
|
|
121
135
|
}
|
|
122
136
|
}
|
|
123
137
|
},
|
|
124
138
|
|
|
125
|
-
importFlow: async function(flow, name) {
|
|
126
|
-
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});
|
|
127
141
|
},
|
|
128
|
-
|
|
142
|
+
/**
|
|
143
|
+
* @param {string} spaceId 非必传
|
|
144
|
+
* @returns
|
|
145
|
+
*/
|
|
146
|
+
loadDataOnServiceStarted: async function(spaceId){
|
|
129
147
|
let packageInfo = this.settings.packageInfo;
|
|
130
148
|
if (!packageInfo) {
|
|
131
149
|
return;
|
|
132
150
|
}
|
|
133
151
|
const { path : _path } = packageInfo;
|
|
152
|
+
|
|
134
153
|
this.loadPackagePublicFiles(_path);
|
|
135
154
|
if(_path){
|
|
136
|
-
this.sendPackageFlowToDb(_path)
|
|
137
|
-
|
|
138
|
-
processLoader.sendPackageProcessToDb(_path);
|
|
139
|
-
}
|
|
155
|
+
this.sendPackageFlowToDb(_path, null, spaceId)
|
|
156
|
+
processLoader.sendPackageProcessToDb(_path);
|
|
140
157
|
}
|
|
141
158
|
},
|
|
142
159
|
loadPackageMetadataFiles: async function (packagePath, name, datasourceName) {
|
|
@@ -146,27 +163,18 @@ module.exports = {
|
|
|
146
163
|
datasourceName = 'default';
|
|
147
164
|
}
|
|
148
165
|
if(this.objectql){
|
|
149
|
-
await loadStandardMetadata(name, datasourceName);
|
|
150
166
|
await this.initDataSource(packagePath, datasourceName);
|
|
167
|
+
await loadStandardMetadata(name, datasourceName);
|
|
151
168
|
}
|
|
152
169
|
await registerMetadataConfigs(packagePath, datasourceName, name);
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
await processTriggerLoader.load(this.broker, packagePath, name);
|
|
158
|
-
}
|
|
159
|
-
if(canLoadMetadata('TriggerYml')){
|
|
160
|
-
await triggerYmlLoader.load(this.broker, packagePath, name);
|
|
161
|
-
}
|
|
170
|
+
await triggerLoader.load(this.broker, packagePath, name);
|
|
171
|
+
await processTriggerLoader.load(this.broker, packagePath, name);
|
|
172
|
+
await triggerYmlLoader.load(this.broker, packagePath, name);
|
|
173
|
+
await importLoader.load(this.broker, packagePath, name);
|
|
162
174
|
if(this.core){
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}
|
|
166
|
-
if(canLoadMetadata('Router')){
|
|
167
|
-
const routersInfo = await this.loadPackageRouters(packagePath, name);
|
|
168
|
-
await this.broker.call(`@steedos/service-packages.setPackageRoutersInfo`, {packageName: name, data: routersInfo});
|
|
169
|
-
}
|
|
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});
|
|
170
178
|
}
|
|
171
179
|
await this.broker.emit(`translations.object.change`, {});
|
|
172
180
|
return;
|
|
@@ -192,9 +200,6 @@ module.exports = {
|
|
|
192
200
|
},
|
|
193
201
|
loadPackagePublicFiles: {
|
|
194
202
|
handler(packagePath) {
|
|
195
|
-
if(!canLoadMetadata('PublicFolder')){
|
|
196
|
-
return ;
|
|
197
|
-
}
|
|
198
203
|
if (!this.settings.packageInfo.loadPublicFolder) {
|
|
199
204
|
return;
|
|
200
205
|
}
|
|
@@ -206,6 +211,7 @@ module.exports = {
|
|
|
206
211
|
} catch (error) {
|
|
207
212
|
return
|
|
208
213
|
}
|
|
214
|
+
|
|
209
215
|
try {
|
|
210
216
|
const express = require('express');
|
|
211
217
|
this.settings.loadedPackagePublicFiles = true;
|
|
@@ -216,7 +222,6 @@ module.exports = {
|
|
|
216
222
|
routerPath = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX;
|
|
217
223
|
}
|
|
218
224
|
const cacheTime = 86400000 * 1; // one day
|
|
219
|
-
// console.log(`static router`, routerPath, publicPath)
|
|
220
225
|
router.use(routerPath, express.static(publicPath, { maxAge: cacheTime }));
|
|
221
226
|
// WebApp.connectHandlers.use(router);
|
|
222
227
|
} catch (error) {
|
|
@@ -230,13 +235,19 @@ module.exports = {
|
|
|
230
235
|
},
|
|
231
236
|
async errorHandler(error) {
|
|
232
237
|
this.broker.logger.error(`[${this.name}] 启动失败: ${error.message}`);
|
|
233
|
-
await await this.broker.call(
|
|
238
|
+
await await this.broker.call(`@steedos/service-project.disablePackage`, {
|
|
234
239
|
module: this.schema.packageName
|
|
235
240
|
})
|
|
236
241
|
return await this.broker.destroyService(this);
|
|
237
242
|
},
|
|
238
243
|
async onStarted(){
|
|
239
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
|
+
|
|
240
251
|
this.checkPackageMetadataFiles(this.settings.packageInfo.path)
|
|
241
252
|
|
|
242
253
|
if(this.beforeStart){
|
|
@@ -247,7 +258,7 @@ module.exports = {
|
|
|
247
258
|
}
|
|
248
259
|
}
|
|
249
260
|
|
|
250
|
-
|
|
261
|
+
const startTime = moment();
|
|
251
262
|
let packageInfo = this.settings.packageInfo;
|
|
252
263
|
if (!packageInfo) {
|
|
253
264
|
return;
|
|
@@ -265,18 +276,25 @@ module.exports = {
|
|
|
265
276
|
await this.loadPackageMetadataFiles(_path, this.name, datasource);
|
|
266
277
|
if(isPackage !== false){
|
|
267
278
|
try {
|
|
268
|
-
|
|
269
|
-
|
|
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}})
|
|
270
287
|
} catch (error) {
|
|
271
|
-
|
|
288
|
+
console.log(`error`, error)
|
|
272
289
|
}
|
|
273
290
|
}
|
|
274
|
-
|
|
291
|
+
|
|
275
292
|
await this.loadPackageMetadataServices(_path);
|
|
276
293
|
|
|
277
294
|
// await this.loadPackagePublicFiles(_path);
|
|
278
295
|
this.started = true;
|
|
279
|
-
|
|
296
|
+
const endTime = moment();
|
|
297
|
+
console.log(`service ${this.name} started:`, `${endTime.diff(startTime, 'seconds', true)}s`);
|
|
280
298
|
if(this.afterStart){
|
|
281
299
|
try {
|
|
282
300
|
await this.afterStart();
|
|
@@ -347,7 +365,15 @@ module.exports = {
|
|
|
347
365
|
|
|
348
366
|
schema.settings.packageInfo = {
|
|
349
367
|
...schema.settings.packageInfo,
|
|
350
|
-
...(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
|
|
351
377
|
}
|
|
352
378
|
},
|
|
353
379
|
|
|
@@ -383,7 +409,7 @@ module.exports = {
|
|
|
383
409
|
})
|
|
384
410
|
}
|
|
385
411
|
await this.objectql.deletePackageClientScripts(this.name);
|
|
386
|
-
await this.core.loadClientScripts();
|
|
412
|
+
// await this.core.loadClientScripts();
|
|
387
413
|
}
|
|
388
414
|
this.broker.call(`@steedos/service-packages.offline`, {serviceInfo: {name: this.name, nodeID: this.broker.nodeID, instanceID: this.broker.instanceID}})
|
|
389
415
|
await this.broker.call(`metadata.refreshServiceMetadatas`, { offlinePackageServices: [{
|
package/lib/consts.d.ts
ADDED
package/lib/consts.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.METADATA_SYSTEM_PERMISSION = void 0;
|
|
4
|
+
exports.METADATA_SYSTEM_PERMISSION = {
|
|
5
|
+
is_system: true,
|
|
6
|
+
record_permissions: {
|
|
7
|
+
allowEdit: false,
|
|
8
|
+
allowDelete: false,
|
|
9
|
+
allowRead: true,
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=consts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":";;;AASa,QAAA,0BAA0B,GAAG;IACtC,SAAS,EAAE,IAAI;IACf,kBAAkB,EAAE;QAChB,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,KAAK;QAClB,SAAS,EAAE,IAAI;KAClB;CACJ,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function load(broker: any, packagePath: string, packageServiceName: string): Promise<void>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.load = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const metadata_core_1 = require("@steedos/metadata-core");
|
|
6
|
+
const metadata_registrar_1 = require("@steedos/metadata-registrar");
|
|
7
|
+
const path = require("path");
|
|
8
|
+
const _ = require("lodash");
|
|
9
|
+
const consts_1 = require("../consts");
|
|
10
|
+
const loadImportFile = new metadata_core_1.LoadImportFile();
|
|
11
|
+
function load(broker, packagePath, packageServiceName) {
|
|
12
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
13
|
+
let filePath = path.join(packagePath, "**");
|
|
14
|
+
const metadatasJSON = loadImportFile.load(filePath);
|
|
15
|
+
if (_.isEmpty(metadatasJSON)) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const data = [];
|
|
19
|
+
for (const apiName in metadatasJSON) {
|
|
20
|
+
const doc = metadatasJSON[apiName];
|
|
21
|
+
data.push(Object.assign(doc, consts_1.METADATA_SYSTEM_PERMISSION));
|
|
22
|
+
}
|
|
23
|
+
if (data.length > 0) {
|
|
24
|
+
yield metadata_registrar_1.registerImport.mregister(broker, packageServiceName, data);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
exports.load = load;
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/importLoader/index.ts"],"names":[],"mappings":";;;;AASA,0DAAuD;AACvD,oEAA4D;AAC5D,6BAA8B;AAC9B,4BAA6B;AAE7B,sCAAuD;AAEvD,MAAM,cAAc,GAAG,IAAI,8BAAc,EAAE,CAAC;AAE5C,SAAsB,IAAI,CAAC,MAAW,EAAE,WAAmB,EAAE,kBAA0B;;QACnF,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;YAC1B,OAAO;SACV;QAGD,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE;YACjC,MAAM,GAAG,GAAW,aAAa,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,mCAA0B,CAAC,CAAC,CAAC;SAC7D;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACjB,MAAM,mCAAc,CAAC,SAAS,CAAC,MAAM,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAA;SACnE;IAEL,CAAC;CAAA;AAjBD,oBAiBC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
declare type FieldMapping = {
|
|
2
|
+
header: string;
|
|
3
|
+
api_name?: string;
|
|
4
|
+
matched_by?: string;
|
|
5
|
+
save_key_while_fail?: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare type Import = {
|
|
8
|
+
name: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
object_name: string;
|
|
11
|
+
encoding?: string;
|
|
12
|
+
value_separator?: string;
|
|
13
|
+
operation: 'insert' | 'update' | 'upsert';
|
|
14
|
+
field_mappings: [FieldMapping];
|
|
15
|
+
external_id_name?: string;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../../src/importLoader/types/import.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './import';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/importLoader/types/index.ts"],"names":[],"mappings":";;;AAAA,mDAAyB"}
|
|
@@ -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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -2,3 +2,4 @@ export * as triggerLoader from "./triggerLoader";
|
|
|
2
2
|
export * as processLoader from "./processLoader";
|
|
3
3
|
export * as processTriggerLoader from "./processTriggerLoader";
|
|
4
4
|
export * as triggerYmlLoader from './loader/triggerYmlLoader';
|
|
5
|
+
export * as importLoader from './importLoader';
|
package/lib/index.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.triggerYmlLoader = exports.processTriggerLoader = exports.processLoader = exports.triggerLoader = void 0;
|
|
3
|
+
exports.importLoader = exports.triggerYmlLoader = exports.processTriggerLoader = exports.processLoader = exports.triggerLoader = void 0;
|
|
4
4
|
exports.triggerLoader = require("./triggerLoader");
|
|
5
5
|
exports.processLoader = require("./processLoader");
|
|
6
6
|
exports.processTriggerLoader = require("./processTriggerLoader");
|
|
7
7
|
exports.triggerYmlLoader = require("./loader/triggerYmlLoader");
|
|
8
|
+
exports.importLoader = require("./importLoader");
|
|
8
9
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAOA,mDAAgD;AAChD,mDAAgD;AAChD,iEAA8D;AAC9D,gEAA8D"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAOA,mDAAgD;AAChD,mDAAgD;AAChD,iEAA8D;AAC9D,gEAA8D;AAC9D,iDAA8C"}
|
|
@@ -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/index.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: sunhaolin@hotoa.com
|
|
3
|
-
* @Date: 2022-05-14 10:16:03
|
|
4
|
-
* @LastEditors: baozhoutao@steedos.com
|
|
5
|
-
* @LastEditTime: 2023-04-25 17:08:47
|
|
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';
|
|
@@ -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
|
-
}
|