@steedos/objectql 2.1.76 → 2.1.78

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 (45) hide show
  1. package/lib/index.d.ts +0 -1
  2. package/lib/index.js +0 -1
  3. package/lib/index.js.map +1 -1
  4. package/lib/services/objectService.d.ts +1 -1
  5. package/lib/services/objectService.js +5 -4
  6. package/lib/services/objectService.js.map +1 -1
  7. package/lib/services/objectServiceDispatcher.js +12 -2
  8. package/lib/services/objectServiceDispatcher.js.map +1 -1
  9. package/lib/types/datasource.d.ts +0 -2
  10. package/lib/types/datasource.js +0 -6
  11. package/lib/types/datasource.js.map +1 -1
  12. package/lib/types/field_permission.d.ts +1 -0
  13. package/lib/types/field_permission.js +24 -0
  14. package/lib/types/field_permission.js.map +1 -1
  15. package/lib/types/index.d.ts +1 -0
  16. package/lib/types/index.js +1 -0
  17. package/lib/types/index.js.map +1 -1
  18. package/lib/types/object.d.ts +6 -2
  19. package/lib/types/object.js +70 -36
  20. package/lib/types/object.js.map +1 -1
  21. package/lib/types/object_dynamic_load.d.ts +1 -0
  22. package/lib/types/object_dynamic_load.js +33 -18
  23. package/lib/types/object_dynamic_load.js.map +1 -1
  24. package/lib/types/schema.d.ts +0 -3
  25. package/lib/types/schema.js +0 -11
  26. package/lib/types/schema.js.map +1 -1
  27. package/package.json +8 -8
  28. package/server.js +0 -7
  29. package/src/index.ts +0 -1
  30. package/src/services/objectService.ts +4 -3
  31. package/src/services/objectServiceDispatcher.ts +6 -2
  32. package/src/types/datasource.ts +0 -8
  33. package/src/types/field_permission.ts +16 -0
  34. package/src/types/index.ts +1 -0
  35. package/src/types/object.ts +60 -26
  36. package/src/types/object_dynamic_load.ts +9 -1
  37. package/src/types/schema.ts +0 -13
  38. package/lib/graphql/index.d.ts +0 -3
  39. package/lib/graphql/index.js +0 -374
  40. package/lib/graphql/index.js.map +0 -1
  41. package/lib/graphql/utils.d.ts +0 -7
  42. package/lib/graphql/utils.js +0 -67
  43. package/lib/graphql/utils.js.map +0 -1
  44. package/src/graphql/index.ts +0 -361
  45. package/src/graphql/utils.ts +0 -61
