@steedos/objectql 2.2.44 → 2.2.45

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 (36) hide show
  1. package/lib/driver/mongo.js +3 -3
  2. package/lib/driver/mongo.js.map +1 -1
  3. package/lib/dynamic-load/client_script.d.ts +3 -0
  4. package/lib/dynamic-load/client_script.js +65 -0
  5. package/lib/dynamic-load/client_script.js.map +1 -0
  6. package/lib/dynamic-load/index.d.ts +1 -0
  7. package/lib/dynamic-load/index.js +1 -0
  8. package/lib/dynamic-load/index.js.map +1 -1
  9. package/lib/services/helpers/graphql/getQueryFields.d.ts +2 -0
  10. package/lib/services/helpers/graphql/getQueryFields.js +15 -0
  11. package/lib/services/helpers/graphql/getQueryFields.js.map +1 -0
  12. package/lib/services/helpers/{graphql.d.ts → graphql/index.d.ts} +2 -1
  13. package/lib/services/helpers/{graphql.js → graphql/index.js} +51 -14
  14. package/lib/services/helpers/graphql/index.js.map +1 -0
  15. package/lib/services/objectService.js +21 -14
  16. package/lib/services/objectService.js.map +1 -1
  17. package/lib/types/config.js +2 -1
  18. package/lib/types/config.js.map +1 -1
  19. package/lib/types/object_dynamic_load.d.ts +1 -1
  20. package/lib/types/object_dynamic_load.js +3 -3
  21. package/lib/types/object_dynamic_load.js.map +1 -1
  22. package/package.json +14 -12
  23. package/src/driver/mongo.ts +1 -1
  24. package/src/dynamic-load/client_script.ts +65 -0
  25. package/src/dynamic-load/index.ts +1 -0
  26. package/src/services/helpers/graphql/getQueryFields.ts +31 -0
  27. package/src/services/helpers/graphql/index.ts +682 -0
  28. package/src/services/objectService.ts +61 -42
  29. package/src/types/config.ts +3 -2
  30. package/src/types/object_dynamic_load.ts +1 -1
  31. package/lib/services/helpers/graphql.js.map +0 -1
  32. package/lib/services/helpers/index.d.ts +0 -2
  33. package/lib/services/helpers/index.js +0 -6
  34. package/lib/services/helpers/index.js.map +0 -1
  35. package/src/services/helpers/graphql.ts +0 -643
  36. package/src/services/helpers/index.ts +0 -2
