@steedos/standard-object-database 2.2.55-beta.16
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/main/default/applications/.gitkeep +0 -0
- package/main/default/client/datasources.client.js +7 -0
- package/main/default/client/object_fields.client.js +212 -0
- package/main/default/client/object_layouts.client.js +86 -0
- package/main/default/objectTranslations/_object_reload_logs.en/_object_reload_logs.en.objectTranslation.yml +16 -0
- package/main/default/objectTranslations/_object_reload_logs.zh-CN/_object_reload_logs.zh-CN.objectTranslation.yml +16 -0
- package/main/default/objectTranslations/datasources.en/datasources.en.objectTranslation.yml +121 -0
- package/main/default/objectTranslations/datasources.zh-CN/datasources.zh-CN.objectTranslation.yml +105 -0
- package/main/default/objectTranslations/object_actions.en/object_actions.en.objectTranslation.yml +55 -0
- package/main/default/objectTranslations/object_actions.zh-CN/object_actions.zh-CN.objectTranslation.yml +50 -0
- package/main/default/objectTranslations/object_fields.en/object_fields.en.objectTranslation.yml +335 -0
- package/main/default/objectTranslations/object_fields.zh-CN/object_fields.zh-CN.objectTranslation.yml +312 -0
- package/main/default/objectTranslations/object_layouts.en/object_layouts.en.objectTranslation.yml +72 -0
- package/main/default/objectTranslations/object_layouts.zh-CN/object_layouts.zh-CN.objectTranslation.yml +116 -0
- package/main/default/objectTranslations/object_listviews.en/object_listviews.en.objectTranslation.yml +153 -0
- package/main/default/objectTranslations/object_listviews.zh-CN/object_listviews.zh-CN.objectTranslation.yml +146 -0
- package/main/default/objectTranslations/object_related_list.en/object_related_list.en.objectTranslation.yml +82 -0
- package/main/default/objectTranslations/object_related_list.zh-CN/object_related_list.zh-CN.objectTranslation.yml +82 -0
- package/main/default/objectTranslations/object_triggers.en/object_triggers.en.objectTranslation.yml +30 -0
- package/main/default/objectTranslations/object_triggers.zh-CN/object_triggers.zh-CN.objectTranslation.yml +29 -0
- package/main/default/objectTranslations/object_validation_rules.en/object_validation_rules.en.objectTranslation.yml +40 -0
- package/main/default/objectTranslations/object_validation_rules.zh-CN/object_validation_rules.zh-CN.objectTranslation.yml +38 -0
- package/main/default/objectTranslations/objects.en/objects.en.objectTranslation.yml +219 -0
- package/main/default/objectTranslations/objects.zh-CN/objects.zh-CN.objectTranslation.yml +218 -0
- package/main/default/objects/0.datasources.observe.object.js +83 -0
- package/main/default/objects/0.objects_reload.object.js +26 -0
- package/main/default/objects/1.objects.observe.object.js +61 -0
- package/main/default/objects/10.tabs.observe.object.js +36 -0
- package/main/default/objects/11.restriction_rules.observe.object.js +37 -0
- package/main/default/objects/12.share_rules.observe.object.js +37 -0
- package/main/default/objects/13.permission_fields.observe.object.js +37 -0
- package/main/default/objects/14.object_fields.observe.object.js +44 -0
- package/main/default/objects/15.permission_objects.observe.object.js +44 -0
- package/main/default/objects/2.object_triggers.observe.object.js +35 -0
- package/main/default/objects/3.permission_objects.observe.object.js +29 -0
- package/main/default/objects/4.permission_set.observe.object.js +39 -0
- package/main/default/objects/5.holidays.observe.object.js +30 -0
- package/main/default/objects/6.business_hours.observe.object.js +33 -0
- package/main/default/objects/7.object_actions.observe.object.js +43 -0
- package/main/default/objects/7.object_layouts.observe.object.js +33 -0
- package/main/default/objects/9.apps.observe.object.js +33 -0
- package/main/default/objects/_object_reload_logs.object.yml +10 -0
- package/main/default/objects/datasources.action.js +51 -0
- package/main/default/objects/datasources.core.js +34 -0
- package/main/default/objects/datasources.object.js +168 -0
- package/main/default/objects/datasources.object.yml +113 -0
- package/main/default/objects/object_actions.object.js +152 -0
- package/main/default/objects/object_actions.object.yml +142 -0
- package/main/default/objects/object_fields.action.js +128 -0
- package/main/default/objects/object_fields.function.js +104 -0
- package/main/default/objects/object_fields.object.js +501 -0
- package/main/default/objects/object_fields.object.yml +690 -0
- package/main/default/objects/object_layouts.action.js +31 -0
- package/main/default/objects/object_layouts.layouts.action.js +19 -0
- package/main/default/objects/object_layouts.object.yml +356 -0
- package/main/default/objects/object_listviews.action.js +93 -0
- package/main/default/objects/object_listviews.object.js +100 -0
- package/main/default/objects/object_listviews.object.yml +309 -0
- package/main/default/objects/object_manager.app.todo.yml +11 -0
- package/main/default/objects/object_related_list.object.js +110 -0
- package/main/default/objects/object_related_list.object.yml +208 -0
- package/main/default/objects/object_triggers.core.js +58 -0
- package/main/default/objects/object_triggers.object.js +65 -0
- package/main/default/objects/object_triggers.object.yml +124 -0
- package/main/default/objects/object_validation_rules.action.js +33 -0
- package/main/default/objects/object_validation_rules.object.yml +100 -0
- package/main/default/objects/objects.action.js +157 -0
- package/main/default/objects/objects.core.js +398 -0
- package/main/default/objects/objects.erd.data.function.js +85 -0
- package/main/default/objects/objects.lib.js +42 -0
- package/main/default/objects/objects.object.js +543 -0
- package/main/default/objects/objects.object.yml +512 -0
- package/main/default/objects/objects.tree.js +58 -0
- package/main/default/objects/permission_objects.core.js +75 -0
- package/main/default/permissionsets/.gitkeep +0 -0
- package/main/default/profiles/.gitkeep +0 -0
- package/main/default/tabs/.gitkeep +0 -0
- package/main/default/triggers/datasources.trigger.js +93 -0
- package/main/default/triggers/object_actions.trigger.js +98 -0
- package/main/default/triggers/object_fields.trigger.js +376 -0
- package/main/default/triggers/object_layouts.trigger.js +153 -0
- package/main/default/triggers/object_listviews.trigger.js +139 -0
- package/main/default/triggers/object_triggers.trigger.js +50 -0
- package/main/default/triggers/object_validation_rules.trigger.js +80 -0
- package/main/default/triggers/objects.trigger.js +136 -0
- package/package.json +16 -0
- package/package.service.js +75 -0
- package/public/.md +3 -0
- package/src/.md +3 -0
- package/webapp/.md +1 -0
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
const { getObject, getObjectConfig } = require('@steedos/objectql');
|
|
2
|
+
var objectql = require('@steedos/objectql');
|
|
3
|
+
var yaml = require('js-yaml');
|
|
4
|
+
const _ = require('underscore');
|
|
5
|
+
var objectCore = require('./objects.core.js');
|
|
6
|
+
var objectTree = require('./objects.tree.js');
|
|
7
|
+
const internalBaseObjects = ['base', 'core'];
|
|
8
|
+
const relationalDatabases = ['sqlserver','postgres','oracle','mysql','sqlite'];
|
|
9
|
+
function isCodeObjects(name){
|
|
10
|
+
if(_.include(internalBaseObjects, name)){
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
let objMap = objectql.getSteedosSchema().getObjectMap(name);
|
|
14
|
+
if(objMap && !objMap._id){
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function isRepeatedName(doc) {
|
|
21
|
+
// let datasourceName = objectCore.getDataSourceName(doc);
|
|
22
|
+
if(isCodeObjects(doc.name)){
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
var other;
|
|
27
|
+
other = Creator.getCollection("objects").find({
|
|
28
|
+
_id: {
|
|
29
|
+
$ne: doc._id
|
|
30
|
+
},
|
|
31
|
+
// space: doc.space,
|
|
32
|
+
name: doc.name
|
|
33
|
+
}, {
|
|
34
|
+
fields: {
|
|
35
|
+
_id: 1,
|
|
36
|
+
is_deleted: 1
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
if (other.count() > 0) {
|
|
40
|
+
const otherObjects = other.fetch();
|
|
41
|
+
if(_.find(otherObjects, function(item){
|
|
42
|
+
return item.is_deleted
|
|
43
|
+
})){
|
|
44
|
+
throw new Error('已存在同名对象,请在「已删除」视图中查看')
|
|
45
|
+
}else{
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
function checkName(name,spaceId){
|
|
53
|
+
if(objectql.hasObjectSuffix(name, spaceId, true)){
|
|
54
|
+
name = name.replace(objectql.getObjectSuffix(spaceId, true), '')
|
|
55
|
+
}
|
|
56
|
+
var reg = new RegExp('^[a-z]([a-z0-9]|_(?!_))*[a-z0-9]$');
|
|
57
|
+
if(!reg.test(name)){
|
|
58
|
+
throw new Error("API 名称只能包含小写字母、数字,必须以字母开头,不能以下划线字符结尾或包含两个连续的下划线字符");
|
|
59
|
+
}
|
|
60
|
+
if(name.length > 50){
|
|
61
|
+
throw new Error("名称长度不能大于50个字符");
|
|
62
|
+
}
|
|
63
|
+
return true
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function initObjectPermission(userId, doc){
|
|
67
|
+
let lng = Steedos.locale(userId, true)
|
|
68
|
+
let spaceId = doc.space;
|
|
69
|
+
let psetsAdminId = null;
|
|
70
|
+
let psetsAdminLabel = null;
|
|
71
|
+
let psetsAdmin = Creator.getCollection("permission_set").findOne({space: spaceId, name: 'admin'});
|
|
72
|
+
if(!psetsAdmin){
|
|
73
|
+
psetsAdminLabel = TAPi18n.__(`permission_set_admin`, {}, lng)
|
|
74
|
+
psetsAdminId = Creator.getCollection("permission_set").insert({space: spaceId, name: 'admin', type: 'profile', label: TAPi18n.__(`permission_set_admin`, {}, lng)});
|
|
75
|
+
}else{
|
|
76
|
+
psetsAdminLabel = psetsAdmin.label
|
|
77
|
+
psetsAdminId = psetsAdmin._id
|
|
78
|
+
}
|
|
79
|
+
let psetsUserId = null;
|
|
80
|
+
let psetsUserLabel = null;
|
|
81
|
+
let psetsUser = Creator.getCollection("permission_set").findOne({space: spaceId, name: 'user'});
|
|
82
|
+
if(!psetsUser){
|
|
83
|
+
psetsUserLabel = TAPi18n.__(`permission_set_user`, {}, lng)
|
|
84
|
+
psetsUserId = Creator.getCollection("permission_set").insert({space: spaceId, name: 'user', type: 'profile', label: TAPi18n.__(`permission_set_user`, {}, lng)});
|
|
85
|
+
}else{
|
|
86
|
+
psetsUserLabel = psetsUser.label
|
|
87
|
+
psetsUserId = psetsUser._id;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
Creator.getCollection("permission_objects").insert(Object.assign({}, Creator.getObject("base").permission_set.user, {
|
|
91
|
+
name: doc.label + '.' + psetsUserLabel,
|
|
92
|
+
permission_set_id : psetsUserId,
|
|
93
|
+
object_name : doc.name,
|
|
94
|
+
space: doc.space
|
|
95
|
+
}));
|
|
96
|
+
|
|
97
|
+
Creator.getCollection("permission_objects").insert(Object.assign({}, Creator.getObject("base").permission_set.admin, {
|
|
98
|
+
name: doc.label + '.' + psetsAdminLabel,
|
|
99
|
+
permission_set_id : psetsAdminId,
|
|
100
|
+
object_name : doc.name,
|
|
101
|
+
space: doc.space
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function getObjectName(datasource, objectName, spaceId, oldObjectName){
|
|
106
|
+
if(datasource && datasource != 'default'){
|
|
107
|
+
return objectName;
|
|
108
|
+
}else{
|
|
109
|
+
if(objectql.hasObjectSuffix(objectName, spaceId)){
|
|
110
|
+
return objectName;
|
|
111
|
+
}else{
|
|
112
|
+
return objectql._makeNewObjectName(objectName, spaceId, oldObjectName);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function isRelationalDatabase(object){
|
|
118
|
+
var datasource = objectCore.getDataSource(object);
|
|
119
|
+
if(datasource){
|
|
120
|
+
return _.include(relationalDatabases, datasource.driver)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function canEnable(object){
|
|
125
|
+
if(isRelationalDatabase(object)){
|
|
126
|
+
if(!object.fields || !_.isObject(object.fields)){
|
|
127
|
+
return false
|
|
128
|
+
}else{
|
|
129
|
+
var hasPrimary = false;
|
|
130
|
+
_.each(object.fields, function(field){
|
|
131
|
+
if(field.primary){
|
|
132
|
+
hasPrimary = true;
|
|
133
|
+
}
|
|
134
|
+
})
|
|
135
|
+
// console.log('hasPrimary', hasPrimary);
|
|
136
|
+
return hasPrimary
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Creator.Objects.objects.actions = {
|
|
143
|
+
// show_object: {
|
|
144
|
+
// label: "Preview",
|
|
145
|
+
// visible: true,
|
|
146
|
+
// on: "record",
|
|
147
|
+
// todo: function (object_name, record_id, item_element) {
|
|
148
|
+
// var record = this.record || Creator.getObjectById(record_id);
|
|
149
|
+
// if(!record){
|
|
150
|
+
// return toastr.error("未找到记录");
|
|
151
|
+
// }
|
|
152
|
+
|
|
153
|
+
// if(record.is_enable === false){
|
|
154
|
+
// return toastr.warning("请先启动对象");
|
|
155
|
+
// }
|
|
156
|
+
|
|
157
|
+
// if(record.datasource && record.datasource != 'default'){
|
|
158
|
+
// var datasource = Creator.odata.get('datasources', record.datasource, 'is_enable');
|
|
159
|
+
// if(!datasource){
|
|
160
|
+
// return toastr.error("未找到数据源");
|
|
161
|
+
// }
|
|
162
|
+
// if(!datasource.is_enable){
|
|
163
|
+
// return toastr.warning("请先启动数据源");
|
|
164
|
+
// }
|
|
165
|
+
// }
|
|
166
|
+
|
|
167
|
+
// var allViews = Creator.odata.query('object_listviews', {$select: '_id', $filter: `(((contains(tolower(object_name),'${record.name}'))) and ((contains(tolower(name),'all'))))`}, true);
|
|
168
|
+
|
|
169
|
+
// if(allViews && allViews.length > 0){
|
|
170
|
+
// Steedos.openWindow(Creator.getRelativeUrl("/app/-/" + record.name + "/grid/" + allViews[0]._id))
|
|
171
|
+
// }else{
|
|
172
|
+
// Steedos.openWindow(Creator.getRelativeUrl("/app/-/" + record.name + "/grid/all"))
|
|
173
|
+
// }
|
|
174
|
+
// }
|
|
175
|
+
// },
|
|
176
|
+
// copy_odata: {
|
|
177
|
+
// label: "Copy OData URL",
|
|
178
|
+
// visible: true,
|
|
179
|
+
// on: "record",
|
|
180
|
+
// todo: function (object_name, record_id, item_element) {
|
|
181
|
+
// var clipboard, o_name, path, record;
|
|
182
|
+
// record = this.record || Creator.getObjectById(record_id);
|
|
183
|
+
// //enable_api 属性未开放
|
|
184
|
+
// if ((record != null ? record.enable_api : void 0) || true) {
|
|
185
|
+
// o_name = record != null ? record.name : void 0;
|
|
186
|
+
// path = SteedosOData.getODataPath(Session.get("spaceId"), o_name);
|
|
187
|
+
// item_element.attr('data-clipboard-text', path);
|
|
188
|
+
// if (!item_element.attr('data-clipboard-new')) {
|
|
189
|
+
// clipboard = new Clipboard(item_element[0]);
|
|
190
|
+
// item_element.attr('data-clipboard-new', true);
|
|
191
|
+
// clipboard.on('success', function (e) {
|
|
192
|
+
// return toastr.success('复制成功');
|
|
193
|
+
// });
|
|
194
|
+
// clipboard.on('error', function (e) {
|
|
195
|
+
// toastr.error('复制失败');
|
|
196
|
+
// return console.error("e");
|
|
197
|
+
// });
|
|
198
|
+
// if (item_element[0].tagName === 'LI' || item_element.hasClass('view-action')) {
|
|
199
|
+
// return item_element.trigger("click");
|
|
200
|
+
// }
|
|
201
|
+
// }
|
|
202
|
+
// } else {
|
|
203
|
+
// return toastr.error('复制失败: 未启用API');
|
|
204
|
+
// }
|
|
205
|
+
// }
|
|
206
|
+
// }
|
|
207
|
+
// }
|
|
208
|
+
|
|
209
|
+
function allowChangeObject(){
|
|
210
|
+
var config = objectql.getSteedosConfig();
|
|
211
|
+
if(config.tenant && config.tenant.saas){
|
|
212
|
+
return false
|
|
213
|
+
}else{
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function onChangeObjectName(oldName, newDoc){
|
|
219
|
+
//修改字段
|
|
220
|
+
Creator.getCollection("object_fields").update({space: newDoc.space, object: oldName}, {$set: {object: newDoc.name}}, {
|
|
221
|
+
multi: true
|
|
222
|
+
});
|
|
223
|
+
//修改视图
|
|
224
|
+
Creator.getCollection("object_listviews").direct.update({space: newDoc.space, object_name: oldName}, {$set: {object_name: newDoc.name}}, {
|
|
225
|
+
multi: true
|
|
226
|
+
});
|
|
227
|
+
//修改权限
|
|
228
|
+
Creator.getCollection("permission_objects").direct.update({space: newDoc.space, object_name: oldName}, {$set: {object_name: newDoc.name}}, {
|
|
229
|
+
multi: true
|
|
230
|
+
});
|
|
231
|
+
//修改action
|
|
232
|
+
Creator.getCollection("object_actions").direct.update({space: newDoc.space, object: oldName}, {$set: {object: newDoc.name}}, {
|
|
233
|
+
multi: true
|
|
234
|
+
});
|
|
235
|
+
//修改trigger
|
|
236
|
+
Creator.getCollection("object_triggers").direct.update({space: newDoc.space, object: oldName}, {$set: {object: newDoc.name}}, {
|
|
237
|
+
multi: true
|
|
238
|
+
});
|
|
239
|
+
//字段表中的reference_to
|
|
240
|
+
Creator.getCollection("object_fields").update({space: newDoc.space, reference_to: oldName}, {$set: {reference_to: newDoc.name}}, {
|
|
241
|
+
multi: true
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
// TODO 确认是否已处理所有相关子表
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function beforeRemoveObject(doc){
|
|
248
|
+
const objectName = doc.name;
|
|
249
|
+
const obj = getObject(objectName);
|
|
250
|
+
if(obj && obj.details && obj.details.length){
|
|
251
|
+
throw new Meteor.Error(500, `不能删除该对象,因为在已知的主表子表关系中它是以下对象的主对象:${obj.details}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
function beforeRestoreObject(doc){
|
|
256
|
+
let fields = Creator.getCollection("object_fields").find({
|
|
257
|
+
object: doc.name,
|
|
258
|
+
space: doc.space,
|
|
259
|
+
type: "master_detail"
|
|
260
|
+
}, {
|
|
261
|
+
fields: {
|
|
262
|
+
reference_to: 1
|
|
263
|
+
}
|
|
264
|
+
}).fetch();
|
|
265
|
+
_.each(fields, (field)=>{
|
|
266
|
+
if(field.reference_to && _.isString(field.reference_to)){
|
|
267
|
+
let exist = false;
|
|
268
|
+
try{
|
|
269
|
+
exist = !!getObject(field.reference_to);
|
|
270
|
+
}
|
|
271
|
+
catch(ex){
|
|
272
|
+
exist = false;
|
|
273
|
+
}
|
|
274
|
+
if(!exist){
|
|
275
|
+
throw new Meteor.Error(500, `不能还原该对象,因为在已知的主表子表关系中以下主对象未还原:${field.reference_to}`);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
let objectTriggers = {
|
|
282
|
+
"before.insert.server.objects": {
|
|
283
|
+
on: "server",
|
|
284
|
+
when: "before.insert",
|
|
285
|
+
todo: function (userId, doc) {
|
|
286
|
+
if(!allowChangeObject()){
|
|
287
|
+
throw new Meteor.Error(500, "华炎云服务不包含自定义业务对象的功能,请部署私有云版本");
|
|
288
|
+
}
|
|
289
|
+
checkName(doc.name, doc.space);
|
|
290
|
+
doc.name = getObjectName(doc.datasource, doc.name, doc.space);
|
|
291
|
+
if (isRepeatedName(doc)) {
|
|
292
|
+
throw new Meteor.Error(500, "对象名称不能重复");
|
|
293
|
+
}
|
|
294
|
+
doc.fields_serial_number = 100;
|
|
295
|
+
// if(isRelationalDatabase(doc)){
|
|
296
|
+
// doc.is_enable = false;
|
|
297
|
+
// }
|
|
298
|
+
|
|
299
|
+
doc.custom = true;
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
"after.insert.server.objects": {
|
|
303
|
+
on: "server",
|
|
304
|
+
when: "after.insert",
|
|
305
|
+
todo: function (userId, doc) {
|
|
306
|
+
//新增object时,默认新建一个name字段
|
|
307
|
+
Creator.getCollection("object_fields").insert({
|
|
308
|
+
object: doc.name,
|
|
309
|
+
owner: userId,
|
|
310
|
+
_name: "name",
|
|
311
|
+
label: "名称",
|
|
312
|
+
space: doc.space,
|
|
313
|
+
type: "text",
|
|
314
|
+
required: true,
|
|
315
|
+
index: true,
|
|
316
|
+
searchable: true
|
|
317
|
+
});
|
|
318
|
+
// Creator.getCollection("object_fields").insert({
|
|
319
|
+
// object: doc.name,
|
|
320
|
+
// owner: userId,
|
|
321
|
+
// _name: "owner",
|
|
322
|
+
// label: "所有者",
|
|
323
|
+
// space: doc.space,
|
|
324
|
+
// type: "lookup",
|
|
325
|
+
// reference_to: "users",
|
|
326
|
+
// sortable: true,
|
|
327
|
+
// index: true,
|
|
328
|
+
// defaultValue: "{userId}",
|
|
329
|
+
// omit: true,
|
|
330
|
+
// hidden: true
|
|
331
|
+
// });
|
|
332
|
+
Creator.getCollection("object_listviews").insert({
|
|
333
|
+
name: "all",
|
|
334
|
+
label: "所有",
|
|
335
|
+
space: doc.space,
|
|
336
|
+
owner: userId,
|
|
337
|
+
object_name: doc.name,
|
|
338
|
+
shared: true,
|
|
339
|
+
filter_scope: "space",
|
|
340
|
+
columns: [{field: 'name'}]
|
|
341
|
+
});
|
|
342
|
+
Creator.getCollection("object_listviews").insert({
|
|
343
|
+
name: "recent",
|
|
344
|
+
label: "最近查看",
|
|
345
|
+
space: doc.space,
|
|
346
|
+
owner: userId,
|
|
347
|
+
object_name: doc.name,
|
|
348
|
+
shared: true,
|
|
349
|
+
filter_scope: "space",
|
|
350
|
+
columns: [{field: 'name'}]
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
initObjectPermission(userId, doc);
|
|
354
|
+
}
|
|
355
|
+
},
|
|
356
|
+
"before.update.server.objects": {
|
|
357
|
+
on: "server",
|
|
358
|
+
when: "before.update",
|
|
359
|
+
todo: function (userId, doc, fieldNames, modifier, options) {
|
|
360
|
+
if(!allowChangeObject()){
|
|
361
|
+
throw new Meteor.Error(500, "华炎云服务不包含自定义业务对象的功能,请部署私有云版本");
|
|
362
|
+
}
|
|
363
|
+
modifier.$set = modifier.$set || {}
|
|
364
|
+
|
|
365
|
+
if(!doc.is_deleted && modifier.$set.is_deleted){
|
|
366
|
+
beforeRemoveObject(doc);
|
|
367
|
+
}
|
|
368
|
+
else if(doc.is_deleted && !modifier.$set.is_deleted){
|
|
369
|
+
beforeRestoreObject(doc);
|
|
370
|
+
}
|
|
371
|
+
if(modifier.$set.is_enable){
|
|
372
|
+
let fields = doc.fields;
|
|
373
|
+
if (!fields) {
|
|
374
|
+
fields = Creator.getCollection("object_fields").find({space: doc.space, object: doc.name}).fetch();
|
|
375
|
+
}
|
|
376
|
+
if(!canEnable({fields: fields, datasource: modifier.$set.datasource || doc.datasource})){
|
|
377
|
+
// throw new Meteor.Error(500, "不能启用对象,请先配置主键字段");
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
if ((modifier.$set.name && doc.name !== modifier.$set.name) || modifier.$set.datasource && doc.datasource !== modifier.$set.datasource) {
|
|
382
|
+
checkName(modifier.$set.name || doc.name);
|
|
383
|
+
modifier.$set.name = getObjectName(modifier.$set.datasource || doc.datasource, modifier.$set.name || doc.name, doc.space, doc.name);
|
|
384
|
+
if (isRepeatedName({_id: doc._id, name: modifier.$set.name || doc.name, datasource: modifier.$set.datasource || doc.datasource})) {
|
|
385
|
+
throw new Meteor.Error(500, "对象名称不能重复");
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
if (modifier.$set) {
|
|
389
|
+
modifier.$set.custom = true;
|
|
390
|
+
}
|
|
391
|
+
if (modifier.$unset && modifier.$unset.custom) {
|
|
392
|
+
delete modifier.$unset.custom;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
},
|
|
396
|
+
"after.update.server.objects": {
|
|
397
|
+
on: "server",
|
|
398
|
+
when: "after.update",
|
|
399
|
+
todo: function (userId, doc, fieldNames, modifier, options) {
|
|
400
|
+
var set = modifier.$set || {}
|
|
401
|
+
if((set.name || set.datasource) && this.previous.name != doc.name){
|
|
402
|
+
onChangeObjectName(this.previous.name, doc);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
},
|
|
406
|
+
"before.remove.server.objects": {
|
|
407
|
+
on: "server",
|
|
408
|
+
when: "before.remove",
|
|
409
|
+
todo: function (userId, doc) {
|
|
410
|
+
if(!allowChangeObject()){
|
|
411
|
+
throw new Meteor.Error(500, "华炎云服务不包含自定义业务对象的功能,请部署私有云版本");
|
|
412
|
+
}
|
|
413
|
+
beforeRemoveObject(doc);
|
|
414
|
+
// var documents, object_collections;
|
|
415
|
+
// if (doc.app_unique_id && doc.app_version) {
|
|
416
|
+
// return;
|
|
417
|
+
// }
|
|
418
|
+
// object_collections = Creator.getCollection(doc.name, doc.space);
|
|
419
|
+
// documents = object_collections.find({}, {
|
|
420
|
+
// fields: {
|
|
421
|
+
// _id: 1
|
|
422
|
+
// }
|
|
423
|
+
// });
|
|
424
|
+
// if (documents.count() > 0) {
|
|
425
|
+
// throw new Meteor.Error(500, `对象(${doc.name})中已经有记录,请先删除记录后, 再删除此对象`);
|
|
426
|
+
// }
|
|
427
|
+
}
|
|
428
|
+
},
|
|
429
|
+
"after.remove.server.objects": {
|
|
430
|
+
on: "server",
|
|
431
|
+
when: "after.remove",
|
|
432
|
+
todo: function (userId, doc) {
|
|
433
|
+
|
|
434
|
+
if(!objectql.hasObjectSuffix(doc.name, doc.space) && !doc.datasource){
|
|
435
|
+
console.warn('warn: Not remove. Invalid custom object -> ', doc.name);
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
//删除object 后,自动删除fields、actions、triggers、permission_objects
|
|
440
|
+
Creator.getCollection("object_fields").direct.remove({
|
|
441
|
+
object: doc.name,
|
|
442
|
+
space: doc.space
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
Creator.getCollection("object_listviews").direct.remove({
|
|
446
|
+
object_name: doc.name,
|
|
447
|
+
space: doc.space
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
Creator.getCollection("object_actions").direct.remove({
|
|
451
|
+
object: doc.name,
|
|
452
|
+
space: doc.space
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
Creator.getCollection("object_layouts").direct.remove({
|
|
456
|
+
object_name: doc.name,
|
|
457
|
+
space: doc.space
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
Creator.getCollection("object_triggers").direct.remove({
|
|
461
|
+
object: doc.name,
|
|
462
|
+
space: doc.space
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
Creator.getCollection("permission_objects").direct.remove({
|
|
466
|
+
object_name: doc.name,
|
|
467
|
+
space: doc.space
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
Creator.getCollection("permission_fields").direct.remove({
|
|
471
|
+
object_name: doc.name,
|
|
472
|
+
space: doc.space
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
Creator.getCollection("object_workflows").direct.remove({
|
|
476
|
+
object_name: doc.name,
|
|
477
|
+
space: doc.space
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
Creator.getCollection("object_validation_rules").direct.remove({
|
|
481
|
+
object_name: doc.name,
|
|
482
|
+
space: doc.space
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
Creator.getCollection("restriction_rules").direct.remove({
|
|
486
|
+
object_name: doc.name,
|
|
487
|
+
space: doc.space
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
Creator.getCollection("share_rules").direct.remove({
|
|
491
|
+
object_name: doc.name,
|
|
492
|
+
space: doc.space
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
if(Creator.getCollection("process")){
|
|
496
|
+
Creator.getCollection("process").direct.remove({
|
|
497
|
+
object_name: doc.name,
|
|
498
|
+
space: doc.space
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
Creator.getCollection("pages").direct.remove({
|
|
503
|
+
object_name: doc.name,
|
|
504
|
+
space: doc.space
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
Creator.getCollection("tabs").direct.remove({
|
|
508
|
+
object: doc.name,
|
|
509
|
+
space: doc.space
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
},
|
|
513
|
+
// "after.update.server.dynamic_load": {
|
|
514
|
+
// on: "server",
|
|
515
|
+
// when: "after.update",
|
|
516
|
+
// todo: function (userId, doc, fieldNames, modifier, options) {
|
|
517
|
+
// loadObject(doc);
|
|
518
|
+
// }
|
|
519
|
+
// }
|
|
520
|
+
|
|
521
|
+
}
|
|
522
|
+
_.each(Creator.Objects.objects.triggers, function(v, k){
|
|
523
|
+
if(k.endsWith('_afterInsert')){
|
|
524
|
+
objectTriggers[k] = v
|
|
525
|
+
}
|
|
526
|
+
})
|
|
527
|
+
|
|
528
|
+
Creator.Objects.objects.triggers = Object.assign(Creator.Objects.objects.triggers || {}, objectTriggers);
|
|
529
|
+
|
|
530
|
+
// Creator.Objects['objects'].methods = {
|
|
531
|
+
// export_yml: async function (req, res) {
|
|
532
|
+
// return Fiber(function () {
|
|
533
|
+
// let { _id } = req.params
|
|
534
|
+
// let obj = Creator.getCollection("objects").findOne({_id: _id})
|
|
535
|
+
// let dataStr = yaml.safeDump(obj);
|
|
536
|
+
// let fileName = obj.name;
|
|
537
|
+
// res.setHeader('Content-type', 'application/x-msdownload');
|
|
538
|
+
// res.setHeader('Content-Disposition', 'attachment;filename='+encodeURI(fileName)+'.object.yml');
|
|
539
|
+
// res.end(dataStr);
|
|
540
|
+
// }).run();
|
|
541
|
+
|
|
542
|
+
// }
|
|
543
|
+
// }
|