@steedos/objectql 2.1.76 → 2.1.84
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/actions/field_updates.js +15 -15
- package/lib/actions/field_updates.js.map +1 -1
- package/lib/actions/index.js +3 -3
- package/lib/actions/index.js.map +1 -1
- package/lib/actions/workflow_notifications.js +10 -10
- package/lib/actions/workflow_notifications.js.map +1 -1
- package/lib/actions/workflow_rule.js +19 -19
- package/lib/actions/workflow_rule.js.map +1 -1
- package/lib/driver/index.js +1 -0
- package/lib/driver/index.js.map +1 -1
- package/lib/driver/metadata.js +3 -3
- package/lib/driver/metadata.js.map +1 -1
- package/lib/driver/meteorMongo.js +36 -36
- package/lib/driver/meteorMongo.js.map +1 -1
- package/lib/driver/mongo.js +43 -43
- package/lib/driver/mongo.js.map +1 -1
- package/lib/driver/mysql.js +2 -2
- package/lib/driver/mysql.js.map +1 -1
- package/lib/driver/oracle.js +5 -5
- package/lib/driver/oracle.js.map +1 -1
- package/lib/driver/postgres.js +2 -2
- package/lib/driver/postgres.js.map +1 -1
- package/lib/driver/sqlite3.js +2 -2
- package/lib/driver/sqlite3.js.map +1 -1
- package/lib/driver/sqlserver.js +4 -4
- package/lib/driver/sqlserver.js.map +1 -1
- package/lib/dynamic-load/actions.js +22 -18
- package/lib/dynamic-load/actions.js.map +1 -1
- package/lib/dynamic-load/approval_process.js +15 -10
- package/lib/dynamic-load/approval_process.js.map +1 -1
- package/lib/dynamic-load/button.js +25 -18
- package/lib/dynamic-load/button.js.map +1 -1
- package/lib/dynamic-load/chart.js +20 -23
- package/lib/dynamic-load/chart.js.map +1 -1
- package/lib/dynamic-load/field.js +21 -16
- package/lib/dynamic-load/field.js.map +1 -1
- package/lib/dynamic-load/flow_role.js +12 -8
- package/lib/dynamic-load/flow_role.js.map +1 -1
- package/lib/dynamic-load/index.d.ts +1 -0
- package/lib/dynamic-load/index.js +20 -19
- package/lib/dynamic-load/index.js.map +1 -1
- package/lib/dynamic-load/layout.js +19 -14
- package/lib/dynamic-load/layout.js.map +1 -1
- package/lib/dynamic-load/listview.js +14 -11
- package/lib/dynamic-load/listview.js.map +1 -1
- package/lib/dynamic-load/method.js +9 -6
- package/lib/dynamic-load/method.js.map +1 -1
- package/lib/dynamic-load/object_translations.js +29 -51
- package/lib/dynamic-load/object_translations.js.map +1 -1
- package/lib/dynamic-load/originalObject.js +1 -1
- package/lib/dynamic-load/originalObject.js.map +1 -1
- package/lib/dynamic-load/package.d.ts +9 -0
- package/lib/dynamic-load/package.js +507 -0
- package/lib/dynamic-load/package.js.map +1 -0
- package/lib/dynamic-load/page.js +20 -23
- package/lib/dynamic-load/page.js.map +1 -1
- package/lib/dynamic-load/permission.js +61 -65
- package/lib/dynamic-load/permission.js.map +1 -1
- package/lib/dynamic-load/permissionset.js +30 -25
- package/lib/dynamic-load/permissionset.js.map +1 -1
- package/lib/dynamic-load/preload_data.js +55 -74
- package/lib/dynamic-load/preload_data.js.map +1 -1
- package/lib/dynamic-load/profile.js +33 -28
- package/lib/dynamic-load/profile.js.map +1 -1
- package/lib/dynamic-load/query.js +20 -23
- package/lib/dynamic-load/query.js.map +1 -1
- package/lib/dynamic-load/restrictionRules.js +18 -23
- package/lib/dynamic-load/restrictionRules.js.map +1 -1
- package/lib/dynamic-load/role.js +12 -8
- package/lib/dynamic-load/role.js.map +1 -1
- package/lib/dynamic-load/shareRules.js +18 -23
- package/lib/dynamic-load/shareRules.js.map +1 -1
- package/lib/dynamic-load/tab.js +4 -3
- package/lib/dynamic-load/tab.js.map +1 -1
- package/lib/dynamic-load/tabs.js +9 -7
- package/lib/dynamic-load/tabs.js.map +1 -1
- package/lib/dynamic-load/translations.js +23 -17
- package/lib/dynamic-load/translations.js.map +1 -1
- package/lib/dynamic-load/trigger.js +14 -10
- package/lib/dynamic-load/trigger.js.map +1 -1
- package/lib/dynamic-load/validation_rule.js +13 -8
- package/lib/dynamic-load/validation_rule.js.map +1 -1
- package/lib/dynamic-load/workflow.js +38 -25
- package/lib/dynamic-load/workflow.js.map +1 -1
- package/lib/errors/index.js +2 -1
- package/lib/errors/index.js.map +1 -1
- package/lib/formula/core.js +105 -91
- package/lib/formula/core.js.map +1 -1
- package/lib/formula/field_formula.js +26 -20
- package/lib/formula/field_formula.js.map +1 -1
- package/lib/formula/index.js +26 -26
- package/lib/formula/index.js.map +1 -1
- package/lib/formula/params.js +1 -1
- package/lib/formula/params.js.map +1 -1
- package/lib/formula/recompute.js +27 -25
- package/lib/formula/recompute.js.map +1 -1
- package/lib/formula/simple_params.js +2 -2
- package/lib/formula/simple_params.js.map +1 -1
- package/lib/formula/util.js +33 -23
- package/lib/formula/util.js.map +1 -1
- package/lib/index.d.ts +0 -1
- package/lib/index.js +15 -16
- package/lib/index.js.map +1 -1
- package/lib/metadata-register/_base.d.ts +1 -0
- package/lib/metadata-register/_base.js +45 -15
- package/lib/metadata-register/_base.js.map +1 -1
- package/lib/metadata-register/app.js +8 -8
- package/lib/metadata-register/chart.js +1 -1
- package/lib/metadata-register/chart.js.map +1 -1
- package/lib/metadata-register/index.js +72 -72
- package/lib/metadata-register/index.js.map +1 -1
- package/lib/metadata-register/layout.js +18 -16
- package/lib/metadata-register/layout.js.map +1 -1
- package/lib/metadata-register/object.d.ts +0 -1
- package/lib/metadata-register/object.js +17 -35
- package/lib/metadata-register/object.js.map +1 -1
- package/lib/metadata-register/page.js +1 -1
- package/lib/metadata-register/page.js.map +1 -1
- package/lib/metadata-register/permissionFields.js +2 -2
- package/lib/metadata-register/permissionFields.js.map +1 -1
- package/lib/metadata-register/permissionset.js +6 -6
- package/lib/metadata-register/profile.js +6 -6
- package/lib/metadata-register/query.js +1 -1
- package/lib/metadata-register/query.js.map +1 -1
- package/lib/metadata-register/restrictionRules.js +2 -2
- package/lib/metadata-register/restrictionRules.js.map +1 -1
- package/lib/metadata-register/shareRules.js +2 -2
- package/lib/metadata-register/shareRules.js.map +1 -1
- package/lib/metadata-register/tab.js +1 -1
- package/lib/metadata-register/tab.js.map +1 -1
- package/lib/metadata-register/tabs.js +18 -16
- package/lib/metadata-register/tabs.js.map +1 -1
- package/lib/services/datasourceServiceFactory.d.ts +1 -0
- package/lib/services/datasourceServiceFactory.js +51 -0
- package/lib/services/datasourceServiceFactory.js.map +1 -0
- package/lib/services/helpers/graphql.js +86 -87
- package/lib/services/helpers/graphql.js.map +1 -1
- package/lib/services/helpers/index.js +2 -2
- package/lib/services/helpers/index.js.map +1 -1
- package/lib/services/helpers/rest.js +1 -1
- package/lib/services/helpers/rest.js.map +1 -1
- package/lib/services/index.d.ts +3 -0
- package/lib/services/index.js +10 -4
- package/lib/services/index.js.map +1 -1
- package/lib/services/objectService.d.ts +1 -1
- package/lib/services/objectService.js +148 -147
- package/lib/services/objectService.js.map +1 -1
- package/lib/services/objectServiceDispatcher.js +102 -92
- package/lib/services/objectServiceDispatcher.js.map +1 -1
- package/lib/{metadata-register/objectServiceManager.d.ts → services/objectServiceFactory.d.ts} +0 -0
- package/lib/{metadata-register/objectServiceManager.js → services/objectServiceFactory.js} +5 -5
- package/lib/services/objectServiceFactory.js.map +1 -0
- package/lib/summary/core.js +51 -44
- package/lib/summary/core.js.map +1 -1
- package/lib/summary/field_summary.js +21 -16
- package/lib/summary/field_summary.js.map +1 -1
- package/lib/summary/index.js +25 -22
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/recompute.js +13 -11
- package/lib/summary/recompute.js.map +1 -1
- package/lib/ts-types/index.js +3 -3
- package/lib/ts-types/index.js.map +1 -1
- package/lib/typeorm/driver.js +58 -58
- package/lib/typeorm/driver.js.map +1 -1
- package/lib/typeorm/index.js +2 -1
- package/lib/typeorm/index.js.map +1 -1
- package/lib/typeorm/util.js +2 -2
- package/lib/typeorm/util.js.map +1 -1
- package/lib/types/app.js +41 -35
- package/lib/types/app.js.map +1 -1
- package/lib/types/config.js +52 -45
- package/lib/types/config.js.map +1 -1
- package/lib/types/connection.js +20 -18
- package/lib/types/connection.js.map +1 -1
- package/lib/types/dashboard.js +10 -7
- package/lib/types/dashboard.js.map +1 -1
- package/lib/types/datasource.d.ts +14 -3
- package/lib/types/datasource.js +205 -198
- package/lib/types/datasource.js.map +1 -1
- package/lib/types/field.d.ts +2 -2
- package/lib/types/field.js +6 -6
- package/lib/types/field.js.map +1 -1
- package/lib/types/field_permission.d.ts +1 -0
- package/lib/types/field_permission.js +30 -6
- package/lib/types/field_permission.js.map +1 -1
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.js +11 -9
- package/lib/types/index.js.map +1 -1
- package/lib/types/list_view.d.ts +1 -1
- package/lib/types/list_view.js +1 -1
- package/lib/types/list_view.js.map +1 -1
- package/lib/types/object.d.ts +17 -13
- package/lib/types/object.js +275 -234
- package/lib/types/object.js.map +1 -1
- package/lib/types/object_dynamic_load.d.ts +1 -0
- package/lib/types/object_dynamic_load.js +129 -164
- package/lib/types/object_dynamic_load.js.map +1 -1
- package/lib/types/object_events.js +5 -5
- package/lib/types/object_events.js.map +1 -1
- package/lib/types/object_layouts.js +7 -7
- package/lib/types/object_layouts.js.map +1 -1
- package/lib/types/object_permission.d.ts +1 -1
- package/lib/types/object_permission.js +1 -1
- package/lib/types/object_permission.js.map +1 -1
- package/lib/types/report.js +10 -7
- package/lib/types/report.js.map +1 -1
- package/lib/types/restrictionRule.js +11 -11
- package/lib/types/restrictionRule.js.map +1 -1
- package/lib/types/schema.d.ts +1 -4
- package/lib/types/schema.js +41 -30
- package/lib/types/schema.js.map +1 -1
- package/lib/types/shareRule.js +11 -11
- package/lib/types/shareRule.js.map +1 -1
- package/lib/types/trigger.js +2 -2
- package/lib/types/trigger.js.map +1 -1
- package/lib/types/validation_rules.js +5 -5
- package/lib/types/validation_rules.js.map +1 -1
- package/lib/util/convert.d.ts +2 -0
- package/lib/util/convert.js +130 -0
- package/lib/util/convert.js.map +1 -0
- package/lib/util/field.js +5 -3
- package/lib/util/field.js.map +1 -1
- package/lib/util/function_expression.js +5 -3
- package/lib/util/function_expression.js.map +1 -1
- package/lib/util/index.d.ts +2 -7
- package/lib/util/index.js +86 -166
- package/lib/util/index.js.map +1 -1
- package/lib/util/locale.js +5 -3
- package/lib/util/locale.js.map +1 -1
- package/lib/util/permission_shares.js +2 -2
- package/lib/util/permission_shares.js.map +1 -1
- package/lib/util/suffix.js +22 -16
- package/lib/util/suffix.js.map +1 -1
- package/lib/util/transform.js +11 -11
- package/lib/util/transform.js.map +1 -1
- package/lib/validators/index.js +3 -2
- package/lib/validators/index.js.map +1 -1
- package/package.json +13 -13
- package/server.js +0 -7
- package/src/dynamic-load/chart.ts +6 -1
- package/src/dynamic-load/index.ts +1 -0
- package/src/dynamic-load/object_translations.ts +19 -10
- package/src/dynamic-load/package.ts +303 -0
- package/src/dynamic-load/page.ts +7 -1
- package/src/dynamic-load/permission.ts +1 -5
- package/src/dynamic-load/preload_data.ts +2 -3
- package/src/dynamic-load/query.ts +6 -1
- package/src/dynamic-load/restrictionRules.ts +6 -2
- package/src/dynamic-load/shareRules.ts +5 -1
- package/src/dynamic-load/translations.ts +3 -1
- package/src/index.ts +0 -1
- package/src/metadata-register/_base.ts +23 -0
- package/src/metadata-register/object.ts +1 -20
- package/src/services/datasourceServiceFactory.ts +37 -0
- package/src/services/helpers/graphql.ts +5 -3
- package/src/services/index.ts +7 -0
- package/src/services/objectService.ts +9 -7
- package/src/services/objectServiceDispatcher.ts +6 -2
- package/src/{metadata-register/objectServiceManager.ts → services/objectServiceFactory.ts} +4 -4
- package/src/types/datasource.ts +81 -80
- package/src/types/field.ts +2 -2
- package/src/types/field_permission.ts +16 -0
- package/src/types/index.ts +1 -0
- package/src/types/list_view.ts +1 -1
- package/src/types/object.ts +71 -37
- package/src/types/object_dynamic_load.ts +14 -48
- package/src/types/object_permission.ts +1 -1
- package/src/types/schema.ts +11 -14
- package/src/util/convert.ts +130 -0
- package/src/util/index.ts +6 -120
- package/lib/graphql/index.d.ts +0 -3
- package/lib/graphql/index.js +0 -374
- package/lib/graphql/index.js.map +0 -1
- package/lib/graphql/utils.d.ts +0 -7
- package/lib/graphql/utils.js +0 -67
- package/lib/graphql/utils.js.map +0 -1
- package/lib/metadata-register/objectServiceManager.js.map +0 -1
- package/src/graphql/index.ts +0 -361
- package/src/graphql/utils.ts +0 -61
package/src/types/datasource.ts
CHANGED
|
@@ -28,8 +28,7 @@ import {
|
|
|
28
28
|
addAllConfigFiles
|
|
29
29
|
} from '.';
|
|
30
30
|
import { SteedosDriverConfig } from '../driver';
|
|
31
|
-
import { createObjectService } from '../
|
|
32
|
-
import { getObjectDispatcher } from '../services/index';
|
|
31
|
+
import { getObjectDispatcher, createObjectService, createDataSourceService } from '../services/index';
|
|
33
32
|
import path = require('path');
|
|
34
33
|
let Fiber = require('fibers');
|
|
35
34
|
declare var Creator: any;
|
|
@@ -87,6 +86,21 @@ export class SteedosDataSourceType implements Dictionary {
|
|
|
87
86
|
private _locale?: string;
|
|
88
87
|
private _schema: SteedosSchema;
|
|
89
88
|
private _objects: Dictionary<SteedosObjectType> = {};
|
|
89
|
+
private _cacheObjects?: Array<SteedosObjectType> = [];
|
|
90
|
+
public get cacheObjects(): any {
|
|
91
|
+
return this._cacheObjects;
|
|
92
|
+
}
|
|
93
|
+
public set cacheObjects(value: any) {
|
|
94
|
+
this._cacheObjects = value;
|
|
95
|
+
}
|
|
96
|
+
private _service?: any;
|
|
97
|
+
public get service(): any {
|
|
98
|
+
return this._service;
|
|
99
|
+
}
|
|
100
|
+
public set service(value: any) {
|
|
101
|
+
this._service = value;
|
|
102
|
+
}
|
|
103
|
+
|
|
90
104
|
private _objectsConfig: Dictionary<SteedosObjectTypeConfig> = {};
|
|
91
105
|
private _objectsRolesPermission: Dictionary<Dictionary<SteedosObjectPermissionType>> = {};
|
|
92
106
|
private _objectsSpaceRolesPermission: Dictionary<Dictionary<Dictionary<SteedosObjectPermissionType>>> = {};
|
|
@@ -110,10 +124,19 @@ export class SteedosDataSourceType implements Dictionary {
|
|
|
110
124
|
}
|
|
111
125
|
|
|
112
126
|
async getObjects() {
|
|
113
|
-
if(!this.schema.metadataRegister){
|
|
114
|
-
|
|
115
|
-
}
|
|
116
|
-
return await this.schema.metadataRegister.getObjectsConfig(this.name);
|
|
127
|
+
// if(!this.schema.metadataRegister){
|
|
128
|
+
// return this._objects
|
|
129
|
+
// }
|
|
130
|
+
// return await this.schema.metadataRegister.getObjectsConfig(this.name);
|
|
131
|
+
return this.getCacheObjects();
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
getCacheObjects() {
|
|
135
|
+
return this.cacheObjects;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async flushCacheObjects() {
|
|
139
|
+
this.cacheObjects = await this.schema.metadataRegister.getObjectsConfig(this.name);
|
|
117
140
|
}
|
|
118
141
|
|
|
119
142
|
getLocalObjects() {
|
|
@@ -147,7 +170,17 @@ export class SteedosDataSourceType implements Dictionary {
|
|
|
147
170
|
async setObject(objectApiName: string, objectConfig: SteedosObjectTypeConfig) {
|
|
148
171
|
const serviceName = getObjectServiceName(objectApiName)
|
|
149
172
|
let object = new SteedosObjectType(objectApiName, this, objectConfig)
|
|
173
|
+
|
|
150
174
|
this._objectsConfig[objectApiName] = objectConfig;
|
|
175
|
+
|
|
176
|
+
const findIndex = _.findIndex(this.cacheObjects, (item: any) => { return item?.metadata?.name === objectApiName });
|
|
177
|
+
|
|
178
|
+
if (findIndex != -1) {
|
|
179
|
+
this.cacheObjects[findIndex] = Object.assign({ service: { name: serviceName } }, { metadata: objectConfig });
|
|
180
|
+
} else {
|
|
181
|
+
this.cacheObjects.push(Object.assign({ service: { name: serviceName } }, { metadata: objectConfig }));
|
|
182
|
+
}
|
|
183
|
+
|
|
151
184
|
this._objects[objectApiName] = object;
|
|
152
185
|
await createObjectService(this._schema.metadataBroker, serviceName, objectConfig)
|
|
153
186
|
return object;
|
|
@@ -206,71 +239,32 @@ export class SteedosDataSourceType implements Dictionary {
|
|
|
206
239
|
}
|
|
207
240
|
}
|
|
208
241
|
|
|
209
|
-
async
|
|
242
|
+
async initObject(objectConfig) {
|
|
243
|
+
//从本地对象配置中读取触发器配置
|
|
244
|
+
const localObjectConfig = getObjectConfig(objectConfig.name);
|
|
245
|
+
if (localObjectConfig) {
|
|
246
|
+
objectConfig.listeners = localObjectConfig.listeners;
|
|
247
|
+
objectConfig.methods = localObjectConfig.methods;
|
|
248
|
+
}
|
|
249
|
+
if (this.name === "meteor") {
|
|
250
|
+
try {
|
|
251
|
+
const _db = Creator.createCollection(objectConfig)
|
|
252
|
+
Creator.Collections[_db._name] = _db
|
|
253
|
+
} catch (error) {
|
|
254
|
+
// console.log(`error`, error) //此处无需打印日志,@steedos/core 在init Creator 时,会兼容此部分的异常逻辑。
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
await this.setObject(objectConfig.name, objectConfig);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
async initObjects() {
|
|
210
261
|
// 从缓存中加载所有本数据源对象到datasource中
|
|
211
|
-
let objects: Array<any> =
|
|
262
|
+
let objects: Array<any> = this.cacheObjects;
|
|
212
263
|
let self = this;
|
|
213
264
|
for await (const object of _.values(objects)) {
|
|
214
265
|
const objectConfig = object.metadata;
|
|
215
|
-
|
|
216
|
-
const localObjectConfig = getObjectConfig(objectConfig.name);
|
|
217
|
-
if(localObjectConfig){
|
|
218
|
-
objectConfig.listeners = localObjectConfig.listeners;
|
|
219
|
-
objectConfig.methods = localObjectConfig.methods;
|
|
220
|
-
}
|
|
221
|
-
// if(self._schema.metadataBroker){
|
|
222
|
-
// const res = await self._schema.metadataRegister.object(object)
|
|
223
|
-
// if(res){
|
|
224
|
-
// self.setObject(object.name, object);
|
|
225
|
-
// }
|
|
226
|
-
// }else{
|
|
227
|
-
// self.setObject(object.name, object);
|
|
228
|
-
// }
|
|
229
|
-
await self.setObject(objectConfig.name, objectConfig);
|
|
230
|
-
|
|
231
|
-
if(this.name === "default"){
|
|
232
|
-
try {
|
|
233
|
-
const _db = Creator.createCollection(objectConfig)
|
|
234
|
-
Creator.Collections[_db._name] = _db
|
|
235
|
-
} catch (error) {
|
|
236
|
-
// console.log(`error`, error) //此处无需打印日志,@steedos/core 在init Creator 时,会兼容此部分的异常逻辑。
|
|
237
|
-
}
|
|
238
|
-
}
|
|
266
|
+
await self.initObject(objectConfig)
|
|
239
267
|
}
|
|
240
|
-
|
|
241
|
-
// _.each(objects, (object) => {
|
|
242
|
-
// const obj = this.getObject(object.name);
|
|
243
|
-
// if(obj){
|
|
244
|
-
// // 加try catch是因为有错误时不应该影响下一个对象加载
|
|
245
|
-
// try{
|
|
246
|
-
// obj.initMasterDetails();
|
|
247
|
-
// }
|
|
248
|
-
// catch(ex){
|
|
249
|
-
// console.error(ex);
|
|
250
|
-
// }
|
|
251
|
-
// }
|
|
252
|
-
// });
|
|
253
|
-
|
|
254
|
-
// _.each(objects, (object) => {
|
|
255
|
-
// const obj = this.getObject(object.name);
|
|
256
|
-
// if(obj){
|
|
257
|
-
// // 加try catch是因为有错误时不应该影响下一个对象加载
|
|
258
|
-
// try{
|
|
259
|
-
// obj.checkMasterDetails();
|
|
260
|
-
// }
|
|
261
|
-
// catch(ex){
|
|
262
|
-
// console.error(ex);
|
|
263
|
-
// }
|
|
264
|
-
// }
|
|
265
|
-
// });
|
|
266
|
-
|
|
267
|
-
_.each(this.config.objectsRolesPermission, (objectRolesPermission, object_name) => {
|
|
268
|
-
_.each(objectRolesPermission, (objectRolePermission, role_name) => {
|
|
269
|
-
objectRolePermission.name = role_name
|
|
270
|
-
this.setObjectPermission(object_name, objectRolePermission)
|
|
271
|
-
})
|
|
272
|
-
})
|
|
273
|
-
|
|
274
268
|
return true;
|
|
275
269
|
}
|
|
276
270
|
|
|
@@ -436,14 +430,6 @@ export class SteedosDataSourceType implements Dictionary {
|
|
|
436
430
|
return this._schema;
|
|
437
431
|
}
|
|
438
432
|
|
|
439
|
-
buildGraphQLSchema() {
|
|
440
|
-
return this._schema.buildGraphQLSchema();
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
getGraphQLSchema() {
|
|
444
|
-
return this._schema.getGraphQLSchema();
|
|
445
|
-
}
|
|
446
|
-
|
|
447
433
|
async dropEntities() {
|
|
448
434
|
if (this._adapter.dropEntities) {
|
|
449
435
|
return await this._adapter.dropEntities();
|
|
@@ -469,15 +455,30 @@ export class SteedosDataSourceType implements Dictionary {
|
|
|
469
455
|
}
|
|
470
456
|
|
|
471
457
|
async init() {
|
|
472
|
-
await this.
|
|
473
|
-
await this.
|
|
474
|
-
|
|
475
|
-
|
|
458
|
+
// await this.flushCacheObjects();
|
|
459
|
+
// await this.initObjects();
|
|
460
|
+
this.initObjectPermissions();
|
|
461
|
+
if (!this.service) {
|
|
462
|
+
const broker = this._schema.metadataBroker
|
|
463
|
+
this.service = await createDataSourceService(broker, this)
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* 初始化数据源上配置的对象权限。
|
|
469
|
+
*/
|
|
470
|
+
initObjectPermissions() {
|
|
471
|
+
_.each(this.config.objectsRolesPermission, (objectRolesPermission, object_name) => {
|
|
472
|
+
_.each(objectRolesPermission, (objectRolePermission, role_name) => {
|
|
473
|
+
objectRolePermission.name = role_name
|
|
474
|
+
this.setObjectPermission(object_name, objectRolePermission)
|
|
475
|
+
})
|
|
476
|
+
})
|
|
476
477
|
}
|
|
477
478
|
|
|
478
|
-
|
|
479
|
+
initTypeORM() {
|
|
479
480
|
const _objects = {};
|
|
480
|
-
_.map(
|
|
481
|
+
_.map(this.cacheObjects, (item) => {
|
|
481
482
|
if(item && item.metadata){
|
|
482
483
|
_objects[item.metadata.name] = item.metadata
|
|
483
484
|
}
|
package/src/types/field.ts
CHANGED
|
@@ -52,7 +52,7 @@ abstract class SteedosFieldProperties{
|
|
|
52
52
|
object_name?: string
|
|
53
53
|
name?: string
|
|
54
54
|
column_name?: string
|
|
55
|
-
type?: string
|
|
55
|
+
abstract type?: string
|
|
56
56
|
primary?: boolean
|
|
57
57
|
generated?: true
|
|
58
58
|
label?: string
|
|
@@ -88,7 +88,7 @@ abstract class SteedosFieldProperties{
|
|
|
88
88
|
reference_limit?: number
|
|
89
89
|
is_company_limited?: boolean
|
|
90
90
|
system?: string;
|
|
91
|
-
fieldDBType
|
|
91
|
+
abstract fieldDBType: SteedosFieldDBType | string
|
|
92
92
|
formula?: string
|
|
93
93
|
data_type?: string
|
|
94
94
|
formula_blank_value?: string
|
|
@@ -23,4 +23,20 @@ export class FieldPermission {
|
|
|
23
23
|
})
|
|
24
24
|
return result;
|
|
25
25
|
}
|
|
26
|
+
|
|
27
|
+
static async getObjectsFieldsPermissionGroupRole() {
|
|
28
|
+
const permissions = await this.getObjectFieldsPermission('*', '*');
|
|
29
|
+
const result = {};
|
|
30
|
+
_.each(permissions, (permission) => {
|
|
31
|
+
if (!result[permission.object_name]) {
|
|
32
|
+
result[permission.object_name] = {};
|
|
33
|
+
}
|
|
34
|
+
const { permission_set_id, field, editable, readable } = permission.metadata;
|
|
35
|
+
if (!result[permission.object_name][permission_set_id]) {
|
|
36
|
+
result[permission.object_name][permission_set_id] = [];
|
|
37
|
+
}
|
|
38
|
+
result[permission.object_name][permission_set_id].push({ field: field, read: readable, edit: editable })
|
|
39
|
+
})
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
26
42
|
}
|
package/src/types/index.ts
CHANGED
|
@@ -7,6 +7,7 @@ export * from "./dashboard";
|
|
|
7
7
|
export * from "./object";
|
|
8
8
|
export * from "./connection";
|
|
9
9
|
export * from "./object_layouts";
|
|
10
|
+
export * from "./field_permission";
|
|
10
11
|
export { SteedosFieldType, SteedosFieldTypeConfig } from "./field";
|
|
11
12
|
export { SteedosListenerConfig } from './listeners'
|
|
12
13
|
export { SteedosTriggerType } from './trigger'
|
package/src/types/list_view.ts
CHANGED
package/src/types/object.ts
CHANGED
|
@@ -58,9 +58,9 @@ export const getRepeatObjectNameFromPaths = (paths: string[]) => {
|
|
|
58
58
|
|
|
59
59
|
abstract class SteedosObjectProperties {
|
|
60
60
|
_id?: string
|
|
61
|
-
name?: string
|
|
61
|
+
abstract name?: string
|
|
62
62
|
extend?: string
|
|
63
|
-
table_name?: string
|
|
63
|
+
abstract table_name?: string
|
|
64
64
|
label?: string
|
|
65
65
|
icon?: string
|
|
66
66
|
enable_search?: boolean
|
|
@@ -70,11 +70,11 @@ abstract class SteedosObjectProperties {
|
|
|
70
70
|
enable_notes?: boolean
|
|
71
71
|
enable_events?: boolean
|
|
72
72
|
enable_api?: boolean //TODO 未开放功能
|
|
73
|
-
enable_share?: boolean
|
|
74
|
-
enable_instances?: boolean
|
|
73
|
+
abstract enable_share?: boolean
|
|
74
|
+
abstract enable_instances?: boolean
|
|
75
75
|
enable_chatter?: boolean
|
|
76
|
-
enable_audit?: boolean
|
|
77
|
-
enable_trash?: boolean
|
|
76
|
+
abstract enable_audit?: boolean
|
|
77
|
+
abstract enable_trash?: boolean
|
|
78
78
|
enable_space_global?: boolean
|
|
79
79
|
enable_tree?: boolean
|
|
80
80
|
parent_field?: string
|
|
@@ -91,10 +91,10 @@ abstract class SteedosObjectProperties {
|
|
|
91
91
|
// triggers?: object
|
|
92
92
|
sidebar?: object //TODO
|
|
93
93
|
calendar?: object //TODO
|
|
94
|
-
actions?: Dictionary<SteedosActionTypeConfig>
|
|
95
|
-
fields?: Dictionary<SteedosFieldTypeConfig>
|
|
96
|
-
listeners?: Dictionary<SteedosListenerConfig>
|
|
97
|
-
list_views?: Dictionary<SteedosObjectListViewTypeConfig>
|
|
94
|
+
abstract actions?: Dictionary<SteedosActionTypeConfig>
|
|
95
|
+
abstract fields?: Dictionary<SteedosFieldTypeConfig>
|
|
96
|
+
abstract listeners?: Dictionary<SteedosListenerConfig>
|
|
97
|
+
abstract list_views?: Dictionary<SteedosObjectListViewTypeConfig>
|
|
98
98
|
permissions?: Dictionary<SteedosObjectPermissionTypeConfig>
|
|
99
99
|
methods?: Dictionary<Function>
|
|
100
100
|
fields_serial_number?: number
|
|
@@ -107,7 +107,7 @@ export interface SteedosObjectTypeConfig extends SteedosObjectProperties {
|
|
|
107
107
|
name?: string
|
|
108
108
|
isMain?: boolean
|
|
109
109
|
datasource?: string
|
|
110
|
-
fields
|
|
110
|
+
fields?: Dictionary<SteedosFieldTypeConfig>
|
|
111
111
|
actions?: Dictionary<SteedosActionTypeConfig>
|
|
112
112
|
listeners?: Dictionary<SteedosListenerConfig>
|
|
113
113
|
permission_set?: Dictionary<SteedosObjectPermissionTypeConfig> //TODO remove ; 目前为了兼容现有object的定义保留
|
|
@@ -609,7 +609,7 @@ export class SteedosObjectType extends SteedosObjectProperties {
|
|
|
609
609
|
return globalPermission
|
|
610
610
|
}
|
|
611
611
|
|
|
612
|
-
async getUserObjectPermission(userSession: SteedosUserSession) {
|
|
612
|
+
async getUserObjectPermission(userSession: SteedosUserSession, rolesFieldsPermission?: any) {
|
|
613
613
|
|
|
614
614
|
if (!userSession) {
|
|
615
615
|
throw new Error('userSession is required')
|
|
@@ -649,7 +649,9 @@ export class SteedosObjectType extends SteedosObjectProperties {
|
|
|
649
649
|
throw new Error('not find user permission');
|
|
650
650
|
}
|
|
651
651
|
|
|
652
|
-
|
|
652
|
+
if (!rolesFieldsPermission) {
|
|
653
|
+
rolesFieldsPermission = await FieldPermission.getObjectFieldsPermissionGroupRole(this.name);
|
|
654
|
+
}
|
|
653
655
|
|
|
654
656
|
roles.forEach((role) => {
|
|
655
657
|
let rolePermission = objectRolesPermission[role];
|
|
@@ -926,6 +928,13 @@ export class SteedosObjectType extends SteedosObjectProperties {
|
|
|
926
928
|
return await this.callMetadataObjectServiceAction(`getLookupDetailsInfo`, {objectApiName: this.name});
|
|
927
929
|
}
|
|
928
930
|
|
|
931
|
+
/**
|
|
932
|
+
* 此函数返回getDetailsInfo、getMastersInfo、getLookupDetailsInfo 3个请求的结果,用于优化访问速度
|
|
933
|
+
*/
|
|
934
|
+
async getRelationsInfo() {
|
|
935
|
+
return await this.callMetadataObjectServiceAction(`getRelationsInfo`, { objectApiName: this.name });
|
|
936
|
+
}
|
|
937
|
+
|
|
929
938
|
async getRecordPermissions(record, userSession){
|
|
930
939
|
const permissions = await this.getUserObjectPermission(userSession);
|
|
931
940
|
const { userId, company_ids: user_company_ids } = userSession;
|
|
@@ -985,22 +994,39 @@ export class SteedosObjectType extends SteedosObjectProperties {
|
|
|
985
994
|
return permissions
|
|
986
995
|
}
|
|
987
996
|
|
|
988
|
-
async getRecordView(userSession){
|
|
997
|
+
async getRecordView(userSession, context?: any) {
|
|
998
|
+
let objectConfig;
|
|
999
|
+
let layouts;
|
|
1000
|
+
let spaceProcessDefinition;
|
|
1001
|
+
let dbListViews;
|
|
1002
|
+
let rolesFieldsPermission;
|
|
1003
|
+
|
|
1004
|
+
if (context) {
|
|
1005
|
+
objectConfig = context.objectConfig;
|
|
1006
|
+
layouts = context.layouts;
|
|
1007
|
+
spaceProcessDefinition = context.spaceProcessDefinition;
|
|
1008
|
+
dbListViews = context.dbListViews;
|
|
1009
|
+
rolesFieldsPermission = context.rolesFieldsPermission;
|
|
1010
|
+
}
|
|
1011
|
+
|
|
989
1012
|
const lng = userSession.language;
|
|
990
|
-
|
|
991
|
-
|
|
1013
|
+
if (!objectConfig) {
|
|
1014
|
+
const objectMetadataConfig: any = await this.callMetadataObjectServiceAction('get', { objectApiName: this.name });
|
|
1015
|
+
objectConfig = objectMetadataConfig.metadata;
|
|
1016
|
+
}
|
|
992
1017
|
objectConfig.name = this.name
|
|
993
1018
|
objectConfig.datasource = this.datasource.name;
|
|
994
|
-
objectConfig.permissions = await this.getUserObjectPermission(userSession);
|
|
995
|
-
|
|
996
|
-
objectConfig.
|
|
997
|
-
objectConfig.
|
|
998
|
-
|
|
1019
|
+
objectConfig.permissions = await this.getUserObjectPermission(userSession, rolesFieldsPermission);
|
|
1020
|
+
const relationsInfo = await this.getRelationsInfo();
|
|
1021
|
+
objectConfig.details = relationsInfo.details;
|
|
1022
|
+
objectConfig.masters = relationsInfo.masters;
|
|
1023
|
+
objectConfig.lookup_details = relationsInfo.lookup_details;
|
|
999
1024
|
delete objectConfig.db
|
|
1000
1025
|
|
|
1001
1026
|
translationObject(lng, objectConfig.name, objectConfig, true);
|
|
1002
|
-
|
|
1003
|
-
|
|
1027
|
+
if (!layouts) {
|
|
1028
|
+
layouts = await getObjectLayouts(userSession.profile, userSession.spaceId, this.name);
|
|
1029
|
+
}
|
|
1004
1030
|
if(layouts && layouts.length > 0){
|
|
1005
1031
|
const layout = layouts[0];
|
|
1006
1032
|
let _fields = {};
|
|
@@ -1084,24 +1110,31 @@ export class SteedosObjectType extends SteedosObjectProperties {
|
|
|
1084
1110
|
const userObjectFields = objectConfig.fields;
|
|
1085
1111
|
_.each(objectConfig.permissions.field_permissions, (field_permission, field) => {
|
|
1086
1112
|
const { read, edit } = field_permission;
|
|
1087
|
-
if (
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1113
|
+
if (userObjectFields[field]) {
|
|
1114
|
+
if (read) {
|
|
1115
|
+
userObjectFields[field].hidden = false;
|
|
1116
|
+
userObjectFields[field].omit = true;
|
|
1117
|
+
userObjectFields[field].readonly = true;
|
|
1118
|
+
userObjectFields[field].disabled = true;
|
|
1119
|
+
}
|
|
1120
|
+
if (edit) {
|
|
1121
|
+
userObjectFields[field].omit = false;
|
|
1122
|
+
userObjectFields[field].hidden = false;
|
|
1123
|
+
userObjectFields[field].readonly = false;
|
|
1124
|
+
userObjectFields[field].disabled = false;
|
|
1125
|
+
}
|
|
1126
|
+
if (!read && !edit) {
|
|
1127
|
+
delete userObjectFields[field]
|
|
1128
|
+
}
|
|
1098
1129
|
}
|
|
1099
1130
|
})
|
|
1100
1131
|
|
|
1101
1132
|
objectConfig.fields = userObjectFields
|
|
1102
1133
|
|
|
1103
1134
|
// TODO object layout 是否需要控制审批记录显示?
|
|
1104
|
-
|
|
1135
|
+
if (!spaceProcessDefinition) {
|
|
1136
|
+
spaceProcessDefinition = await getObject("process_definition").directFind({ filters: [['space', '=', userSession.spaceId], ['object_name', '=', this.name], ['active', '=', true]] })
|
|
1137
|
+
}
|
|
1105
1138
|
if (spaceProcessDefinition.length > 0) {
|
|
1106
1139
|
objectConfig.enable_process = true
|
|
1107
1140
|
}
|
|
@@ -1113,8 +1146,9 @@ export class SteedosObjectType extends SteedosObjectProperties {
|
|
|
1113
1146
|
delete objectConfig.triggers[key];
|
|
1114
1147
|
}
|
|
1115
1148
|
})
|
|
1116
|
-
|
|
1117
|
-
|
|
1149
|
+
if (!dbListViews) {
|
|
1150
|
+
dbListViews = await getObject("object_listviews").directFind({ filters: [['space', '=', userSession.spaceId], ['object_name', '=', this.name], [['owner', '=', userSession.userId], 'or', ['shared', '=', true]]] })
|
|
1151
|
+
}
|
|
1118
1152
|
objectConfig.list_views = Object.assign({}, objectConfig.list_views)
|
|
1119
1153
|
_.each(dbListViews, function(dbListView){
|
|
1120
1154
|
delete dbListView.created;
|
|
@@ -3,7 +3,7 @@ import path = require('path')
|
|
|
3
3
|
import { SteedosObjectTypeConfig, SteedosObjectPermissionTypeConfig, SteedosActionTypeConfig, getDataSource } from '.'
|
|
4
4
|
// import { isMeteor } from '../util'
|
|
5
5
|
import { Dictionary } from '@salesforce/ts-types';
|
|
6
|
-
import {
|
|
6
|
+
import { addObjectListenerConfig, loadObjectLayouts, loadSourceProfiles, loadSourcePermissionset, loadObjectValidationRules, loadSourceRoles, loadSourceFlowRoles, loadSourceApprovalProcesses, loadSourceWorkflows, loadStandardProfiles, loadStandardPermissionsets, preloadDBObjectFields, preloadDBObjectButtons, preloadDBApps, preloadDBObjectLayouts, preloadDBTabs, preloadDBShareRules, preloadDBRestrictionRules, preloadDBPermissionFields, loadPackageMetadatas } from '../dynamic-load'
|
|
7
7
|
import { transformListenersToTriggers } from '..';
|
|
8
8
|
import { getSteedosSchema } from './schema';
|
|
9
9
|
|
|
@@ -24,6 +24,7 @@ const _routers: Array<any> = [];
|
|
|
24
24
|
const _objectsData: Dictionary<any> = {};
|
|
25
25
|
const delayLoadExtendObjectConfigQueue: Dictionary<any> = {};
|
|
26
26
|
let standardObjectsLoaded: boolean = false;
|
|
27
|
+
let dbMetadataLoaing: boolean = false;
|
|
27
28
|
|
|
28
29
|
const addDelayLoadExtendObjectConfig = function (extend: string, config: SteedosObjectTypeConfig){
|
|
29
30
|
if(!delayLoadExtendObjectConfigQueue[extend]){
|
|
@@ -93,54 +94,12 @@ export const addObjectConfigFiles = async (filePath: string, datasource: string,
|
|
|
93
94
|
if (!datasource)
|
|
94
95
|
datasource = 'meteor'
|
|
95
96
|
|
|
96
|
-
|
|
97
|
-
for await (const element of objectJsons) {
|
|
98
|
-
let startNo = 10;
|
|
99
|
-
_.each(element.fields, function(field){
|
|
100
|
-
if(!_.has(field, 'sort_no')){
|
|
101
|
-
field.sort_no = startNo;
|
|
102
|
-
startNo = startNo + 10;
|
|
103
|
-
}
|
|
104
|
-
})
|
|
105
|
-
if(!element.fields){
|
|
106
|
-
element.fields = {}
|
|
107
|
-
}
|
|
108
|
-
_.each(getLazyLoadFields(element.name), function(field){
|
|
109
|
-
util.extend(element.fields, {[field.name]: field})
|
|
110
|
-
})
|
|
111
|
-
if(!element.actions){
|
|
112
|
-
element.actions = {}
|
|
113
|
-
}
|
|
114
|
-
_.each(getLazyLoadButtons(element.name), function(action){
|
|
115
|
-
util.extend(element.actions, {[action.name]: action})
|
|
116
|
-
})
|
|
117
|
-
let _mf = _.maxBy(_.values(element.fields), function (field) { return field.sort_no; });
|
|
118
|
-
if(_mf && element.name){
|
|
119
|
-
element.fields_serial_number = _mf.sort_no + 10;
|
|
120
|
-
}
|
|
121
|
-
await addObjectConfig(element, datasource, serviceName);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
await loadObjectFields(filePath, serviceName);
|
|
125
|
-
|
|
126
|
-
await loadObjectListViews(filePath, serviceName);
|
|
127
|
-
|
|
128
|
-
await loadObjectButtons(filePath, serviceName);
|
|
129
|
-
|
|
130
|
-
loadObjectTriggers(filePath);
|
|
131
|
-
|
|
132
|
-
await loadObjectActions(filePath, serviceName);
|
|
133
|
-
|
|
134
|
-
loadObjectMethods(filePath); //此功能不支持微服务模式
|
|
97
|
+
await loadPackageMetadatas(filePath, datasource, serviceName)
|
|
135
98
|
|
|
136
99
|
await loadObjectLayouts(filePath, serviceName);
|
|
137
|
-
|
|
138
|
-
await loadObjectPermissions(filePath, serviceName);
|
|
139
|
-
|
|
100
|
+
// await loadObjectPermissions(filePath, serviceName);
|
|
140
101
|
await loadSourceProfiles(filePath, serviceName);
|
|
141
|
-
|
|
142
102
|
await loadSourcePermissionset(filePath, serviceName);
|
|
143
|
-
|
|
144
103
|
loadObjectValidationRules(filePath);
|
|
145
104
|
|
|
146
105
|
loadSourceRoles(filePath);
|
|
@@ -323,10 +282,17 @@ export const removeObjectListenerConfig = (_id, listenTo, when)=>{
|
|
|
323
282
|
}
|
|
324
283
|
}
|
|
325
284
|
|
|
326
|
-
export const loadStandardMetadata = async (serviceName: string, datasourceApiName: string) =>{
|
|
327
|
-
await loadStandardProfiles(serviceName);
|
|
328
|
-
await loadStandardPermissionsets(serviceName);
|
|
285
|
+
export const loadStandardMetadata = async (serviceName: string, datasourceApiName: string) => {
|
|
329
286
|
await loadStandardBaseObjects(serviceName);
|
|
287
|
+
if (dbMetadataLoaing != true) {
|
|
288
|
+
dbMetadataLoaing = true;
|
|
289
|
+
await loadStandardProfiles(serviceName);
|
|
290
|
+
await loadStandardPermissionsets(serviceName);
|
|
291
|
+
await loadDbMetadatas(datasourceApiName);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
export const loadDbMetadatas = async (datasourceApiName: string) => {
|
|
330
296
|
if(datasourceApiName === 'default' || datasourceApiName === 'meteor'){
|
|
331
297
|
const datasource = getDataSource(datasourceApiName)
|
|
332
298
|
if(datasource && datasourceApiName === 'default'){
|
package/src/types/schema.ts
CHANGED
|
@@ -7,7 +7,6 @@ import { getFromContainer } from 'typeorm';
|
|
|
7
7
|
// import { loadCoreValidators } from '../validators';
|
|
8
8
|
// import { loadStandardBaseObjects } from './object_dynamic_load';
|
|
9
9
|
// import { preloadDBObjectFields, preloadDBObjectButtons } from '../dynamic-load';
|
|
10
|
-
import { buildGraphQLSchema } from '../graphql';
|
|
11
10
|
import { MetadataRegister } from '../metadata-register';
|
|
12
11
|
import { MetadataDriver } from '../driver/metadata';
|
|
13
12
|
|
|
@@ -22,7 +21,6 @@ export type SteedosSchemaConfig = {
|
|
|
22
21
|
export class SteedosSchema {
|
|
23
22
|
private _datasources: Dictionary<SteedosDataSourceType> = {};
|
|
24
23
|
private _objectsMap: Dictionary<{ datasourceName: string, filePath?: string }> = {};
|
|
25
|
-
private graphQLSchema: any = null;
|
|
26
24
|
private _broker: any = null;
|
|
27
25
|
private _metadataBroker: any = null;
|
|
28
26
|
metadataRegister: MetadataRegister = null;
|
|
@@ -230,19 +228,18 @@ export class SteedosSchema {
|
|
|
230
228
|
return this._datasources
|
|
231
229
|
}
|
|
232
230
|
|
|
233
|
-
buildGraphQLSchema() {
|
|
234
|
-
this.graphQLSchema = buildGraphQLSchema(this);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
getGraphQLSchema() {
|
|
238
|
-
if (!this.graphQLSchema) {
|
|
239
|
-
this.buildGraphQLSchema();
|
|
240
|
-
}
|
|
241
|
-
return this.graphQLSchema;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
231
|
async getAllObject() {
|
|
245
|
-
|
|
232
|
+
let schemaObjects = [];
|
|
233
|
+
const datasources = this.getDataSources();
|
|
234
|
+
for (const name in datasources) {
|
|
235
|
+
const datasource = datasources[name]
|
|
236
|
+
const datasourceObjects = await datasource.getObjects();
|
|
237
|
+
if (datasourceObjects && datasourceObjects.length > 0) {
|
|
238
|
+
schemaObjects = schemaObjects.concat(datasourceObjects);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return schemaObjects;
|
|
242
|
+
// return await this.metadataBroker.call("objects.getAll");
|
|
246
243
|
}
|
|
247
244
|
}
|
|
248
245
|
|