@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.
- package/package.json +6 -6
- 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.
|
|
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": "
|
|
18
|
+
"gitHead": "8fd9cf35d29f8f71e11790bd010bf5b045e7ebc4",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@steedos/filters": "2.5.3-beta.
|
|
21
|
-
"@steedos/i18n": "2.5.3-beta.
|
|
22
|
-
"@steedos/objectql": "2.5.3-beta.
|
|
23
|
-
"@steedos/service-object-mixin": "2.5.3-beta.
|
|
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",
|
package/package.service.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* @Author: sunhaolin@hotoa.com
|
|
3
3
|
* @Date: 2023-03-23 15:12:14
|
|
4
|
-
* @LastEditors:
|
|
5
|
-
* @LastEditTime: 2023-06-
|
|
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
|
-
|
|
242
|
-
|
|
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
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
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
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
[
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
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
|
-
|
|
391
|
+
}
|
|
392
|
+
*/
|
|
393
|
+
const gMap = {}
|
|
392
394
|
|
|
393
|
-
|
|
395
|
+
const typeAndResolves = await generateSettingsGraphql(objectConfig, graphqlServiceName)
|
|
394
396
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
+
gMap.type = typeAndResolves.type
|
|
398
|
+
gMap.resolvers = typeAndResolves.resolvers
|
|
397
399
|
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
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
|
-
|
|
408
|
-
|
|
409
|
+
gMap.query.push(generateActionGraphqlProp('find', objectConfig))
|
|
410
|
+
gMap.resolversQuery[objectName] = { action: 'find' }
|
|
409
411
|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
+
gMap.query.push(generateActionGraphqlProp('count', objectConfig))
|
|
413
|
+
gMap.resolversQuery[`${objectName}__count`] = { action: 'count' }
|
|
412
414
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
+
gMap.query.push(generateActionGraphqlProp('findOne', objectConfig))
|
|
416
|
+
gMap.resolversQuery[`${objectName}__findOne`] = { action: 'findOne' }
|
|
415
417
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
+
gMap.mutation.push(generateActionGraphqlProp('insert', objectConfig))
|
|
419
|
+
gMap.resolversMutation[`${objectName}__insert`] = { action: 'insert' }
|
|
418
420
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
+
gMap.mutation.push(generateActionGraphqlProp('update', objectConfig))
|
|
422
|
+
gMap.resolversMutation[`${objectName}__update`] = { action: 'update' }
|
|
421
423
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
+
gMap.mutation.push(generateActionGraphqlProp('delete', objectConfig))
|
|
425
|
+
gMap.resolversMutation[`${objectName}__delete`] = { action: 'delete' }
|
|
424
426
|
|
|
425
|
-
|
|
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
|
-
|
|
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
|
/**
|