@steedos/service-object-graphql 2.5.3-beta.21 → 2.5.3-beta.23

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 -127
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steedos/service-object-graphql",
3
- "version": "2.5.3-beta.21",
3
+ "version": "2.5.3-beta.23",
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": "b4313a2ef5d18ef1cf9271bd3c89b2d6fe52d65b",
18
+ "gitHead": "8fd9cf35d29f8f71e11790bd010bf5b045e7ebc4",
19
19
  "dependencies": {
20
- "@steedos/filters": "2.5.3-beta.21",
21
- "@steedos/i18n": "2.5.3-beta.21",
22
- "@steedos/objectql": "2.5.3-beta.21",
23
- "@steedos/service-object-mixin": "2.5.3-beta.21",
20
+ "@steedos/filters": "2.5.3-beta.23",
21
+ "@steedos/i18n": "2.5.3-beta.23",
22
+ "@steedos/objectql": "2.5.3-beta.23",
23
+ "@steedos/service-object-mixin": "2.5.3-beta.23",
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-13 17:57:34
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,61 +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
- const objGraphqlMap = await this.generateObjGraphqlMap(this.name)
254
- let type = []
255
- let query = []
256
- let mutation = []
257
- let resolvers = {}
258
- let resolversQuery = {}
259
- let resolversMutation = {}
260
-
261
- for (const objectName in objGraphqlMap) {
262
- if (Object.hasOwnProperty.call(objGraphqlMap, objectName)) {
263
- const gMap = objGraphqlMap[objectName];
264
- type.push(gMap.type)
265
- query = query.concat(gMap.query)
266
- mutation = mutation.concat(gMap.mutation)
267
- resolvers = Object.assign(resolvers, gMap.resolvers)
268
- resolversQuery = Object.assign(resolversQuery, gMap.resolversQuery)
269
- resolversMutation = Object.assign(resolversMutation, gMap.resolversMutation)
270
- }
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');
271
284
  }
272
- const globalGraphQLSettings = {
273
- type: type,
274
- query: query,
275
- mutation: mutation,
276
- resolvers: {
277
- ...resolvers,
278
- Query: resolversQuery,
279
- 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.');
280
293
  }
281
294
  }
282
- await Register.add(ctx.broker, {key: 'globalGraphQLSettings', data: globalGraphQLSettings}, {})
283
- ctx.broker.broadcast("graphql.schema.changed")
284
-
285
- }, 1000 * 2)
295
+ }
286
296
  }
287
297
  }
288
298
  },
