@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.
- package/lib/services/helpers/graphql/consts.d.ts +17 -0
- package/lib/services/helpers/graphql/consts.js +28 -0
- package/lib/services/helpers/graphql/consts.js.map +1 -0
- package/lib/services/helpers/graphql/getQueryFields.js +17 -2
- package/lib/services/helpers/graphql/getQueryFields.js.map +1 -1
- package/lib/services/helpers/graphql/index.d.ts +1 -1
- package/lib/services/helpers/graphql/index.js +31 -46
- package/lib/services/helpers/graphql/index.js.map +1 -1
- package/lib/util/index.js +7 -0
- package/lib/util/index.js.map +1 -1
- package/package.json +11 -12
- package/src/actions/field_updates.ts +0 -118
- package/src/actions/index.ts +0 -3
- package/src/actions/types/field_update_target.ts +0 -7
- package/src/actions/types/workflow_notification.ts +0 -9
- package/src/actions/types/workflow_rule.ts +0 -11
- package/src/actions/workflow_notifications.ts +0 -81
- package/src/actions/workflow_rule.ts +0 -136
- package/src/driver/driver.ts +0 -102
- package/src/driver/field-encrytion/index.ts +0 -8
- package/src/driver/field-encrytion/sharedconst.ts +0 -34
- package/src/driver/fieldDBType.ts +0 -14
- package/src/driver/format.ts +0 -36
- package/src/driver/index.ts +0 -20
- package/src/driver/metadata.ts +0 -226
- package/src/driver/meteorMongo.ts +0 -639
- package/src/driver/mongo.ts +0 -416
- package/src/driver/mysql.ts +0 -47
- package/src/driver/oracle.ts +0 -60
- package/src/driver/postgres.ts +0 -46
- package/src/driver/sqlite3.ts +0 -40
- package/src/driver/sqlserver.ts +0 -52
- package/src/dynamic-load/actions.ts +0 -146
- package/src/dynamic-load/approval_process.ts +0 -73
- package/src/dynamic-load/button.ts +0 -75
- package/src/dynamic-load/chart.ts +0 -22
- package/src/dynamic-load/client_script.ts +0 -65
- package/src/dynamic-load/field.ts +0 -77
- package/src/dynamic-load/flow_role.ts +0 -46
- package/src/dynamic-load/index.ts +0 -21
- package/src/dynamic-load/layout.ts +0 -53
- package/src/dynamic-load/listview.ts +0 -57
- package/src/dynamic-load/method.ts +0 -63
- package/src/dynamic-load/object_translations.ts +0 -61
- package/src/dynamic-load/originalObject.ts +0 -8
- package/src/dynamic-load/package.ts +0 -312
- package/src/dynamic-load/page.ts +0 -23
- package/src/dynamic-load/permission.ts +0 -71
- package/src/dynamic-load/permissionset.ts +0 -78
- package/src/dynamic-load/preload_data.ts +0 -104
- package/src/dynamic-load/profile.ts +0 -90
- package/src/dynamic-load/query.ts +0 -22
- package/src/dynamic-load/restrictionRules.ts +0 -23
- package/src/dynamic-load/role.ts +0 -46
- package/src/dynamic-load/shareRules.ts +0 -23
- package/src/dynamic-load/tab.ts +0 -17
- package/src/dynamic-load/tabs.ts +0 -13
- package/src/dynamic-load/translations.ts +0 -54
- package/src/dynamic-load/trigger.ts +0 -236
- package/src/dynamic-load/validation_rule.ts +0 -77
- package/src/dynamic-load/workflow.ts +0 -114
- package/src/errors/index.ts +0 -111
- package/src/formula/core.ts +0 -490
- package/src/formula/field_formula.ts +0 -107
- package/src/formula/index.ts +0 -81
- package/src/formula/params.ts +0 -197
- package/src/formula/recompute.ts +0 -65
- package/src/formula/simple_params.ts +0 -92
- package/src/formula/type.ts +0 -107
- package/src/formula/util.ts +0 -207
- package/src/index.ts +0 -24
- package/src/metadata-register/_base.ts +0 -85
- package/src/metadata-register/app.ts +0 -30
- package/src/metadata-register/chart.ts +0 -9
- package/src/metadata-register/index.ts +0 -123
- package/src/metadata-register/layout.ts +0 -38
- package/src/metadata-register/object.ts +0 -68
- package/src/metadata-register/page.ts +0 -9
- package/src/metadata-register/permissionFields.ts +0 -13
- package/src/metadata-register/permissionset.ts +0 -25
- package/src/metadata-register/process.ts +0 -16
- package/src/metadata-register/processTrigger.ts +0 -24
- package/src/metadata-register/profile.ts +0 -25
- package/src/metadata-register/query.ts +0 -9
- package/src/metadata-register/restrictionRules.ts +0 -12
- package/src/metadata-register/shareRules.ts +0 -13
- package/src/metadata-register/tab.ts +0 -9
- package/src/metadata-register/tabs.ts +0 -43
- package/src/services/datasourceServiceFactory.ts +0 -55
- package/src/services/helpers/graphql/getPrimaryFieldType.ts +0 -48
- package/src/services/helpers/graphql/getQueryFields.ts +0 -36
- package/src/services/helpers/graphql/index.ts +0 -681
- package/src/services/helpers/rest.ts +0 -57
- package/src/services/index.ts +0 -13
- package/src/services/objectService.ts +0 -846
- package/src/services/objectServiceDispatcher.ts +0 -209
- package/src/services/objectServiceFactory.ts +0 -29
- package/src/summary/core.ts +0 -263
- package/src/summary/field_summary.ts +0 -71
- package/src/summary/index.ts +0 -96
- package/src/summary/recompute.ts +0 -31
- package/src/summary/type.ts +0 -60
- package/src/ts-types/index.ts +0 -3
- package/src/ts-types/permissionset.ts +0 -8
- package/src/ts-types/profile.ts +0 -11
- package/src/ts-types/triggerActionParams.ts +0 -22
- package/src/typeorm/driver.ts +0 -379
- package/src/typeorm/index.ts +0 -3
- package/src/typeorm/util.ts +0 -147
- package/src/types/action.ts +0 -52
- package/src/types/app.ts +0 -280
- package/src/types/config.ts +0 -152
- package/src/types/connection.ts +0 -87
- package/src/types/dashboard.ts +0 -91
- package/src/types/datasource.ts +0 -570
- package/src/types/field.ts +0 -370
- package/src/types/field_permission.ts +0 -42
- package/src/types/field_types.ts +0 -1
- package/src/types/index.ts +0 -21
- package/src/types/list_view.ts +0 -56
- package/src/types/listeners.ts +0 -18
- package/src/types/object.ts +0 -2076
- package/src/types/object_dynamic_load.ts +0 -426
- package/src/types/object_events.ts +0 -43
- package/src/types/object_layouts.ts +0 -20
- package/src/types/object_permission.ts +0 -134
- package/src/types/query.ts +0 -28
- package/src/types/report.ts +0 -128
- package/src/types/restrictionRule.ts +0 -57
- package/src/types/schema.ts +0 -273
- package/src/types/shareRule.ts +0 -57
- package/src/types/trigger.ts +0 -88
- package/src/types/userSession.ts +0 -45
- package/src/types/validation_rules.ts +0 -29
- package/src/util/convert.ts +0 -131
- package/src/util/field.ts +0 -93
- package/src/util/function_expression.ts +0 -63
- package/src/util/index.ts +0 -1058
- package/src/util/locale.ts +0 -24
- package/src/util/permission_shares.ts +0 -25
- package/src/util/suffix.ts +0 -78
- package/src/util/transform.ts +0 -239
- 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';
|