@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.
Files changed (46) hide show
  1. package/README.md +10 -1
  2. package/index.js +82 -56
  3. package/lib/consts.d.ts +8 -0
  4. package/lib/consts.js +12 -0
  5. package/lib/consts.js.map +1 -0
  6. package/lib/importLoader/index.d.ts +1 -0
  7. package/lib/importLoader/index.js +29 -0
  8. package/lib/importLoader/index.js.map +1 -0
  9. package/lib/importLoader/types/import.d.ts +17 -0
  10. package/lib/importLoader/types/import.js +3 -0
  11. package/lib/importLoader/types/import.js.map +1 -0
  12. package/lib/importLoader/types/index.d.ts +1 -0
  13. package/lib/importLoader/types/index.js +5 -0
  14. package/lib/importLoader/types/index.js.map +1 -0
  15. package/lib/imports/Base.d.ts +3 -0
  16. package/lib/imports/Base.js +3 -0
  17. package/lib/imports/Base.js.map +1 -0
  18. package/lib/imports/ImportCsv.d.ts +7 -0
  19. package/lib/imports/ImportCsv.js +27 -0
  20. package/lib/imports/ImportCsv.js.map +1 -0
  21. package/lib/imports/ImportExcel.d.ts +7 -0
  22. package/lib/imports/ImportExcel.js +20 -0
  23. package/lib/imports/ImportExcel.js.map +1 -0
  24. package/lib/imports/ImportJson.d.ts +7 -0
  25. package/lib/imports/ImportJson.js +28 -0
  26. package/lib/imports/ImportJson.js.map +1 -0
  27. package/lib/index.d.ts +1 -0
  28. package/lib/index.js +2 -1
  29. package/lib/index.js.map +1 -1
  30. package/lib/methods/importData.d.ts +1 -0
  31. package/lib/methods/importData.js +33 -0
  32. package/lib/methods/importData.js.map +1 -0
  33. package/lib/methods/index.d.ts +1 -0
  34. package/lib/methods/index.js +5 -0
  35. package/lib/methods/index.js.map +1 -0
  36. package/package.json +9 -5
  37. package/src/index.ts +0 -11
  38. package/src/loader/triggerYmlLoader.ts +0 -57
  39. package/src/processLoader/index.ts +0 -115
  40. package/src/processLoader/types/index.ts +0 -1
  41. package/src/processLoader/types/process.ts +0 -19
  42. package/src/processTriggerLoader/index.ts +0 -45
  43. package/src/processTriggerLoader/types/index.ts +0 -1
  44. package/src/processTriggerLoader/types/trigger.ts +0 -6
  45. package/src/triggerLoader/index.ts +0 -153
  46. 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, canLoadMetadata } = require('@steedos/metadata-registrar');
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', '~packages-project-server', '@steedos/service-packages'],
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
- await this.loadDataOnServiceStarted();
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
- loadDataOnServiceStarted: async function(){
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
- if(canLoadMetadata('Process')){
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
- if(canLoadMetadata('Trigger')){
154
- await triggerLoader.load(this.broker, packagePath, name);
155
- }
156
- if(canLoadMetadata('ProcessTrigger')){
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
- if(canLoadMetadata('ClientJS')){
164
- this.core.loadClientScripts();
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(`~packages-project-server.disablePackage`, {
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
- console.time(`service ${this.name} started`)
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
- const _packageInfo = metaDataCore.loadJSONFile(path.join(_path, 'package.json'));
269
- await this.broker.call(`@steedos/service-packages.online`, {serviceInfo: {name: this.name, nodeID: this.broker.nodeID, instanceID: this.broker.instanceID, path: _path, version: _packageInfo.version, description: _packageInfo.description}})
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
- console.timeEnd(`service ${this.name} started`)
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: [{
@@ -0,0 +1,8 @@
1
+ export declare const METADATA_SYSTEM_PERMISSION: {
2
+ is_system: boolean;
3
+ record_permissions: {
4
+ allowEdit: boolean;
5
+ allowDelete: boolean;
6
+ allowRead: boolean;
7
+ };
8
+ };
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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=import.js.map
@@ -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,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./import"), exports);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/importLoader/types/index.ts"],"names":[],"mappings":";;;AAAA,mDAAyB"}
@@ -0,0 +1,3 @@
1
+ export interface Base {
2
+ readFile(filePath: string, options?: any): any;
3
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Base.js","sourceRoot":"","sources":["../../src/imports/Base.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import ImportJson from './ImportJson';
2
+ export default class ImportCsv extends ImportJson {
3
+ readFile(filePath: string): Promise<Array<{
4
+ objectName: string;
5
+ records: Array<any>;
6
+ }>>;
7
+ }
@@ -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,7 @@
1
+ import { Base } from './Base';
2
+ export default class ImportExcel implements Base {
3
+ readFile(filePath: string, options?: any): {
4
+ datas: Array<any>;
5
+ headers: Array<string>;
6
+ };
7
+ }
@@ -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,7 @@
1
+ import { Base } from './Base';
2
+ export default class ImportJson implements Base {
3
+ readFile(filePath: string): Promise<Array<{
4
+ objectName: string;
5
+ records: Array<any>;
6
+ }>>;
7
+ }
@@ -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,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.importData = void 0;
4
+ exports.importData = require("./importData");
5
+ //# sourceMappingURL=index.js.map
@@ -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.1-beta.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.1-beta.6",
14
- "@steedos/metadata-registrar": "2.6.1-beta.6",
15
- "@steedos/router": "2.6.1-beta.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": "d77961251196c5352622d977e554660796ed6208"
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,6 +0,0 @@
1
- export type Trigger = {
2
- name: string,
3
- listenTo: string,
4
- when: string | string[],
5
- handler: Function
6
- }
@@ -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
- }