@@ -291,14 +301,7 @@ module.exports = {
291
301
  * Methods
292
302
  */
293
303
  methods: {
294
- async ChangeGlobalGraphQLSettings() {
295
- const result = await Register.get(this.broker, 'globalGraphQLSettings');
296
- if(result){
297
- this.globalGraphQLSettings = result.metadata;
298
- // 发送事件,通知ApolloService重新加载graphql schema; api 服务和graphql服务在同一个节点上.
299
- this.broker.broadcastLocal('$services.changed');
300
- }
301
- },
304
+
302
305
  find: {
303
306
  async handler(objectName, query, userSession) {
304
307
  const obj = this.getObject(objectName)
@@ -346,86 +349,82 @@ module.exports = {
346
349
  const objGraphqlMap = {}
347
350
  const objectConfigs = await this.broker.call("objects.getAll");
348
351
  for (const object of objectConfigs) {
349
- try {
350
- // console.log('===>object.metadata.name: ', object.metadata.name)
351
- const objectConfig = object.metadata
352
- const objectName = objectConfig.name
353
- // 排除 __MONGO_BASE_OBJECT __SQL_BASE_OBJECT
354
- if (['__MONGO_BASE_OBJECT', '__SQL_BASE_OBJECT'].includes(objectName)) {
355
- continue
356
- }
357
- /**
358
- * objGraphqlMap[objectName] 结构
359
- {
360
- type: "",
361
- resolvers: {
362
- [objectName]: {
363
- [`${name}${EXPAND_SUFFIX}`]: {},
364
- [relatedFieldName]: {},
365
- [DISPLAY_PREFIX]: {},
366
- [UI_PREFIX]: {},
367
- [PERMISSIONS_PREFIX]: {},
368
- [`${RELATED_PREFIX}_files`]: {},
369
- [`${RELATED_PREFIX}_tasks`]: {},
370
- [`${RELATED_PREFIX}_notes`]: {},
371
- [`${RELATED_PREFIX}_events`]: {},
372
- [`${RELATED_PREFIX}_audit_records`]: {},
373
- [`${RELATED_PREFIX}_instances`]: {},
374
- [`${RELATED_PREFIX}_approvals`]: {}
375
- }
376
- },
377
- query: [],
378
- resolversQuery: {
379
- [objectName]: { action: 'find' },
380
- [`${objectName}__count`]: { action: 'count' },
381
- [`${objectName}__findOne`]: { action: 'findOne' }
382
- },
383
- mutation: [],
384
- resolversMutation: {
385
- [`${objectName}__insert`]: { action: 'insert' },
386
- [`${objectName}__update`]: { action: 'update' },
387
- [`${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`]: {}
388
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' }
389
390
  }
390
- */
391
- const gMap = {}
391
+ }
392
+ */
393
+ const gMap = {}
392
394
 
393
- const typeAndResolves = await generateSettingsGraphql(objectConfig, graphqlServiceName)
395
+ const typeAndResolves = await generateSettingsGraphql(objectConfig, graphqlServiceName)
394
396
 
395
- gMap.type = typeAndResolves.type
396
- gMap.resolvers = typeAndResolves.resolvers
397
+ gMap.type = typeAndResolves.type
398
+ gMap.resolvers = typeAndResolves.resolvers
397
399
 
398
- if (objectName == 'users') {
399
- objGraphqlMap[objectName] = gMap
400
- continue
401
- }
402
- gMap.query = []
403
- gMap.resolversQuery = {}
404
- gMap.mutation = []
405
- 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 = {}
406
408
 
407
- gMap.query.push(generateActionGraphqlProp('find', objectConfig))
408
- gMap.resolversQuery[objectName] = { action: 'find' }
409
+ gMap.query.push(generateActionGraphqlProp('find', objectConfig))
410
+ gMap.resolversQuery[objectName] = { action: 'find' }
409
411
 
410
- gMap.query.push(generateActionGraphqlProp('count', objectConfig))
411
- gMap.resolversQuery[`${objectName}__count`] = { action: 'count' }
412
+ gMap.query.push(generateActionGraphqlProp('count', objectConfig))
413
+ gMap.resolversQuery[`${objectName}__count`] = { action: 'count' }
412
414
 
413
- gMap.query.push(generateActionGraphqlProp('findOne', objectConfig))
414
- gMap.resolversQuery[`${objectName}__findOne`] = { action: 'findOne' }
415
+ gMap.query.push(generateActionGraphqlProp('findOne', objectConfig))
416
+ gMap.resolversQuery[`${objectName}__findOne`] = { action: 'findOne' }
415
417
 
416
- gMap.mutation.push(generateActionGraphqlProp('insert', objectConfig))
417
- gMap.resolversMutation[`${objectName}__insert`] = { action: 'insert' }
418
+ gMap.mutation.push(generateActionGraphqlProp('insert', objectConfig))
419
+ gMap.resolversMutation[`${objectName}__insert`] = { action: 'insert' }
418
420
 
419
- gMap.mutation.push(generateActionGraphqlProp('update', objectConfig))
420
- gMap.resolversMutation[`${objectName}__update`] = { action: 'update' }
421
+ gMap.mutation.push(generateActionGraphqlProp('update', objectConfig))
422
+ gMap.resolversMutation[`${objectName}__update`] = { action: 'update' }
421
423
 
422
- gMap.mutation.push(generateActionGraphqlProp('delete', objectConfig))
423
- gMap.resolversMutation[`${objectName}__delete`] = { action: 'delete' }
424
+ gMap.mutation.push(generateActionGraphqlProp('delete', objectConfig))
425
+ gMap.resolversMutation[`${objectName}__delete`] = { action: 'delete' }
424
426
 
425
- objGraphqlMap[objectName] = gMap
426
- } catch (error) {
427
- console.error(`error`, error)
428
- }
427
+ objGraphqlMap[objectName] = gMap
429
428
  };
430
429
 
431
430
  return objGraphqlMap
@@ -470,7 +469,43 @@ module.exports = {
470
469
  * Service started lifecycle event handler
471
470
  */
472
471
  async started() {
473
- await this.ChangeGlobalGraphQLSettings()
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)
474
509
  },
475
510
 
476
511
  /**