@steedos/objectql 2.2.50 → 2.2.51-beta.4

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