@steedos/service-object-graphql 2.5.3-beta.13 → 2.5.3-beta.15

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 (2) hide show
  1. package/package.json +6 -6
  2. package/package.service.js +162 -135
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steedos/service-object-graphql",
3
- "version": "2.5.3-beta.13",
3
+ "version": "2.5.3-beta.15",
4
4
  "main": "package.service.js",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -15,12 +15,12 @@
15
15
  "description": "steedos package",
16
16
  "repository": {},
17
17
  "license": "MIT",
18
- "gitHead": "293a5a23b2a4ab86f037368b0f450c8b2fba4e44",
18
+ "gitHead": "60922001047bf7270aaca51702a3f3541a6b0516",
19
19
  "dependencies": {
20
- "@steedos/filters": "2.5.3-beta.13",
21
- "@steedos/i18n": "2.5.3-beta.13",
22
- "@steedos/objectql": "2.5.3-beta.13",
23
- "@steedos/service-object-mixin": "2.5.3-beta.13",
20
+ "@steedos/filters": "2.5.3-beta.15",
21
+ "@steedos/i18n": "2.5.3-beta.15",
22
+ "@steedos/objectql": "2.5.3-beta.15",
23
+ "@steedos/service-object-mixin": "2.5.3-beta.15",
24
24
  "graphql": "^15.8.0",
25
25
  "graphql-parse-resolve-info": "^4.12.3",
26
26
  "moleculer": "^0.14.25",
@@ -1,8 +1,8 @@
1
1
  /*
2
2
  * @Author: sunhaolin@hotoa.com
3
3
  * @Date: 2023-03-23 15:12:14
4
- * @LastEditors: baozhoutao@steedos.com
5
- * @LastEditTime: 2023-06-09 15:52:01
4
+ * @LastEditors: sunhaolin@hotoa.com
5
+ * @LastEditTime: 2023-06-06 11:03:12
6
6
  * @Description:
7
7
  */
8
8
 
@@ -14,6 +14,7 @@ const {
14
14
  getGraphqlActions,
15
15
  getQueryFields
16
16
  } = require('./lib');
17
+ const open = require('open');
17
18
 
18
19
  const { formatFiltersToODataQuery } = require("@steedos/filters");
19
20
 
@@ -21,8 +22,6 @@ const serviceObjectMixin = require('@steedos/service-object-mixin');
21
22
 
22
23
  const { QUERY_DOCS_TOP } = require('./lib/consts');
23
24
 
24
- const { Register } = require('@steedos/metadata-registrar')
25
-
26
25
  /**
27
26
  * @typedef {import('moleculer').Context} Context Moleculer's Context
28
27
  */
@@ -34,6 +33,8 @@ module.exports = {
34
33
  globalGraphQLSettings: {}, // service-api 里generateGraphQLSchema使用
35
34
  getGraphqlFields: getQueryFields,
36
35
 
36
+ projectStarted: false,
37
+
37
38
  /**
38
39
  * Settings
39
40
  */
@@ -228,66 +229,70 @@ module.exports = {
228
229
  * Events
229
230
  */
230
231
  events: {
231
- "graphql.schema.changed": {
232
- params: {},
233
- async handler(ctx) {
234
- await this.ChangeGlobalGraphQLSettings()
235
- }
236
- },
237
232
  // 此事件表示软件包发生变化(包括加载、卸载、对象发生变化),接收到此事件后重新生成graphql schema
238
233
  "$packages.changed": {
239
234
  params: {},
240
235
  async handler(ctx) {
241
- if(broker.nodeID != 'steedos-primary'){
242
- return ;
236
+ // console.log("Payload:", ctx.params);
237
+ // console.log("Sender:", ctx.nodeID);
238
+ // console.log("Metadata:", ctx.meta);
239
+ // console.log("The called event name:", ctx.eventName);
240
+
241
+ const objGraphqlMap = await this.generateObjGraphqlMap(this.name)
242
+
243
+ let type = []
244
+ let query = []
245
+ let mutation = []
246
+ let resolvers = {}
247
+ let resolversQuery = {}
248
+ let resolversMutation = {}
249
+
250
+ for (const objectName in objGraphqlMap) {
251
+ if (Object.hasOwnProperty.call(objGraphqlMap, objectName)) {
252
+ const gMap = objGraphqlMap[objectName];
253
+ type.push(gMap.type)
254
+ query = query.concat(gMap.query)
255
+ mutation = mutation.concat(gMap.mutation)
256
+ resolvers = Object.assign(resolvers, gMap.resolvers)
257
+ resolversQuery = Object.assign(resolversQuery, gMap.resolversQuery)
258
+ resolversMutation = Object.assign(resolversMutation, gMap.resolversMutation)
259
+ }
243
260
  }
244
- if(this.setTimeoutId){
245
- clearTimeout(this.setTimeoutId);
246
- this.setTimeoutId = null;
261
+
262
+ this.globalGraphQLSettings = {
263
+ type: type,
264
+ query: query,
265
+ mutation: mutation,
266
+ resolvers: {
267
+ ...resolvers,
268
+ Query: resolversQuery,
269
+ Mutation: resolversMutation
270
+ }
247
271
  }
248
- this.setTimeoutId = setTimeout(async ()=>{
249
- // console.log("Payload:", ctx.params);
250
- // console.log("Sender:", ctx.nodeID);
251
- // console.log("Metadata:", ctx.meta);
252
- // console.log("The called event name:", ctx.eventName);
253
- console.log(`[service][graphql]===> generateObjGraphqlMap ${this.name} start`)
254
- const s = new Date();
255
- const objGraphqlMap = await this.generateObjGraphqlMap(this.name)
256
- console.log(`[service][graphql]==1=> generateObjGraphqlMap ${this.name} 耗时:`, new Date() - s, 'ms')
257
- let type = []
258
- let query = []
259
- let mutation = []
260
- let resolvers = {}
261
- let resolversQuery = {}
262
- let resolversMutation = {}
263
-
264
- for (const objectName in objGraphqlMap) {
265
- if (Object.hasOwnProperty.call(objGraphqlMap, objectName)) {
266
- const gMap = objGraphqlMap[objectName];
267
- type.push(gMap.type)
268
- query = query.concat(gMap.query)
269
- mutation = mutation.concat(gMap.mutation)
270
- resolvers = Object.assign(resolvers, gMap.resolvers)
271
- resolversQuery = Object.assign(resolversQuery, gMap.resolversQuery)
272
- resolversMutation = Object.assign(resolversMutation, gMap.resolversMutation)
273
- }
272
+
273
+ // console.log('graphql:', new Date())
274
+ // console.log(JSON.stringify(query, null, 2))
275
+
276
+ // 发送事件,通知ApolloService重新加载graphql schema
277
+ ctx.emit('$services.changed');
278
+
279
+ if (!this.projectStarted) {
280
+ this.projectStarted = true
281
+ // 开发环境, 显示耗时
282
+ if(process.env.NODE_ENV == 'development' && global.__startDate){
283
+ console.log('耗时: ' + (new Date().getTime() - global.__startDate.getTime()) + ' ms');
274
284
  }
275
- console.log(`[service][graphql]==2=> generateObjGraphqlMap ${this.name} 耗时:`, new Date() - s, 'ms')
276
- const globalGraphQLSettings = {
277
- type: type,
278
- query: query,
279
- mutation: mutation,
280
- resolvers: {
281
- ...resolvers,
282
- Query: resolversQuery,
283
- Mutation: resolversMutation
285
+ console.log(`Project is running at ${process.env.ROOT_URL}`);
286
+ console.log('');
287
+ if (process.env.STEEDOS_AUTO_OPEN_BROWSER != 'false') { // 默认打开,如果不想打开,设置STEEDOS_AUTO_OPEN_BROWSER=false
288
+ try {
289
+ open(process.env.ROOT_URL);
290
+ } catch (error) {
291
+ console.error(error);
292
+ console.error('auto open browser failed.');
284
293
  }
285
294
  }
286
- console.log(`graphql.schema.changed=============`)
287
- await Register.add(ctx.broker, {key: 'globalGraphQLSettings', data: globalGraphQLSettings}, {})
288
- ctx.broker.broadcast("graphql.schema.changed")
289
-
290
- }, 1000 * 3)
295
+ }
291
296
  }
292
297
  }
293
298
  },
@@ -296,14 +301,7 @@ module.exports = {
296
301
  * Methods
297
302
  */
298
303
  methods: {
299
- async ChangeGlobalGraphQLSettings() {
300
- const result = await Register.get(this.broker, 'globalGraphQLSettings');
301
- if(result){
302
- this.globalGraphQLSettings = result.metadata;
303
- // 发送事件,通知ApolloService重新加载graphql schema; api 服务和graphql服务在同一个节点上.
304
- this.broker.broadcastLocal('$services.changed');
305
- }
306
- },
304
+
307
305
  find: {
308
306
  async handler(objectName, query, userSession) {
309
307
  const obj = this.getObject(objectName)
@@ -349,90 +347,84 @@ module.exports = {
349
347
 
350
348
  async generateObjGraphqlMap(graphqlServiceName) {
351
349
  const objGraphqlMap = {}
352
- console.time('generateObjGraphqlMap===>objects.getAll')
353
350
  const objectConfigs = await this.broker.call("objects.getAll");
354
- console.timeEnd('generateObjGraphqlMap===>objects.getAll')
355
351
  for (const object of objectConfigs) {
356
- try {
357
- // console.log('===>object.metadata.name: ', object.metadata.name)
358
- const objectConfig = object.metadata
359
- const objectName = objectConfig.name
360
- // 排除 __MONGO_BASE_OBJECT __SQL_BASE_OBJECT
361
- if (['__MONGO_BASE_OBJECT', '__SQL_BASE_OBJECT'].includes(objectName)) {
362
- continue
363
- }
364
- /**
365
- * objGraphqlMap[objectName] 结构
366
- {
367
- type: "",
368
- resolvers: {
369
- [objectName]: {
370
- [`${name}${EXPAND_SUFFIX}`]: {},
371
- [relatedFieldName]: {},
372
- [DISPLAY_PREFIX]: {},
373
- [UI_PREFIX]: {},
374
- [PERMISSIONS_PREFIX]: {},
375
- [`${RELATED_PREFIX}_files`]: {},
376
- [`${RELATED_PREFIX}_tasks`]: {},
377
- [`${RELATED_PREFIX}_notes`]: {},
378
- [`${RELATED_PREFIX}_events`]: {},
379
- [`${RELATED_PREFIX}_audit_records`]: {},
380
- [`${RELATED_PREFIX}_instances`]: {},
381
- [`${RELATED_PREFIX}_approvals`]: {}
382
- }
383
- },
384
- query: [],
385
- resolversQuery: {
386
- [objectName]: { action: 'find' },
387
- [`${objectName}__count`]: { action: 'count' },
388
- [`${objectName}__findOne`]: { action: 'findOne' }
389
- },
390
- mutation: [],
391
- resolversMutation: {
392
- [`${objectName}__insert`]: { action: 'insert' },
393
- [`${objectName}__update`]: { action: 'update' },
394
- [`${objectName}__delete`]: { action: 'delete' }
352
+ // console.log('===>object.metadata.name: ', object.metadata.name)
353
+ const objectConfig = object.metadata
354
+ const objectName = objectConfig.name
355
+ // 排除 __MONGO_BASE_OBJECT __SQL_BASE_OBJECT
356
+ if (['__MONGO_BASE_OBJECT', '__SQL_BASE_OBJECT'].includes(objectName)) {
357
+ continue
358
+ }
359
+ /**
360
+ * objGraphqlMap[objectName] 结构
361
+ {
362
+ type: "",
363
+ resolvers: {
364
+ [objectName]: {
365
+ [`${name}${EXPAND_SUFFIX}`]: {},
366
+ [relatedFieldName]: {},
367
+ [DISPLAY_PREFIX]: {},
368
+ [UI_PREFIX]: {},
369
+ [PERMISSIONS_PREFIX]: {},
370
+ [`${RELATED_PREFIX}_files`]: {},
371
+ [`${RELATED_PREFIX}_tasks`]: {},
372
+ [`${RELATED_PREFIX}_notes`]: {},
373
+ [`${RELATED_PREFIX}_events`]: {},
374
+ [`${RELATED_PREFIX}_audit_records`]: {},
375
+ [`${RELATED_PREFIX}_instances`]: {},
376
+ [`${RELATED_PREFIX}_approvals`]: {}
395
377
  }
378
+ },
379
+ query: [],
380
+ resolversQuery: {
381
+ [objectName]: { action: 'find' },
382
+ [`${objectName}__count`]: { action: 'count' },
383
+ [`${objectName}__findOne`]: { action: 'findOne' }
384
+ },
385
+ mutation: [],
386
+ resolversMutation: {
387
+ [`${objectName}__insert`]: { action: 'insert' },
388
+ [`${objectName}__update`]: { action: 'update' },
389
+ [`${objectName}__delete`]: { action: 'delete' }
396
390
  }
397
- */
398
- const gMap = {}
391
+ }
392
+ */
393
+ const gMap = {}
399
394
 
400
- const typeAndResolves = await generateSettingsGraphql(objectConfig, graphqlServiceName)
395
+ const typeAndResolves = await generateSettingsGraphql(objectConfig, graphqlServiceName)
401
396
 
402
- gMap.type = typeAndResolves.type
403
- gMap.resolvers = typeAndResolves.resolvers
397
+ gMap.type = typeAndResolves.type
398
+ gMap.resolvers = typeAndResolves.resolvers
404
399
 
405
- if (objectName == 'users') {
406
- objGraphqlMap[objectName] = gMap
407
- continue
408
- }
409
- gMap.query = []
410
- gMap.resolversQuery = {}
411
- gMap.mutation = []
412
- gMap.resolversMutation = {}
400
+ if (objectName == 'users') {
401
+ objGraphqlMap[objectName] = gMap
402
+ continue
403
+ }
404
+ gMap.query = []
405
+ gMap.resolversQuery = {}
406
+ gMap.mutation = []
407
+ gMap.resolversMutation = {}
413
408
 
414
- gMap.query.push(generateActionGraphqlProp('find', objectConfig))
415
- gMap.resolversQuery[objectName] = { action: 'find' }
409
+ gMap.query.push(generateActionGraphqlProp('find', objectConfig))
410
+ gMap.resolversQuery[objectName] = { action: 'find' }
416
411
 
417
- gMap.query.push(generateActionGraphqlProp('count', objectConfig))
418
- gMap.resolversQuery[`${objectName}__count`] = { action: 'count' }
412
+ gMap.query.push(generateActionGraphqlProp('count', objectConfig))
413
+ gMap.resolversQuery[`${objectName}__count`] = { action: 'count' }
419
414
 
420
- gMap.query.push(generateActionGraphqlProp('findOne', objectConfig))
421
- gMap.resolversQuery[`${objectName}__findOne`] = { action: 'findOne' }
415
+ gMap.query.push(generateActionGraphqlProp('findOne', objectConfig))
416
+ gMap.resolversQuery[`${objectName}__findOne`] = { action: 'findOne' }
422
417
 
423
- gMap.mutation.push(generateActionGraphqlProp('insert', objectConfig))
424
- gMap.resolversMutation[`${objectName}__insert`] = { action: 'insert' }
418
+ gMap.mutation.push(generateActionGraphqlProp('insert', objectConfig))
419
+ gMap.resolversMutation[`${objectName}__insert`] = { action: 'insert' }
425
420
 
426
- gMap.mutation.push(generateActionGraphqlProp('update', objectConfig))
427
- gMap.resolversMutation[`${objectName}__update`] = { action: 'update' }
421
+ gMap.mutation.push(generateActionGraphqlProp('update', objectConfig))
422
+ gMap.resolversMutation[`${objectName}__update`] = { action: 'update' }
428
423
 
429
- gMap.mutation.push(generateActionGraphqlProp('delete', objectConfig))
430
- gMap.resolversMutation[`${objectName}__delete`] = { action: 'delete' }
424
+ gMap.mutation.push(generateActionGraphqlProp('delete', objectConfig))
425
+ gMap.resolversMutation[`${objectName}__delete`] = { action: 'delete' }
431
426
 
432
- objGraphqlMap[objectName] = gMap
433
- } catch (error) {
434
- console.error(`error`, error)
435
- }
427
+ objGraphqlMap[objectName] = gMap
436
428
  };
437
429
 
438
430
  return objGraphqlMap
@@ -477,8 +469,43 @@ module.exports = {
477
469
  * Service started lifecycle event handler
478
470
  */
479
471
  async started() {
480
- await this.ChangeGlobalGraphQLSettings()
481
- console.log('=============> service-object0-graphql started')
472
+ // const that = this;
473
+ // setTimeout(async function () {
474
+ // const objGraphqlMap = await that.generateObjGraphqlMap(that.name)
475
+
476
+ // let globalTypeDefs = []
477
+ // let query = []
478
+ // let mutation = []
479
+ // let resolvers = {}
480
+ // let resolversQuery = {}
481
+ // let resolversMutation = {}
482
+
483
+ // for (const objectName in objGraphqlMap) {
484
+ // if (Object.hasOwnProperty.call(objGraphqlMap, objectName)) {
485
+ // const gMap = objGraphqlMap[objectName];
486
+ // globalTypeDefs.push(gMap.type)
487
+ // query = query.concat(gMap.query)
488
+ // mutation = mutation.concat(gMap.mutation)
489
+ // resolvers = Object.assign(resolvers, gMap.resolvers)
490
+ // resolversQuery = Object.assign(resolversQuery, gMap.resolversQuery)
491
+ // resolversMutation = Object.assign(resolversMutation, gMap.resolversMutation)
492
+ // }
493
+ // }
494
+
495
+ // that.globalTypeDefs = globalTypeDefs
496
+
497
+ // that.settings.graphql = {
498
+ // query: query,
499
+ // mutation: mutation,
500
+ // resolvers: {
501
+ // ...resolvers,
502
+ // Query: resolversQuery,
503
+ // Mutation: resolversMutation
504
+ // }
505
+ // }
506
+
507
+ // console.log('graphql:', new Date())
508
+ // }, 20000)
482
509
  },
483
510
 
484
511
  /**