@@ -1,361 +0,0 @@
1
- import { SteedosSchema, SteedosDataSourceType } from "../types";
2
- import {
3
- GraphQLList,
4
- GraphQLSchema,
5
- GraphQLObjectType,
6
- GraphQLString,
7
- GraphQLFloat,
8
- GraphQLBoolean,
9
- GraphQLNonNull,
10
- GraphQLInt
11
- } from 'graphql';
12
- var _ = require("underscore");
13
- import { ObjectId } from 'mongodb';
14
- var GraphQLJSON = require('graphql-type-json');
15
- import { getFieldLabel } from './utils';
16
- import {
17
- GraphQLDate,
18
- GraphQLDateTime
19
- } from 'graphql-iso-date';
20
-
21
- /** Maps basic creator field types to basic GraphQL types */
22
- const BASIC_TYPE_MAPPING = {
23
- 'text': GraphQLString,
24
- 'textarea': GraphQLString,
25
- 'html': GraphQLString,
26
- 'select': GraphQLString,
27
- 'url': GraphQLString,
28
- 'email': GraphQLString,
29
- 'date': GraphQLDate,
30
- 'datetime': GraphQLDateTime,
31
- 'number': GraphQLFloat,
32
- 'currency': GraphQLFloat,
33
- 'boolean': GraphQLBoolean
34
- }
35
-
36
- const knownTypes = {};
37
- const relatedObjects = {};
38
- const RELATEDPREFIX = 'related__';
39
- const LABELSUFFIX = '__label';
40
-
41
- function convertFields(steedosSchema: SteedosSchema, fields, knownTypes) {
42
- let objTypeFields = {};
43
- objTypeFields["_id"] = {
44
- type: GraphQLString
45
- }
46
-
47
- _.each(fields, function (v, k) {
48
- if (k.indexOf('.') > -1) {
49
- return;
50
- }
51
-
52
- if (!v.type) {
53
- console.error(`The field ${k} has no type property.`);
54
- return;
55
- }
56
-
57
- if (BASIC_TYPE_MAPPING[v.type]) {
58
- objTypeFields[k] = { type: BASIC_TYPE_MAPPING[v.type] }
59
- }
60
-
61
- else if ((v.type == 'lookup' || v.type == 'master_detail') && v.reference_to && _.isString(v.reference_to)) {
62
- let objectName = v.reference_to;
63
- let corName = correctName(objectName);
64
- if (!knownTypes[corName]) {
65
- try {
66
- let object = steedosSchema.getObject(objectName);
67
- if (object) {
68
- knownTypes[corName] = buildGraphQLObjectType(object, steedosSchema, knownTypes)
69
- }
70
- } catch (error) {
71
- console.error(error);
72
- return;
73
- }
74
- }
75
-
76
- objTypeFields[k] = {
77
- type: knownTypes[corName],
78
- args: {},
79
- resolve: async function (source, args, context, info) {
80
- let object = steedosSchema.getObject(objectName);
81
- let userSession = context ? context.user : null;
82
- if (object.name == 'users') {
83
- userSession = null;
84
- }
85
- let record = await object.findOne(source[info.fieldName], {}, userSession);
86
- return record;
87
- }
88
- };
89
- if (v.type == 'lookup' && v.multiple) {
90
- objTypeFields[k].type = new GraphQLList(knownTypes[corName]);
91
- objTypeFields[k].resolve = async function (source, args, context, info) {
92
- let object = steedosSchema.getObject(objectName);
93
- let filters = [];
94
- _.each(source[info.fieldName], function (f) {
95
- filters.push(`(_id eq '${f}')`);
96
- })
97
- if (filters.length === 0) {
98
- return null;
99
- }
100
- let userSession = context ? context.user : null;
101
- if (object.name == 'users') {
102
- userSession = null;
103
- }
104
- return await object.find({
105
- filters: filters.join(' or ')
106
- }, userSession);
107
- }
108
- }
109
- }
110
- else if (v.type == RELATEDPREFIX) {
111
- let corName = v.reference_to;
112
- let objName = v.objectName;
113
- if (!knownTypes[objName]) {
114
- let object = steedosSchema.getObject(objName);
115
- if (object) {
116
- knownTypes[objName] = buildGraphQLObjectType(object, steedosSchema, knownTypes)
117
- }
118
- }
119
-
120
- objTypeFields[k] = {
121
- type: new GraphQLList(knownTypes[objName]),
122
- args: { 'fields': { type: new GraphQLList(GraphQLString) || GraphQLString }, 'filters': { type: GraphQLJSON }, 'top': { type: GraphQLInt }, 'skip': { type: GraphQLInt }, 'sort': { type: GraphQLString } },
123
- resolve: async function (source, args, context, info) {
124
- let field = relatedObjects[corName].fields[info.fieldName];
125
- let referenceToField = field.reference_to_field;
126
- let relatedObjName = field.objectName;
127
- let object = steedosSchema.getObject(relatedObjName);
128
- let userSession = context ? context.user : null;
129
- let filters = [];
130
- let _idValue = source._id;
131
- if (referenceToField) {
132
- _idValue = source[referenceToField];
133
- }
134
- if (field.by_enabled) {
135
- filters = [[`${field.name}.o`, "=", corName], [`${field.name}.ids`, "=", source._id]];
136
- }
137
- else {
138
- filters = [[field.name, "=", _idValue]];
139
- }
140
- if (args && args.filters) {
141
- filters.push(args.filters);
142
- }
143
- args.filters = filters;
144
- return object.find(args, userSession);
145
- }
146
- };
147
- }
148
- else if (v.type == LABELSUFFIX) {
149
- objTypeFields[k] = {
150
- type: GraphQLJSON,
151
- resolve: function (source, args, context, info) {
152
- // let field = relatedObjects[info.parentType.name].fields[info.fieldName];
153
- // return getFieldLabel(field, source[field.name], userSession);
154
- let userSession = context ? context.user : null;
155
- let objectName = info.parentType.name;
156
- let fieldName = info.fieldName;
157
- let field = relatedObjects[objectName].fields[fieldName];
158
- let fieldValue = source[field.name];
159
- let relatedFields = relatedObjects[objectName].fields;
160
- let object = steedosSchema.getObject(objectName);
161
- return getFieldLabel(fieldName, fieldValue, relatedFields, object, userSession);
162
- }
163
- };
164
- }
165
- else {
166
- objTypeFields[k] = {
167
- type: GraphQLJSON
168
- };
169
- }
170
- })
171
-
172
- return objTypeFields
173
- }
174
-
175
- function correctName(name: string) {
176
- return name.replace(/\./g, '_');
177
- }
178
-
179
- function buildGraphQLObjectType(obj, steedosSchema, knownTypes) {
180
-
181
- let corName = correctName(obj.name);
182
-
183
- let relatedFields = relatedObjects[corName].fields;
184
-
185
- return new GraphQLObjectType({
186
- name: corName, fields: function () {
187
- return convertFields(steedosSchema, _.extend({}, obj.fields, relatedFields), knownTypes);
188
- }
189
- })
190
- }
191
-
192
- function collectRelatedObjects(steedosSchema: SteedosSchema) {
193
- _.each(steedosSchema.getDataSources(), function (datasource) {
194
- _.each(datasource.getObjects(), function (obj, object_name) {
195
- if (!obj.name || !obj.fields) {
196
- return;
197
- }
198
- let objName: string = correctName(obj.name);
199
-
200
- if (!relatedObjects[objName]) {
201
- relatedObjects[objName] = { fields: {} };
202
- }
203
-
204
- _.each(obj.fields, function (v, k) {
205
- if (v.type == 'master_detail' && v.reference_to && _.isString(v.reference_to)) {
206
- let refName = correctName(v.reference_to);
207
- if (!relatedObjects[refName]) {
208
- relatedObjects[refName] = { fields: {} };
209
- }
210
-
211
- relatedObjects[refName].fields[`${RELATEDPREFIX}${objName}`] = {
212
- type: RELATEDPREFIX,
213
- reference_to: refName,
214
- reference_to_field: v.reference_to_field,
215
- name: k,
216
- objectName: objName
217
- }
218
-
219
- }
220
- else if (['boolean', 'date', 'datetime', 'select', 'percent'].includes(v.type)) {
221
- relatedObjects[objName].fields[`${k}${LABELSUFFIX}`] = {
222
- type: LABELSUFFIX,
223
- name: k,
224
- dataType: v.type,
225
- options: v.options,
226
- multiple: v.multiple
227
- }
228
- }
229
- })
230
- let enabledRefNames = [];
231
- if (obj.enable_files) {
232
- enabledRefNames.push('cms_files');
233
- }
234
- if (obj.enable_tasks) {
235
- enabledRefNames.push('tasks');
236
- }
237
- if (obj.enable_events) {
238
- enabledRefNames.push('events');
239
- }
240
- if (obj.enable_audit) {
241
- enabledRefNames.push('audit_records');
242
- }
243
- _.forEach(enabledRefNames, function (refName) {
244
- relatedObjects[objName].fields[`${RELATEDPREFIX}${refName}`] = {
245
- type: RELATEDPREFIX,
246
- reference_to: objName,
247
- name: refName == 'cms_files' ? 'parent' : 'related_to',
248
- objectName: refName,
249
- by_enabled: true // 通过enable方式关联的子表打上标记供查询时判断
250
- }
251
- })
252
-
253
- })
254
- })
255
- }
256
-
257
- export function buildGraphQLSchema(steedosSchema: SteedosSchema, datasource?: SteedosDataSourceType): GraphQLSchema {
258
- collectRelatedObjects(steedosSchema);
259
-
260
- let rootQueryfields = {};
261
- _.each(steedosSchema.getDataSources(), function (datasource) {
262
- _.each(datasource.getObjects(), function (obj, object_name) {
263
-
264
- if (!obj.name) {
265
- return;
266
- }
267
-
268
- let corName = correctName(obj.name);
269
- let objName: string = correctName(obj.name);
270
-
271
- knownTypes[objName] = buildGraphQLObjectType(obj, steedosSchema, knownTypes)
272
-
273
- rootQueryfields[corName] = {
274
- type: new GraphQLList(knownTypes[objName]),
275
- args: { 'fields': { type: new GraphQLList(GraphQLString) || GraphQLString }, 'filters': { type: GraphQLJSON }, 'top': { type: GraphQLInt }, 'skip': { type: GraphQLInt }, 'sort': { type: GraphQLString } },
276
- resolve: async function (source, args, context, info) {
277
- let object = steedosSchema.getObject(`${obj.name}`);
278
- let userSession = context ? context.user : null;
279
- return object.find(args, userSession);
280
- }
281
- }
282
- })
283
- })
284
-
285
-
286
- let rootMutationfields = {};
287
- _.each(rootQueryfields, function (type, objName) {
288
- rootMutationfields[objName + '__insert'] = {
289
- type: knownTypes[objName],
290
- args: { 'data': { type: new GraphQLNonNull(GraphQLJSON) || new GraphQLNonNull(GraphQLString) } },
291
- resolve: async function (source, args, context, info) {
292
- let data:any = '';
293
- if(_.isString(args['data'])){
294
- data = JSON.parse(args['data'])
295
- }else{
296
- data = JSON.parse(JSON.stringify(args['data']))
297
- }
298
- data._id = data._id || new ObjectId().toHexString();
299
- let object = steedosSchema.getObject(`${type.type.ofType.name}`);
300
- let userSession = context ? context.user : null;
301
- if (userSession && object.getField('space')) {
302
- data.space = userSession.spaceId;
303
- }
304
- return object.insert(data, userSession);
305
- }
306
- }
307
- rootMutationfields[objName + '__update'] = {
308
- type: knownTypes[objName],
309
- args: { '_id': { type: new GraphQLNonNull(GraphQLString) }, 'selector': { type: GraphQLJSON }, 'data': { type: new GraphQLNonNull(GraphQLJSON) || new GraphQLNonNull(GraphQLString) } },
310
- resolve: async function (source, args, context, info) {
311
- let data:any = '';
312
- if(_.isString(args['data'])){
313
- data = JSON.parse(args['data'])
314
- }else{
315
- data = JSON.parse(JSON.stringify(args['data']))
316
- }
317
- let _id = args['_id'];
318
- let object = steedosSchema.getObject(`${type.type.ofType.name}`);
319
- let userSession = context ? context.user : null;
320
- delete data.space;
321
- return object.update(_id, data, userSession);
322
- }
323
- }
324
- rootMutationfields[objName + '__delete'] = {
325
- type: GraphQLJSON,
326
- args: { '_id': { type: new GraphQLNonNull(GraphQLString) }, 'selector': { type: GraphQLJSON } },
327
- resolve: async function (source, args, context, info) {
328
- let _id = args['_id'];
329
- let object = steedosSchema.getObject(`${type.type.ofType.name}`);
330
- let userSession = context ? context.user : null;
331
- return object.delete(_id, userSession);
332
- }
333
- }
334
- })
335
-
336
- rootQueryfields['count'] = {
337
- type: GraphQLInt,
338
- args: { 'objectName': { type: new GraphQLNonNull(GraphQLString) }, 'filters': { type: GraphQLJSON } },
339
- resolve: async function (source, args, context, info) {
340
- if (!args.objectName) {
341
- throw new Error('objectName is required!');
342
- }
343
- let object = steedosSchema.getObject(args.objectName);
344
- let userSession = context ? context.user : null;
345
- return object.count({ filters: args.filters }, userSession);
346
- }
347
- }
348
-
349
- var schemaConfig = {
350
- query: new GraphQLObjectType({
351
- name: 'RootQueryType',
352
- fields: rootQueryfields
353
- }),
354
- mutation: new GraphQLObjectType({
355
- name: 'MutationRootType',
356
- fields: rootMutationfields
357
- })
358
- };
359
-
360
- return new GraphQLSchema(schemaConfig);
361
- }
@@ -1,61 +0,0 @@
1
- const moment = require('moment');
2
- const _ = require('underscore');
3
- const clone = require("clone");
4
- import { translationObject } from '@steedos/i18n';
5
- import { getUserLocale } from "../util/locale";
6
-
7
- declare var t: any;
8
-
9
-
10
- const getTranslatedFieldConfig = (translatedObject: any, name: string) => {
11
- return translatedObject.fields[name.replace(/__label$/,"")];
12
- }
13
-
14
- /**
15
- *
16
- * @param field {type,name,dataType,options,multiple}
17
- * @param value
18
- * @param userSession
19
- */
20
- // export function getFieldLabel(field, value, userSession) {
21
- export function getFieldLabel(name: string, value: any, relatedFields: any, object: any, userSession: any) {
22
- const lng = getUserLocale(userSession);
23
- let _object = clone(object.toConfig());
24
- translationObject(lng, _object.name, _object);
25
- let utcOffset = userSession.utcOffset;
26
- let locale = userSession.locale;
27
- // let field = relatedObjects[info.parentType.name].fields[info.name];
28
- let field = relatedFields[name];
29
- let type = field.dataType;
30
- let label = '';
31
- if (type === 'boolean') {
32
- if (value === true) {
33
- label = t('YES', null, locale);
34
- } else {
35
- label = t('NO', null, locale);
36
- }
37
- } else if (type === 'date' && value) {
38
- label = moment(value).utcOffset(utcOffset).format("YYYY-MM-DD")
39
- } else if (type === 'datetime' && value) {
40
- label = moment(value).utcOffset(utcOffset).format("YYYY-MM-DD H:mm")
41
- } else if (type === 'select' && value) {
42
- let map = {};
43
- let translatedField = getTranslatedFieldConfig(_object, name);
44
- let translatedFieldOptions = translatedField && translatedField.options;
45
- _.forEach(translatedFieldOptions, function (o) {
46
- map[o.value] = o.label;
47
- });
48
- if (field.multiple) {
49
- let labels = [];
50
- _.forEach(value, function (v) {
51
- labels.push(map[v]);
52
- })
53
- label = labels.join(',');
54
- } else {
55
- label = map[value];
56
- }
57
- } else if (type === 'percent' && _.isNumber(value)) {
58
- label = `${value * 100}%`
59
- }
60
- return label;
61
- }