@@ -0,0 +1,682 @@
1
+ /*
2
+ * @Author: sunhaolin@hotoa.com
3
+ * @Date: 2022-06-15 15:49:44
4
+ * @LastEditors: sunhaolin@hotoa.com
5
+ * @LastEditTime: 2022-06-15 19:43:54
6
+ * @Description:
7
+ */
8
+
9
+ import _ = require("underscore");
10
+ import moment = require('moment');
11
+ import { getObjectServiceName } from "../..";
12
+ import { SteedosObjectTypeConfig } from "../../..";
13
+ // const clone = require("clone");
14
+ import { translationObject } from '@steedos/i18n';
15
+ const { moleculerGql: gql } = require("moleculer-apollo-server");
16
+ import { getSteedosSchema, getUserLocale } from '../../..';
17
+ import { getQueryFields } from "./getQueryFields";
18
+ const BASIC_TYPE_MAPPING = {
19
+ 'text': 'String',
20
+ 'textarea': 'String',
21
+ 'html': 'String',
22
+ 'url': 'String',
23
+ 'email': 'String',
24
+ 'date': 'Date',
25
+ 'datetime': 'Date',
26
+ 'time': 'Date',
27
+ 'number': 'Float',
28
+ 'currency': 'Float',
29
+ 'boolean': 'Boolean'
30
+ };
31
+ const EXPAND_SUFFIX = '__expand';
32
+ const DISPLAY_PREFIX = '_display';
33
+ export const RELATED_PREFIX = '_related';
34
+ const GRAPHQL_ACTION_PREFIX = 'graphql_';
35
+
36
+
37
+ export function generateActionGraphqlProp(actionName: string, objectConfig: SteedosObjectTypeConfig) {
38
+ let gplObj: any = {};
39
+ let objectName = objectConfig.name;
40
+ if (objectName == 'users') {
41
+ return gplObj;
42
+ }
43
+ switch (actionName) {
44
+ case 'graphqlCount':
45
+ gplObj.query = gql`
46
+ type Query {
47
+ ${objectName}__count(fields: JSON, filters: JSON, top: Int, skip: Int, sort: String): Int
48
+ }
49
+ `;
50
+ break;
51
+ case 'graphqlFind':
52
+ gplObj.query = gql`
53
+ type Query {
54
+ ${objectName}(fields: JSON, filters: JSON, top: Int, skip: Int, sort: String): [${objectName}]
55
+ }
56
+ `;
57
+ break;
58
+ case 'findOne':
59
+ gplObj.query = gql`
60
+ type Query {
61
+ ${objectName}__${actionName}(id: JSON): ${objectName}
62
+ }
63
+ `;
64
+ break;
65
+ case 'insert':
66
+ gplObj.mutation = gql`
67
+ type Mutation {
68
+ ${objectName}__${actionName}(doc: JSON): ${objectName}
69
+ }
70
+ `;
71
+ break;
72
+ case 'update':
73
+ gplObj.mutation = gql`
74
+ type Mutation {
75
+ ${objectName}__${actionName}(id: JSON, doc: JSON): ${objectName}
76
+ }
77
+ `;
78
+ break;
79
+ case 'delete':
80
+ gplObj.mutation = gql`
81
+ type Mutation {
82
+ ${objectName}__${actionName}(id: JSON): JSON
83
+ }
84
+ `;
85
+ break;
86
+ default:
87
+ // console.error(`need to handle action: ${actionName}`);
88
+ break;
89
+ }
90
+ // console.log(gplObj);
91
+ return gplObj;
92
+ }
93
+
94
+ export function generateSettingsGraphql(objectConfig: SteedosObjectTypeConfig) {
95
+ let objectName = objectConfig.name;
96
+ let fields = objectConfig.fields;
97
+ let type = `type ${objectName} { _id: String `;
98
+ if (_.has(fields, "_id")) {
99
+ type = `type ${objectName} { `;
100
+ }
101
+ let resolvers = {};
102
+ resolvers[objectName] = {};
103
+ _.each(fields, (field, name) => {
104
+ if (name.indexOf(".") > -1) {
105
+ return;
106
+ }
107
+ if (!field.type) {
108
+ // console.error(`The field ${name} of ${objectName} has no type property.`);
109
+ type += `${name}: JSON `;
110
+ return;
111
+ }
112
+ if (BASIC_TYPE_MAPPING[field.type]) {
113
+ type += `${name}: ${BASIC_TYPE_MAPPING[field.type]} `;
114
+ } else if (
115
+ (field.type == "lookup" || field.type == "master_detail") &&
116
+ field.reference_to &&
117
+ _.isString(field.reference_to)
118
+ ) {
119
+ let refTo = field.reference_to;
120
+ // 判断能否根据refTo找到对象,如果找到则说明对象已加载,否则return
121
+ let objMetaData = getLocalService(refTo);
122
+ if (refTo != objectName && (!objMetaData || objMetaData.settings.deleted)) {
123
+ return;
124
+ }
125
+ if (field.multiple) {
126
+ type += `${name}: [String] `;
127
+ type += `${name}${EXPAND_SUFFIX}: [${refTo}] `;
128
+ resolvers[objectName][`${name}${EXPAND_SUFFIX}`] = {
129
+ action: `${getObjectServiceName(
130
+ refTo
131
+ )}.${GRAPHQL_ACTION_PREFIX}${EXPAND_SUFFIX}_multiple`,
132
+ rootParams: {
133
+ [name]: "ids",
134
+ },
135
+ params: {
136
+ objectName: refTo,
137
+ },
138
+ };
139
+ } else {
140
+ type += `${name}: String `;
141
+ type += `${name}${EXPAND_SUFFIX}: ${refTo} `;
142
+ resolvers[objectName][`${name}${EXPAND_SUFFIX}`] = {
143
+ action: `${getObjectServiceName(
144
+ refTo
145
+ )}.${GRAPHQL_ACTION_PREFIX}${EXPAND_SUFFIX}`,
146
+ rootParams: {
147
+ [name]: "id",
148
+ },
149
+ params: {
150
+ objectName: refTo,
151
+ },
152
+ };
153
+ }
154
+ } else {
155
+ type += `${name}: JSON `;
156
+ }
157
+ });
158
+
159
+ // _display
160
+ let _display_type_name = `${DISPLAY_PREFIX}_${objectName}`;
161
+ type += `${DISPLAY_PREFIX}(fields: [String]): ${_display_type_name} `;
162
+ // resolvers[objectName][DISPLAY_PREFIX] = async function (parent, args, context, info) {
163
+ // let userSession = context.ctx.meta.user;
164
+ // return await translateToDisplay(objectName, fields, parent, userSession);
165
+ // }
166
+ resolvers[objectName][DISPLAY_PREFIX] = {
167
+ action: `${getObjectServiceName(
168
+ objectName
169
+ )}.${GRAPHQL_ACTION_PREFIX}${DISPLAY_PREFIX}`,
170
+ rootParams: {
171
+ _id: "_id",
172
+ },
173
+ params: {
174
+ objectName: objectName,
175
+ },
176
+ };
177
+ // define _display type
178
+ let _display_type = _getDisplayType(_display_type_name, fields);
179
+ type = gql`
180
+ ${_display_type}
181
+ ${type}
182
+ `;
183
+
184
+ // _related
185
+ if (objectConfig.enable_files) {
186
+ let relatedObjName = "cms_files";
187
+ let relatedFieldName = `${RELATED_PREFIX}_files`;
188
+ type += _getRelatedType(relatedFieldName, relatedObjName);
189
+ resolvers[objectName][
190
+ relatedFieldName
191
+ ] = _getRelatedResolverForEnableProperty(
192
+ objectName,
193
+ relatedObjName,
194
+ "parent"
195
+ );
196
+ }
197
+ if (objectConfig.enable_tasks) {
198
+ let relatedObjName = "tasks";
199
+ let relatedFieldName = `${RELATED_PREFIX}_${relatedObjName}`;
200
+ type += _getRelatedType(relatedFieldName, relatedObjName);
201
+ resolvers[objectName][
202
+ relatedFieldName
203
+ ] = _getRelatedResolverForEnableProperty(
204
+ objectName,
205
+ relatedObjName,
206
+ "related_to"
207
+ );
208
+ }
209
+ if (objectConfig.enable_notes) {
210
+ let relatedObjName = "notes";
211
+ let relatedFieldName = `${RELATED_PREFIX}_${relatedObjName}`;
212
+ type += _getRelatedType(relatedFieldName, relatedObjName);
213
+ resolvers[objectName][
214
+ relatedFieldName
215
+ ] = _getRelatedResolverForEnableProperty(
216
+ objectName,
217
+ relatedObjName,
218
+ "related_to"
219
+ );
220
+ }
221
+ if (objectConfig.enable_events) {
222
+ let relatedObjName = "events";
223
+ let relatedFieldName = `${RELATED_PREFIX}_${relatedObjName}`;
224
+ type += _getRelatedType(relatedFieldName, relatedObjName);
225
+ resolvers[objectName][
226
+ relatedFieldName
227
+ ] = _getRelatedResolverForEnableProperty(
228
+ objectName,
229
+ relatedObjName,
230
+ "related_to"
231
+ );
232
+ }
233
+ if (objectConfig.enable_audit) {
234
+ let relatedObjName = "audit_records";
235
+ let relatedFieldName = `${RELATED_PREFIX}_${relatedObjName}`;
236
+ type += _getRelatedType(relatedFieldName, relatedObjName);
237
+ resolvers[objectName][
238
+ relatedFieldName
239
+ ] = _getRelatedResolverForEnableProperty(
240
+ objectName,
241
+ relatedObjName,
242
+ "related_to"
243
+ );
244
+ }
245
+ if (objectConfig.enable_instances) {
246
+ let relatedObjName = "instances";
247
+ let relatedFieldName = `${RELATED_PREFIX}_${relatedObjName}`;
248
+ type += _getRelatedType(relatedFieldName, relatedObjName);
249
+ resolvers[objectName][
250
+ relatedFieldName
251
+ ] = _getRelatedResolverForEnableProperty(
252
+ objectName,
253
+ relatedObjName,
254
+ "record_ids"
255
+ );
256
+ }
257
+ if (objectConfig.enable_approvals) {
258
+ let relatedObjName = "approvals";
259
+ let relatedFieldName = `${RELATED_PREFIX}_${relatedObjName}`;
260
+ type += _getRelatedType(relatedFieldName, relatedObjName);
261
+ resolvers[objectName][
262
+ relatedFieldName
263
+ ] = _getRelatedResolverForEnableProperty(
264
+ objectName,
265
+ relatedObjName,
266
+ "related_to"
267
+ );
268
+ }
269
+
270
+ type += "}";
271
+ return {
272
+ type: type,
273
+ resolvers: resolvers,
274
+ };
275
+ }
276
+
277
+ export async function dealWithRelatedFields(
278
+ objectConfig: SteedosObjectTypeConfig,
279
+ graphql
280
+ ) {
281
+ let steedosSchema = getSteedosSchema();
282
+ let objectName = objectConfig.name;
283
+ let obj = steedosSchema.getObject(objectName);
284
+
285
+ const relationsInfo = await obj.getRelationsInfo();
286
+ let detailsInfo = relationsInfo.details || [];
287
+ let lookupsInfo = relationsInfo.lookup_details || [];
288
+
289
+ let relatedInfos = detailsInfo.concat(lookupsInfo);
290
+ for (const info of relatedInfos) {
291
+ if (!info.startsWith("__")) {
292
+ let infos = info.split(".");
293
+ let detailObjectApiName = infos[0];
294
+ let detailFieldName = infos[1];
295
+ let relatedFieldName = correctName(
296
+ `${RELATED_PREFIX}_${detailObjectApiName}_${detailFieldName}`
297
+ );
298
+ let relatedType = _getRelatedType(relatedFieldName, detailObjectApiName);
299
+ if (graphql.type.indexOf(relatedType) > -1) {
300
+ // 防止重复定义field
301
+ continue;
302
+ }
303
+ graphql.type =
304
+ graphql.type.substring(0, graphql.type.length - 1) + relatedType + "}";
305
+ graphql.resolvers[objectName][relatedFieldName] = getRelatedResolver(
306
+ objectName,
307
+ detailObjectApiName,
308
+ detailFieldName,
309
+ ""
310
+ );
311
+ }
312
+ }
313
+ }
314
+
315
+ export function correctName(name: string) {
316
+ return name.replace(/\./g, "_").replace(/\$/g, "_");
317
+ }
318
+
319
+ export function _getRelatedType(relatedFieldName, relatedObjName) {
320
+ return `${relatedFieldName}(fields: [String], filters: JSON, top: Int, skip: Int, sort: String): [${relatedObjName}] `;
321
+ }
322
+
323
+ export function getGraphqlActions(objectConfig: SteedosObjectTypeConfig) {
324
+ let actions = {};
325
+ let objName = objectConfig.name;
326
+
327
+ actions[`${GRAPHQL_ACTION_PREFIX}${EXPAND_SUFFIX}_multiple`] = {
328
+ handler: async function (ctx) {
329
+ let { ids, objectName } = ctx.params;
330
+ if (_.isEmpty(ids)) {
331
+ return null;
332
+ }
333
+ let filters = [["_id", "in", ids]];
334
+ const selector: any = { filters: filters };
335
+ let steedosSchema = getSteedosSchema();
336
+ let obj = steedosSchema.getObject(objectName);
337
+
338
+ const { resolveInfo } = ctx.meta;
339
+ const fieldNames = getQueryFields(resolveInfo);
340
+ if (!_.isEmpty(fieldNames)) {
341
+ selector.fields = fieldNames;
342
+ }
343
+
344
+ return obj.directFind(selector);
345
+ },
346
+ };
347
+ actions[`${GRAPHQL_ACTION_PREFIX}${EXPAND_SUFFIX}`] = {
348
+ handler: async function (ctx) {
349
+ let { id, objectName } = ctx.params;
350
+ if (!id) {
351
+ return;
352
+ }
353
+ let steedosSchema = getSteedosSchema();
354
+ let obj = steedosSchema.getObject(objectName);
355
+
356
+ const selector: any = { filters: [["_id", "=", id]] };
357
+ const { resolveInfo } = ctx.meta;
358
+ const fieldNames = getQueryFields(resolveInfo);
359
+ if (!_.isEmpty(fieldNames)) {
360
+ selector.fields = fieldNames;
361
+ }
362
+
363
+ return (await obj.directFind(selector))[0];
364
+ },
365
+ };
366
+
367
+ if (
368
+ [
369
+ "cms_files",
370
+ "tasks",
371
+ "notes",
372
+ "events",
373
+ "audit_records",
374
+ "instances",
375
+ "approvals",
376
+ ].includes(objName)
377
+ ) {
378
+ actions[`${GRAPHQL_ACTION_PREFIX}${RELATED_PREFIX}_enabled`] = {
379
+ handler: async function (ctx) {
380
+ let params = ctx.params;
381
+ let { _parentId, _related_params } = params;
382
+ let { objectName, parentObjectName, foreignKey } = _related_params;
383
+ let userSession = ctx.meta.user;
384
+ let steedosSchema = getSteedosSchema();
385
+ let object = steedosSchema.getObject(objectName);
386
+ let filters = [];
387
+ filters = [
388
+ [`${foreignKey}.o`, "=", parentObjectName],
389
+ [`${foreignKey}.ids`, "=", _parentId],
390
+ ];
391
+ if (params.filters) {
392
+ filters.push(params.filters);
393
+ }
394
+ params.filters = filters;
395
+ return await object.find(params, userSession);
396
+ },
397
+ };
398
+ }
399
+
400
+ actions[`${GRAPHQL_ACTION_PREFIX}${RELATED_PREFIX}`] = {
401
+ handler: async function (ctx) {
402
+ let params = ctx.params;
403
+ let { _parentId, _related_params } = params;
404
+ let {
405
+ objectName,
406
+ parentObjectName,
407
+ fieldName,
408
+ referenceToParentFieldName,
409
+ } = _related_params;
410
+ let userSession = ctx.meta.user;
411
+ let steedosSchema = getSteedosSchema();
412
+ let object = steedosSchema.getObject(objectName);
413
+ let parentObj = steedosSchema.getObject(parentObjectName);
414
+ let parent = await parentObj.findOne(_parentId);
415
+ let filters = [];
416
+ let _idValue = parent._id;
417
+ if (referenceToParentFieldName) {
418
+ _idValue = parent[referenceToParentFieldName];
419
+ }
420
+ filters = [[fieldName, "=", _idValue]];
421
+ if (params.filters) {
422
+ filters.push(params.filters);
423
+ }
424
+ params.filters = filters;
425
+
426
+ const { resolveInfo } = ctx.meta;
427
+ const fieldNames = getQueryFields(resolveInfo);
428
+ if (!_.isEmpty(fieldNames)) {
429
+ params.fields = fieldNames;
430
+ }
431
+ return await object.find(params, userSession);
432
+ },
433
+ };
434
+
435
+ actions[`${GRAPHQL_ACTION_PREFIX}${DISPLAY_PREFIX}`] = {
436
+ handler: async function (ctx) {
437
+ let params = ctx.params;
438
+ let { _id, objectName, fields } = params;
439
+ let userSession = ctx.meta.user;
440
+ let steedosSchema = getSteedosSchema();
441
+ let obj = steedosSchema.getObject(objectName);
442
+ let selector: any = { filters: [["_id", "=", _id]] };
443
+ if (fields && fields.length > 0) {
444
+ selector.fields = fields;
445
+ } else {
446
+ const { resolveInfo } = ctx.meta;
447
+ const fieldNames = getQueryFields(resolveInfo);
448
+ if (!_.isEmpty(fieldNames)) {
449
+ selector.fields = fieldNames;
450
+ }
451
+ }
452
+ let doc = (await obj.directFind(selector))[0];
453
+ let result = await translateToDisplay(objectName, doc, userSession);
454
+ return result;
455
+ },
456
+ };
457
+
458
+ return actions;
459
+ }
460
+
461
+ function _getRelatedResolverForEnableProperty(
462
+ parentObjectName,
463
+ relatedObjName,
464
+ foreignKey
465
+ ) {
466
+ return {
467
+ action: `${getObjectServiceName(
468
+ relatedObjName
469
+ )}.${GRAPHQL_ACTION_PREFIX}${RELATED_PREFIX}_enabled`,
470
+ rootParams: {
471
+ _id: "_parentId",
472
+ },
473
+ params: {
474
+ _related_params: {
475
+ objectName: relatedObjName,
476
+ parentObjectName: parentObjectName,
477
+ foreignKey: foreignKey,
478
+ },
479
+ },
480
+ };
481
+ }
482
+
483
+ export function getRelatedResolver(
484
+ objectApiName,
485
+ detailObjectApiName,
486
+ detailFieldName,
487
+ detailFieldReferenceToFieldName
488
+ ) {
489
+ return {
490
+ action: `${getObjectServiceName(
491
+ detailObjectApiName
492
+ )}.${GRAPHQL_ACTION_PREFIX}${RELATED_PREFIX}`,
493
+ rootParams: {
494
+ _id: "_parentId",
495
+ },
496
+ params: {
497
+ _related_params: {
498
+ objectName: detailObjectApiName,
499
+ parentObjectName: objectApiName,
500
+ fieldName: detailFieldName,
501
+ referenceToParentFieldName: detailFieldReferenceToFieldName,
502
+ },
503
+ },
504
+ };
505
+ }
506
+
507
+ function getTranslatedFieldConfig(translatedObject: any, name: string) {
508
+ return translatedObject.fields[name.replace(/__label$/, "")];
509
+ }
510
+
511
+ async function translateToDisplay(objectName, doc, userSession: any) {
512
+ const lng = getUserLocale(userSession);
513
+ let steedosSchema = getSteedosSchema();
514
+ let object = steedosSchema.getObject(objectName);
515
+ let objConfig = await object.toConfig();
516
+ let fields = objConfig.fields;
517
+ // let _object = clone(objConfig);
518
+ translationObject(lng, objConfig.name, objConfig);
519
+ let displayObj = { _id: doc._id };
520
+ let utcOffset = userSession.utcOffset;
521
+ for (const name in fields) {
522
+ if (Object.prototype.hasOwnProperty.call(fields, name)) {
523
+ const field = fields[name];
524
+ if (_.has(doc, name)) {
525
+ const fType = field.type;
526
+ if (fType == "text") {
527
+ displayObj[name] = doc[name] || "";
528
+ } else if (fType == "textarea") {
529
+ displayObj[name] = doc[name] || "";
530
+ } else if (fType == "html_text") {
531
+ displayObj[name] = doc[name] || "";
532
+ } else if (fType == "html") {
533
+ displayObj[name] = doc[name] || "";
534
+ } else if (fType == "select") {
535
+ let label = "";
536
+ let map = {};
537
+ let value = doc[name];
538
+ let translatedField = getTranslatedFieldConfig(objConfig, name);
539
+ let translatedFieldOptions =
540
+ translatedField && translatedField.options;
541
+ _.forEach(translatedFieldOptions, function (o) {
542
+ map[o.value] = o.label;
543
+ });
544
+ if (field.multiple) {
545
+ let labels = [];
546
+ _.forEach(value, function (v) {
547
+ labels.push(map[v]);
548
+ });
549
+ label = labels.join(",");
550
+ } else {
551
+ label = map[value];
552
+ }
553
+ displayObj[name] = label;
554
+ } else if (fType == "boolean") {
555
+ if (doc[name]) {
556
+ displayObj[name] = "√";
557
+ } else {
558
+ displayObj[name] = "";
559
+ }
560
+ } else if (fType == "date") {
561
+ displayObj[name] = moment(doc[name])
562
+ .utcOffset(utcOffset)
563
+ .format("YYYY-MM-DD");
564
+ } else if (fType == "datetime") {
565
+ displayObj[name] = moment(doc[name])
566
+ .utcOffset(utcOffset)
567
+ .format("YYYY-MM-DD H:mm");
568
+ } else if (fType == "number") {
569
+ displayObj[name] = doc[name] || "";
570
+ } else if (fType == "currency") {
571
+ displayObj[name] = doc[name] || "";
572
+ } else if (fType == "percent") {
573
+ displayObj[name] = `${doc[name] * 100}%`;
574
+ } else if (fType == "password") {
575
+ displayObj[name] = "";
576
+ if (_.isString(doc[name])) {
577
+ for (let i = 0; i < doc[name].length; i++) {
578
+ displayObj[name] += "*";
579
+ }
580
+ }
581
+ } else if (fType == "lookup" && _.isString(field.reference_to)) {
582
+ let lookupLabel = "";
583
+ let refTo = field.reference_to;
584
+ let refValue = doc[name];
585
+ if (!refValue) {
586
+ continue;
587
+ }
588
+ let refObj = steedosSchema.getObject(refTo);
589
+ let nameFieldKey = await refObj.getNameFieldKey();
590
+ if (field.multiple) {
591
+ let refRecords = await refObj.directFind({
592
+ filters: [`_id`, "in", refValue],
593
+ fields: [nameFieldKey],
594
+ });
595
+ lookupLabel = _.pluck(refRecords, nameFieldKey).join(",");
596
+ } else {
597
+ let refRecord = (
598
+ await refObj.directFind({
599
+ filters: [`_id`, "=", refValue],
600
+ fields: [nameFieldKey],
601
+ })
602
+ )[0];
603
+ if (refRecord) {
604
+ lookupLabel = refRecord[nameFieldKey];
605
+ }
606
+ }
607
+ displayObj[name] = lookupLabel;
608
+ } else if (fType == "master_detail" && _.isString(field.reference_to)) {
609
+ let masterDetailLabel = "";
610
+ let refTo = field.reference_to;
611
+ let refValue = doc[name];
612
+ if (!refValue) {
613
+ continue;
614
+ }
615
+ let refObj = steedosSchema.getObject(refTo);
616
+ let nameFieldKey = await refObj.getNameFieldKey();
617
+ if (field.multiple) {
618
+ let refRecords = await refObj.directFind({
619
+ filters: [`_id`, "in", refValue],
620
+ fields: [nameFieldKey],
621
+ });
622
+ masterDetailLabel = _.pluck(refRecords, nameFieldKey).join(",");
623
+ } else {
624
+ let refRecord = (
625
+ await refObj.directFind({
626
+ filters: [`_id`, "=", refValue],
627
+ fields: [nameFieldKey],
628
+ })
629
+ )[0];
630
+ if (refRecord) {
631
+ masterDetailLabel = refRecord[nameFieldKey];
632
+ }
633
+ }
634
+ displayObj[name] = masterDetailLabel;
635
+ } else if (fType == "autonumber") {
636
+ displayObj[name] = doc[name] || "";
637
+ } else if (fType == "url") {
638
+ displayObj[name] = doc[name] || "";
639
+ } else if (fType == "email") {
640
+ displayObj[name] = doc[name] || "";
641
+ } else if (fType == "formula") {
642
+ displayObj[name] = doc[name] || "";
643
+ } else if (fType == "summary") {
644
+ displayObj[name] = doc[name] || "";
645
+ } else if (fType == "image") {
646
+ displayObj[name] = doc[name] || "";
647
+ } else {
648
+ console.error(
649
+ `Graphql Display: need to handle new field type ${field.type} for ${objectName}.`
650
+ );
651
+ displayObj[name] = doc[name] || "";
652
+ }
653
+ } else {
654
+ displayObj[name] = ""; // 如果值为空,均返回空字符串
655
+ }
656
+ }
657
+ }
658
+ return displayObj;
659
+ }
660
+
661
+ function _getDisplayType(typeName, fields) {
662
+ let type = `type ${typeName} { _id: String `;
663
+ if (_.has(fields, "_id")) {
664
+ type = `type ${typeName} { `;
665
+ }
666
+ _.each(fields, (field, name) => {
667
+ if (name.indexOf(".") > -1) {
668
+ return;
669
+ }
670
+ type += `${name}: JSON `;
671
+ });
672
+ type += "}";
673
+ return type;
674
+ }
675
+
676
+ // 获取object元数据
677
+ export function getLocalService(objectApiName: string) {
678
+ let steedosSchema = getSteedosSchema();
679
+ return steedosSchema.broker.getLocalService(getObjectServiceName(objectApiName));
680
+ }
681
+
682
+ export * from './getQueryFields';