@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 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, 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
+
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', '~packages-project-server', '@steedos/service-packages'],
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
- 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);
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
- loadDataOnServiceStarted: async function(){
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
- if(canLoadMetadata('Process')){
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
- if(canLoadMetadata('Trigger')){
155
- await triggerLoader.load(this.broker, packagePath, name);
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
- if(canLoadMetadata('ClientJS')){
166
- this.core.loadClientScripts();
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(`~packages-project-server.disablePackage`, {
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
- console.time(`service ${this.name} started`)
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
- const _packageInfo = metaDataCore.loadJSONFile(path.join(_path, 'package.json'));
271
- 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}})
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
- console.timeEnd(`service ${this.name} started`)
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,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"}
@@ -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.7",
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.7",
14
- "@steedos/metadata-registrar": "2.6.1-beta.7",
15
- "@steedos/router": "2.6.1-beta.7",
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": "b12f271460ef3686face095e875aa38e8ddc4c7f"
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,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
- }