@steedos/service-object-graphql 2.5.3-beta.11 → 2.5.3-beta.12

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 +135 -162
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steedos/service-object-graphql",
3
- "version": "2.5.3-beta.11",
3
+ "version": "2.5.3-beta.12",
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": "90a5790974f858323e534c321f96643da576d260",
18
+ "gitHead": "79e9dfbd0bf19a0979f29d2a055cf6e2ea847997",
19
19
  "dependencies": {
20
- "@steedos/filters": "2.5.3-beta.11",
21
- "@steedos/i18n": "2.5.3-beta.11",
22
- "@steedos/objectql": "2.5.3-beta.11",
23
- "@steedos/service-object-mixin": "2.5.3-beta.11",
20
+ "@steedos/filters": "2.5.3-beta.12",
21
+ "@steedos/i18n": "2.5.3-beta.12",
22
+ "@steedos/objectql": "2.5.3-beta.12",
23
+ "@steedos/service-object-mixin": "2.5.3-beta.12",
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: sunhaolin@hotoa.com
5
- * @LastEditTime: 2023-06-06 11:03:12
4
+ * @LastEditors: baozhoutao@steedos.com
5
+ * @LastEditTime: 2023-06-09 15:52:01
6
6
  * @Description:
7
7
  */
8
8
 
@@ -14,7 +14,6 @@ const {
14
14
  getGraphqlActions,
15
15
  getQueryFields
16
16
  } = require('./lib');
17
- const open = require('open');
18
17
 
19
18
  const { formatFiltersToODataQuery } = require("@steedos/filters");
20
19
 
@@ -22,6 +21,8 @@ const serviceObjectMixin = require('@steedos/service-object-mixin');
22
21
 
23
22
  const { QUERY_DOCS_TOP } = require('./lib/consts');
24
23
 
24
+ const { Register } = require('@steedos/metadata-registrar')
25
+
25
26
  /**
26
27
  * @typedef {import('moleculer').Context} Context Moleculer's Context
27
28
  */
@@ -33,8 +34,6 @@ module.exports = {
33
34
  globalGraphQLSettings: {}, // service-api 里generateGraphQLSchema使用
34
35
  getGraphqlFields: getQueryFields,
35
36
 
36
- projectStarted: false,
37
-
38
37
  /**
39
38
  * Settings
40
39
  */
@@ -229,70 +228,66 @@ module.exports = {
229
228
  * Events
230
229
  */
231
230
  events: {
231
+ "graphql.schema.changed": {
232
+ params: {},
233
+ async handler(ctx) {
234
+ await this.ChangeGlobalGraphQLSettings()
235
+ }
236
+ },
232
237
  // 此事件表示软件包发生变化(包括加载、卸载、对象发生变化),接收到此事件后重新生成graphql schema
233
238
  "$packages.changed": {
234
239
  params: {},
235
240
  async handler(ctx) {
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
- }
241
+ if(broker.nodeID != 'steedos-primary'){
242
+ return ;
260
243
  }
261
-
262
- this.globalGraphQLSettings = {
263
- type: type,
264
- query: query,
265
- mutation: mutation,
266
- resolvers: {
267
- ...resolvers,
268
- Query: resolversQuery,
269
- Mutation: resolversMutation
270
- }
244
+ if(this.setTimeoutId){
245
+ clearTimeout(this.setTimeoutId);
246
+ this.setTimeoutId = null;
271
247
  }
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');
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
+ }
284
274
  }
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.');
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
293
284
  }
294
285
  }
295
- }
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)
296
291
  }
297
292
  }
298
293
  },
@@ -301,7 +296,14 @@ module.exports = {
301
296
  * Methods
302
297
  */
303
298
  methods: {
304
-
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
+ },
305
307
  find: {
306
308
  async handler(objectName, query, userSession) {
307
309
  const obj = this.getObject(objectName)
@@ -347,84 +349,90 @@ module.exports = {
347
349
 
348
350
  async generateObjGraphqlMap(graphqlServiceName) {
349
351
  const objGraphqlMap = {}
352
+ console.time('generateObjGraphqlMap===>objects.getAll')
350
353
  const objectConfigs = await this.broker.call("objects.getAll");
354
+ console.timeEnd('generateObjGraphqlMap===>objects.getAll')
351
355
  for (const object of objectConfigs) {
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`]: {}
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' }
377
395
  }
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' }
390
396
  }
391
- }
392
- */
393
- const gMap = {}
397
+ */
398
+ const gMap = {}
394
399
 
395
- const typeAndResolves = await generateSettingsGraphql(objectConfig, graphqlServiceName)
400
+ const typeAndResolves = await generateSettingsGraphql(objectConfig, graphqlServiceName)
396
401
 
397
- gMap.type = typeAndResolves.type
398
- gMap.resolvers = typeAndResolves.resolvers
402
+ gMap.type = typeAndResolves.type
403
+ gMap.resolvers = typeAndResolves.resolvers
399
404
 
400
- if (objectName == 'users') {
401
- objGraphqlMap[objectName] = gMap
402
- continue
403
- }
404
- gMap.query = []
405
- gMap.resolversQuery = {}
406
- gMap.mutation = []
407
- gMap.resolversMutation = {}
405
+ if (objectName == 'users') {
406
+ objGraphqlMap[objectName] = gMap
407
+ continue
408
+ }
409
+ gMap.query = []
410
+ gMap.resolversQuery = {}
411
+ gMap.mutation = []
412
+ gMap.resolversMutation = {}
408
413
 
409
- gMap.query.push(generateActionGraphqlProp('find', objectConfig))
410
- gMap.resolversQuery[objectName] = { action: 'find' }
414
+ gMap.query.push(generateActionGraphqlProp('find', objectConfig))
415
+ gMap.resolversQuery[objectName] = { action: 'find' }
411
416
 
412
- gMap.query.push(generateActionGraphqlProp('count', objectConfig))
413
- gMap.resolversQuery[`${objectName}__count`] = { action: 'count' }
417
+ gMap.query.push(generateActionGraphqlProp('count', objectConfig))
418
+ gMap.resolversQuery[`${objectName}__count`] = { action: 'count' }
414
419
 
415
- gMap.query.push(generateActionGraphqlProp('findOne', objectConfig))
416
- gMap.resolversQuery[`${objectName}__findOne`] = { action: 'findOne' }
420
+ gMap.query.push(generateActionGraphqlProp('findOne', objectConfig))
421
+ gMap.resolversQuery[`${objectName}__findOne`] = { action: 'findOne' }
417
422
 
418
- gMap.mutation.push(generateActionGraphqlProp('insert', objectConfig))
419
- gMap.resolversMutation[`${objectName}__insert`] = { action: 'insert' }
423
+ gMap.mutation.push(generateActionGraphqlProp('insert', objectConfig))
424
+ gMap.resolversMutation[`${objectName}__insert`] = { action: 'insert' }
420
425
 
421
- gMap.mutation.push(generateActionGraphqlProp('update', objectConfig))
422
- gMap.resolversMutation[`${objectName}__update`] = { action: 'update' }
426
+ gMap.mutation.push(generateActionGraphqlProp('update', objectConfig))
427
+ gMap.resolversMutation[`${objectName}__update`] = { action: 'update' }
423
428
 
424
- gMap.mutation.push(generateActionGraphqlProp('delete', objectConfig))
425
- gMap.resolversMutation[`${objectName}__delete`] = { action: 'delete' }
429
+ gMap.mutation.push(generateActionGraphqlProp('delete', objectConfig))
430
+ gMap.resolversMutation[`${objectName}__delete`] = { action: 'delete' }
426
431
 
427
- objGraphqlMap[objectName] = gMap
432
+ objGraphqlMap[objectName] = gMap
433
+ } catch (error) {
434
+ console.error(`error`, error)
435
+ }
428
436
  };
429
437
 
430
438
  return objGraphqlMap
@@ -469,43 +477,8 @@ module.exports = {
469
477
  * Service started lifecycle event handler
470
478
  */
471
479
  async 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)
480
+ await this.ChangeGlobalGraphQLSettings()
481
+ console.log('=============> service-object0-graphql started')
509
482
  },
510
483
 
511
484
  /**