@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,153 @@
|
|
|
1
|
+
const _ = require("underscore");
|
|
2
|
+
const objectql = require('@steedos/objectql');
|
|
3
|
+
const auth = require('@steedos/auth');
|
|
4
|
+
const InternalData = require('@steedos/standard-objects').internalData;
|
|
5
|
+
const util = require('@steedos/standard-objects').util
|
|
6
|
+
function check(objectName, profiles, id){
|
|
7
|
+
let query = {
|
|
8
|
+
object_name: objectName,
|
|
9
|
+
profiles: {$in: profiles}
|
|
10
|
+
}
|
|
11
|
+
if(id){
|
|
12
|
+
query._id = {$ne: id}
|
|
13
|
+
}
|
|
14
|
+
let count = Creator.getCollection("object_layouts").find(query).count();
|
|
15
|
+
|
|
16
|
+
if(count > 0){
|
|
17
|
+
throw new Error("同一个对象、简档只能有一条记录");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const getInternalLatouts = async function(sourceLayouts, filters){
|
|
22
|
+
let collection = await objectql.getObject("object_layouts");
|
|
23
|
+
let dbLayouts = await collection.directFind({filters, fields:['_id', 'name']});
|
|
24
|
+
let layouts = [];
|
|
25
|
+
|
|
26
|
+
if(!filters.is_system){
|
|
27
|
+
_.forEach(sourceLayouts, function(doc){
|
|
28
|
+
if(!_.find(dbLayouts, function(p){
|
|
29
|
+
return p.name === doc.name
|
|
30
|
+
})){
|
|
31
|
+
layouts.push(doc);
|
|
32
|
+
}
|
|
33
|
+
})
|
|
34
|
+
}
|
|
35
|
+
return layouts;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
module.exports = {
|
|
39
|
+
beforeInsert: async function(){
|
|
40
|
+
let doc = this.doc
|
|
41
|
+
check(doc.object_name, doc.profiles);
|
|
42
|
+
|
|
43
|
+
await util.checkAPIName(this.object_name, 'name', this.doc.name, undefined, [['is_system','!=', true], ['object_name','=', doc.object_name]]);
|
|
44
|
+
|
|
45
|
+
if(doc.fields){
|
|
46
|
+
_.each(doc.fields, function(field){
|
|
47
|
+
if(field && field.required && field.readonly){
|
|
48
|
+
field.readonly = false
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
beforeUpdate: async function(){
|
|
54
|
+
let doc = this.doc
|
|
55
|
+
let id = this.id
|
|
56
|
+
let record = Creator.getCollection("object_layouts").findOne({_id: id}) || {};
|
|
57
|
+
check(doc.object_name || record.object_name, doc.profiles || record.profiles, id);
|
|
58
|
+
if (_.has(doc, 'name')) {
|
|
59
|
+
await util.checkAPIName(this.object_name, 'name', doc.name, this.id, [['is_system','!=', true], ['object_name','=', doc.object_name || record.object_name]]);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if(doc.fields){
|
|
63
|
+
_.each(doc.fields, function(field){
|
|
64
|
+
if(field && field.required && field.readonly){
|
|
65
|
+
field.readonly = false
|
|
66
|
+
}
|
|
67
|
+
})
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
afterFind: async function(){
|
|
71
|
+
let filters = InternalData.parserFilters(this.query.filters)
|
|
72
|
+
let layouts = []
|
|
73
|
+
if(filters._id && !filters._id.$ne){
|
|
74
|
+
let id = filters._id
|
|
75
|
+
id = id.replace(/\\/g, '');
|
|
76
|
+
let objectName = id.substr(0, id.indexOf("."));
|
|
77
|
+
if(objectName){
|
|
78
|
+
let layout = await InternalData.getObjectLayout(id);
|
|
79
|
+
if(layout){
|
|
80
|
+
layouts = [layout]
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}else if(filters.object_name){
|
|
84
|
+
layouts = await InternalData.getObjectLayouts(filters.object_name, this.spaceId);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
layouts = await getInternalLatouts(layouts, filters);
|
|
88
|
+
|
|
89
|
+
if(layouts){
|
|
90
|
+
this.data.values = this.data.values.concat(_.filter(layouts, function(layout){return layout._id && layout._id.indexOf('.') > 0 }))
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
afterAggregate: async function(){
|
|
94
|
+
let filters = InternalData.parserFilters(this.query.filters)
|
|
95
|
+
let layouts = []
|
|
96
|
+
if(filters._id && !filters._id.$ne){
|
|
97
|
+
let id = filters._id
|
|
98
|
+
id = id.replace(/\\/g, '');
|
|
99
|
+
let objectName = id.substr(0, id.indexOf("."));
|
|
100
|
+
if(objectName){
|
|
101
|
+
let layout = await InternalData.getObjectLayout(id);
|
|
102
|
+
if(layout){
|
|
103
|
+
layouts = [layout]
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}else if(filters.object_name){
|
|
107
|
+
layouts = await InternalData.getObjectLayouts(filters.object_name, this.spaceId);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
layouts = await getInternalLatouts(layouts, filters);
|
|
111
|
+
|
|
112
|
+
if(layouts){
|
|
113
|
+
this.data.values = this.data.values.concat(_.filter(layouts, function(layout){return layout._id && layout._id.indexOf('.') > 0 }))
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
afterCount: async function(){
|
|
117
|
+
// let result = await objectql.getObject('object_layouts').find(this.query, await auth.getSessionByUserId(this.userId, this.spaceId))
|
|
118
|
+
// this.data.values = result.length;
|
|
119
|
+
let filters = InternalData.parserFilters(this.query.filters)
|
|
120
|
+
let layouts = []
|
|
121
|
+
if(filters._id && !filters._id.$ne){
|
|
122
|
+
let id = filters._id
|
|
123
|
+
id = id.replace(/\\/g, '');
|
|
124
|
+
let objectName = id.substr(0, id.indexOf("."));
|
|
125
|
+
if(objectName){
|
|
126
|
+
let layout = await InternalData.getObjectLayout(id);
|
|
127
|
+
if(layout){
|
|
128
|
+
layouts = [layout]
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}else if(filters.object_name){
|
|
132
|
+
layouts = await InternalData.getObjectLayouts(filters.object_name, this.spaceId);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
layouts = await getInternalLatouts(layouts, filters);
|
|
136
|
+
|
|
137
|
+
if(layouts){
|
|
138
|
+
this.data.values = this.data.values + _.filter(layouts, function(layout){return layout._id && layout._id.indexOf('.') > 0 }).length
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
afterFindOne: async function(){
|
|
142
|
+
if(_.isEmpty(this.data.values)){
|
|
143
|
+
let id = this.id
|
|
144
|
+
let objectName = id.substr(0, id.indexOf("."));
|
|
145
|
+
if(objectName){
|
|
146
|
+
let layout = await InternalData.getObjectLayout(id);
|
|
147
|
+
if(layout){
|
|
148
|
+
this.data.values = layout;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
const InternalData = require('@steedos/standard-objects').internalData;
|
|
2
|
+
const util = require('@steedos/standard-objects').util;
|
|
3
|
+
const objectql = require('@steedos/objectql');
|
|
4
|
+
|
|
5
|
+
const getInternalListviews = async function(sourceListviews, filters, is_system){
|
|
6
|
+
let collection = await objectql.getObject("object_listviews");
|
|
7
|
+
let dbListviews = await collection.directFind({filters, fields:['_id', 'name']});
|
|
8
|
+
let listviews = [];
|
|
9
|
+
|
|
10
|
+
if(!is_system){
|
|
11
|
+
_.forEach(sourceListviews, function(doc){
|
|
12
|
+
if(!_.find(dbListviews, function(p){
|
|
13
|
+
return p.name === doc.name
|
|
14
|
+
})){
|
|
15
|
+
listviews.push(doc);
|
|
16
|
+
}
|
|
17
|
+
})
|
|
18
|
+
}
|
|
19
|
+
return listviews;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = {
|
|
23
|
+
beforeInsert: async function () {
|
|
24
|
+
await util.checkAPIName(this.object_name, 'name', this.doc.name, undefined, [['is_system','!=', true], ['object_name','=', this.doc.object_name]]);
|
|
25
|
+
|
|
26
|
+
},
|
|
27
|
+
beforeUpdate: async function () {
|
|
28
|
+
const oldDoc = await objectql.getObject(this.object_name).findOne(this.id)
|
|
29
|
+
let name = oldDoc.name,object_name = oldDoc.object_name;
|
|
30
|
+
if(_.has(this.doc, 'name')){
|
|
31
|
+
name = this.doc.name
|
|
32
|
+
}
|
|
33
|
+
if(_.has(this.doc, 'object_name')){
|
|
34
|
+
object_name = this.doc.object_name
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if(oldDoc.name === 'all' && oldDoc.name != name){
|
|
38
|
+
throw new Error('禁止修改「all」视图的API Name')
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
await util.checkAPIName(this.object_name, 'name', name, this.id, [['is_system','!=', true], ['object_name','=', object_name]]);
|
|
42
|
+
},
|
|
43
|
+
afterFind: async function(){
|
|
44
|
+
let filters = InternalData.parserFilters(this.query.filters)
|
|
45
|
+
let views = []
|
|
46
|
+
if(filters._id && !filters._id.$ne){
|
|
47
|
+
let id = filters._id
|
|
48
|
+
id = id.replace(/\\/g, '');
|
|
49
|
+
if(_.isString(id)){
|
|
50
|
+
let objectName = id.substr(0, id.indexOf("."));
|
|
51
|
+
if(objectName){
|
|
52
|
+
let view = await InternalData.getObjectListView(objectName, this.userId, id);
|
|
53
|
+
if(view){
|
|
54
|
+
views = [view];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}else if(filters.object_name){
|
|
59
|
+
views = await InternalData.getObjectListViews(filters.object_name, this.userId);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
views = await getInternalListviews(views, this.query.filters, filters.is_system);
|
|
63
|
+
|
|
64
|
+
if(views){
|
|
65
|
+
this.data.values = this.data.values.concat(views)
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
afterAggregate: async function(){
|
|
69
|
+
let filters = InternalData.parserFilters(this.query.filters)
|
|
70
|
+
let views = []
|
|
71
|
+
if(filters._id && !filters._id.$ne){
|
|
72
|
+
let id = filters._id
|
|
73
|
+
id = id.replace(/\\/g, '');
|
|
74
|
+
if(_.isString(id)){
|
|
75
|
+
let objectName = id.substr(0, id.indexOf("."));
|
|
76
|
+
if(objectName){
|
|
77
|
+
let view = await InternalData.getObjectListView(objectName, this.userId, id);
|
|
78
|
+
if(view){
|
|
79
|
+
views = [view];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}else if(filters.object_name){
|
|
84
|
+
views = await InternalData.getObjectListViews(filters.object_name, this.userId);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
views = await getInternalListviews(views, this.query.filters, filters.is_system);
|
|
88
|
+
|
|
89
|
+
if(views){
|
|
90
|
+
this.data.values = this.data.values.concat(views)
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
afterCount: async function(){
|
|
94
|
+
let filters = InternalData.parserFilters(this.query.filters)
|
|
95
|
+
let views = []
|
|
96
|
+
if(filters._id && !filters._id.$ne){
|
|
97
|
+
let id = filters._id
|
|
98
|
+
id = id.replace(/\\/g, '');
|
|
99
|
+
if(_.isString(id)){
|
|
100
|
+
let objectName = id.substr(0, id.indexOf("."));
|
|
101
|
+
if(objectName){
|
|
102
|
+
let view = await InternalData.getObjectListView(objectName, this.userId, id);
|
|
103
|
+
if(view){
|
|
104
|
+
views = [view];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}else if(filters.object_name){
|
|
109
|
+
views = await InternalData.getObjectListViews(filters.object_name, this.userId);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
views = await getInternalListviews(views, this.query.filters, filters.is_system);
|
|
113
|
+
|
|
114
|
+
if(views){
|
|
115
|
+
this.data.values = this.data.values + views.length
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
afterFindOne: async function(){
|
|
119
|
+
if(_.isEmpty(this.data.values)){
|
|
120
|
+
let id = this.id
|
|
121
|
+
if(_.isString(id)){
|
|
122
|
+
let objectName = id.substr(0, id.indexOf("."));
|
|
123
|
+
if(objectName){
|
|
124
|
+
let view = await InternalData.getObjectListView(objectName, this.userId, id);
|
|
125
|
+
if(view){
|
|
126
|
+
this.data.values = view;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
beforeDelete: async function(){
|
|
133
|
+
const { id } = this;
|
|
134
|
+
const record = await objectql.getObject(this.object_name).findOne(id);
|
|
135
|
+
if(record.name === 'all'){
|
|
136
|
+
throw new Error('禁止删除「all」视图')
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @Author: sunhaolin@hotoa.com
|
|
3
|
+
* @Date: 2021-06-03 15:11:52
|
|
4
|
+
* @LastEditors: sunhaolin@hotoa.com
|
|
5
|
+
* @LastEditTime: 2022-07-29 11:31:59
|
|
6
|
+
* @Description:
|
|
7
|
+
*/
|
|
8
|
+
const InternalData = require('@steedos/standard-objects').internalData;
|
|
9
|
+
|
|
10
|
+
module.exports = {
|
|
11
|
+
afterFind: async function(){
|
|
12
|
+
let filters = InternalData.parserFilters(this.query.filters)
|
|
13
|
+
if(filters.object){
|
|
14
|
+
let triggers = await InternalData.getObjectTriggers(filters.object, this.userId);
|
|
15
|
+
if(triggers){
|
|
16
|
+
this.data.values = this.data.values.concat(triggers)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
afterAggregate: async function(){
|
|
21
|
+
let filters = InternalData.parserFilters(this.query.filters)
|
|
22
|
+
if(filters.object){
|
|
23
|
+
let triggers = await InternalData.getObjectTriggers(filters.object, this.userId);
|
|
24
|
+
if(triggers){
|
|
25
|
+
this.data.values = this.data.values.concat(triggers)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
afterCount: async function(){
|
|
30
|
+
let filters = InternalData.parserFilters(this.query.filters)
|
|
31
|
+
if(filters.object){
|
|
32
|
+
let triggers = await InternalData.getObjectTriggers(filters.object, this.userId);
|
|
33
|
+
if(triggers){
|
|
34
|
+
this.data.values = this.data.values + triggers.length
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
afterFindOne: async function(){
|
|
39
|
+
if(_.isEmpty(this.data.values)){
|
|
40
|
+
let id = this.id
|
|
41
|
+
let objectName = id.substr(0, id.indexOf("."));
|
|
42
|
+
if(objectName){
|
|
43
|
+
let trigger = await InternalData.getObjectTrigger(objectName, this.userId, id);
|
|
44
|
+
if(trigger){
|
|
45
|
+
this.data.values = trigger;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @Author: baozhoutao@steedos.com
|
|
3
|
+
* @Date: 2022-03-28 09:35:34
|
|
4
|
+
* @Description:
|
|
5
|
+
*/
|
|
6
|
+
const _ = require("underscore");
|
|
7
|
+
const util = require('@steedos/standard-objects').util;
|
|
8
|
+
const objectql = require("@steedos/objectql");
|
|
9
|
+
const auth = require('@steedos/auth');
|
|
10
|
+
|
|
11
|
+
module.exports = {
|
|
12
|
+
beforeFind: async function(){
|
|
13
|
+
delete this.query.fields;
|
|
14
|
+
},
|
|
15
|
+
beforeAggregate: async function(){
|
|
16
|
+
delete this.query.fields;
|
|
17
|
+
},
|
|
18
|
+
afterFind: async function(){
|
|
19
|
+
const { spaceId } = this;
|
|
20
|
+
let dataList = objectql.getAllObjectValidationRules();
|
|
21
|
+
if (!_.isEmpty(dataList)) {
|
|
22
|
+
dataList.forEach((doc) => {
|
|
23
|
+
if (!_.find(this.data.values, (value) => {
|
|
24
|
+
return value.name === doc.name
|
|
25
|
+
})) {
|
|
26
|
+
this.data.values.push(doc);
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
const records = objectql.getSteedosSchema().metadataDriver.find(this.data.values, this.query, spaceId);
|
|
30
|
+
if (records.length > 0) {
|
|
31
|
+
this.data.values = records;
|
|
32
|
+
} else {
|
|
33
|
+
this.data.values.length = 0;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
},
|
|
38
|
+
afterAggregate: async function(){
|
|
39
|
+
const { spaceId } = this;
|
|
40
|
+
let dataList = objectql.getAllObjectValidationRules();
|
|
41
|
+
if (!_.isEmpty(dataList)) {
|
|
42
|
+
dataList.forEach((doc) => {
|
|
43
|
+
if (!_.find(this.data.values, (value) => {
|
|
44
|
+
return value.name === doc.name
|
|
45
|
+
})) {
|
|
46
|
+
this.data.values.push(doc);
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
const records = objectql.getSteedosSchema().metadataDriver.find(this.data.values, this.query, spaceId);
|
|
50
|
+
if (records.length > 0) {
|
|
51
|
+
this.data.values = records;
|
|
52
|
+
} else {
|
|
53
|
+
this.data.values.length = 0;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
afterCount: async function(){
|
|
58
|
+
delete this.query.fields;
|
|
59
|
+
let result = await objectql.getObject(this.object_name).find(this.query, await auth.getSessionByUserId(this.userId, this.spaceId))
|
|
60
|
+
this.data.values = result.length;
|
|
61
|
+
},
|
|
62
|
+
afterFindOne: async function(){
|
|
63
|
+
if (_.isEmpty(this.data.values)) {
|
|
64
|
+
const all = objectql.getAllObjectValidationRules();
|
|
65
|
+
const id = this.id;
|
|
66
|
+
this.data.values = _.find(all, function (item) {
|
|
67
|
+
return item._id === id
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
beforeInsert: async function () {
|
|
72
|
+
await util.checkAPIName(this.object_name, 'name', this.doc.name, undefined, [['is_system','!=', true]]);
|
|
73
|
+
|
|
74
|
+
},
|
|
75
|
+
beforeUpdate: async function () {
|
|
76
|
+
if (_.has(this.doc, 'name')) {
|
|
77
|
+
await util.checkAPIName(this.object_name, 'name', this.doc.name, this.id, [['is_system','!=', true]]);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
const InternalData = require('@steedos/standard-objects').internalData;
|
|
2
|
+
const _ = require('underscore');
|
|
3
|
+
const objectql = require('@steedos/objectql');
|
|
4
|
+
const objectTree = require('../objects/objects.tree.js');
|
|
5
|
+
|
|
6
|
+
module.exports = {
|
|
7
|
+
afterFind: async function(){
|
|
8
|
+
let userId = this.userId
|
|
9
|
+
let spaceId = this.spaceId;
|
|
10
|
+
for (const doc of this.data.values) {
|
|
11
|
+
doc.fields = Object.assign({}, doc.fields, await InternalData.getDefaultSysFields(doc.name, userId)) ;
|
|
12
|
+
}
|
|
13
|
+
// this.data.values = this.data.values.concat(await InternalData.findObjects(userId, this.query.filters));
|
|
14
|
+
|
|
15
|
+
this.data.values = this.data.values.concat(await InternalData.getObjects(userId));
|
|
16
|
+
|
|
17
|
+
this.data.values = objectql.getSteedosSchema().metadataDriver.find(this.data.values, this.query, spaceId);
|
|
18
|
+
|
|
19
|
+
_.each(this.data.values, function(value){
|
|
20
|
+
if(value){
|
|
21
|
+
delete value.actions;
|
|
22
|
+
delete value.fields;
|
|
23
|
+
delete value.list_views;
|
|
24
|
+
delete value.permission_set;
|
|
25
|
+
delete value.triggers;
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
},
|
|
29
|
+
afterAggregate: async function(){
|
|
30
|
+
let userId = this.userId
|
|
31
|
+
let spaceId = this.spaceId;
|
|
32
|
+
for (const doc of this.data.values) {
|
|
33
|
+
doc.fields = Object.assign({}, doc.fields, await InternalData.getDefaultSysFields(doc.name, userId)) ;
|
|
34
|
+
}
|
|
35
|
+
// this.data.values = this.data.values.concat(await InternalData.findObjects(userId, this.query.filters));
|
|
36
|
+
|
|
37
|
+
this.data.values = this.data.values.concat(await InternalData.getObjects(userId));
|
|
38
|
+
|
|
39
|
+
this.data.values = objectql.getSteedosSchema().metadataDriver.find(this.data.values, this.query, spaceId);
|
|
40
|
+
|
|
41
|
+
_.each(this.data.values, function(value){
|
|
42
|
+
if(value){
|
|
43
|
+
delete value.actions;
|
|
44
|
+
delete value.fields;
|
|
45
|
+
delete value.list_views;
|
|
46
|
+
delete value.permission_set;
|
|
47
|
+
delete value.triggers;
|
|
48
|
+
}
|
|
49
|
+
})
|
|
50
|
+
},
|
|
51
|
+
afterCount: async function(){
|
|
52
|
+
let userId = this.userId
|
|
53
|
+
let spaceId = this.spaceId;
|
|
54
|
+
this.data.values = this.data.values + objectql.getSteedosSchema().metadataDriver.count(await InternalData.getObjects(userId), this.query, spaceId);
|
|
55
|
+
},
|
|
56
|
+
afterFindOne: async function(){
|
|
57
|
+
if(_.isEmpty(this.data.values)){
|
|
58
|
+
this.data.values = await InternalData.getObject(this.id, this.userId);
|
|
59
|
+
}
|
|
60
|
+
if(this.data.values){
|
|
61
|
+
delete this.data.values.actions;
|
|
62
|
+
delete this.data.values.fields;
|
|
63
|
+
delete this.data.values.list_views;
|
|
64
|
+
delete this.data.values.permission_set;
|
|
65
|
+
delete this.data.values.triggers;
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
afterInsert: async function(){
|
|
69
|
+
const doc = this.doc;
|
|
70
|
+
if(doc.enable_tree){
|
|
71
|
+
await objectTree.insertParentAndChildrenFieldForTreeObject(doc)
|
|
72
|
+
}
|
|
73
|
+
// let spaceProfiles = await objectql.getObject('permission_set').find({space: this.spaceId, type: 'profile'});
|
|
74
|
+
// await objectql.getObject('object_layouts').insert({
|
|
75
|
+
// label: 'default',
|
|
76
|
+
// object_name: this.doc.name,
|
|
77
|
+
// actions: _.keys(Creator.getObject('base').actions),
|
|
78
|
+
// profiles: _.pluck(spaceProfiles, 'name'),
|
|
79
|
+
// fields: [{
|
|
80
|
+
// field: 'name',
|
|
81
|
+
// },{
|
|
82
|
+
// field: 'created',
|
|
83
|
+
// },{
|
|
84
|
+
// field: 'created_by',
|
|
85
|
+
// },{
|
|
86
|
+
// field: 'modified',
|
|
87
|
+
// },{
|
|
88
|
+
// field: 'modified_by',
|
|
89
|
+
// }],
|
|
90
|
+
// space: this.spaceId
|
|
91
|
+
// })
|
|
92
|
+
},
|
|
93
|
+
beforeUpdate: async function () {
|
|
94
|
+
const { doc, id, object_name } = this;
|
|
95
|
+
// 如果用户修改了apiname,则校验 数据源必须一致为default数据源;且数据库中不能有新的apiname对应的表
|
|
96
|
+
if (_.has(doc, 'name')) {
|
|
97
|
+
const obj = this.getObject(object_name);
|
|
98
|
+
const latestDoc = await obj.findOne(id);
|
|
99
|
+
const newObjName = doc.name;
|
|
100
|
+
// !!!暂不允许修改name
|
|
101
|
+
if (newObjName && (latestDoc.name != newObjName)) {
|
|
102
|
+
throw new Error('禁止修改API 名称。');
|
|
103
|
+
}
|
|
104
|
+
/*
|
|
105
|
+
if (newObjName && (latestDoc.name != newObjName) && latestDoc.datasource === 'default') {
|
|
106
|
+
const datasource = objectql.getDataSource(latestDoc.datasource);
|
|
107
|
+
const isExitsRecords = await datasource.isCollectionExitsRecords(newObjName);
|
|
108
|
+
// 如果新表中存在记录则抛错,提示用户
|
|
109
|
+
if (isExitsRecords) {
|
|
110
|
+
throw new Error(`${newObjName} 在库中已存在记录,不予进行。`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
*/
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
afterUpdate: async function () {
|
|
117
|
+
const { doc, previousDoc } = this;
|
|
118
|
+
// 零代码配置 enable_tree: true 时,添加parent、children两个字段
|
|
119
|
+
if(previousDoc.enable_tree !== doc.enable_tree && doc.enable_tree === true){
|
|
120
|
+
// doc中缺少owner,space等字段值,需要从previousDoc中取到一起带过去
|
|
121
|
+
await objectTree.insertParentAndChildrenFieldForTreeObject(Object.assign({}, previousDoc, doc), true)
|
|
122
|
+
}
|
|
123
|
+
/*
|
|
124
|
+
const { doc, previousDoc, id, object_name } = this;
|
|
125
|
+
const obj = this.getObject(object_name);
|
|
126
|
+
const latestDoc = await obj.findOne(id);
|
|
127
|
+
// 对象的apiname修改后调整库中的表名
|
|
128
|
+
if (latestDoc.name && (latestDoc.name != previousDoc.name) && previousDoc.datasource === latestDoc.datasource && latestDoc.datasource === 'default'){
|
|
129
|
+
const newObjName = latestDoc.name;
|
|
130
|
+
const oldObjName = previousDoc.name;
|
|
131
|
+
const datasource = objectql.getDataSource(latestDoc.datasource);
|
|
132
|
+
await datasource.renameCollection(newObjName, oldObjName)
|
|
133
|
+
}
|
|
134
|
+
*/
|
|
135
|
+
}
|
|
136
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@steedos/standard-object-database",
|
|
3
|
+
"version": "2.2.55-beta.16",
|
|
4
|
+
"main": "package.service.js",
|
|
5
|
+
"private": false,
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"keywords": [
|
|
10
|
+
"steedos"
|
|
11
|
+
],
|
|
12
|
+
"description": "steedos package",
|
|
13
|
+
"repository": {},
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"dependencies": {}
|
|
16
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @Author: sunhaolin@hotoa.com
|
|
3
|
+
* @Date: 1985-10-26 16:15:00
|
|
4
|
+
* @LastEditors: sunhaolin@hotoa.com
|
|
5
|
+
* @LastEditTime: 2022-07-29 13:29:26
|
|
6
|
+
* @Description:
|
|
7
|
+
*/
|
|
8
|
+
"use strict";
|
|
9
|
+
const project = require('./package.json');
|
|
10
|
+
const packageName = project.name;
|
|
11
|
+
const packageLoader = require('@steedos/service-meteor-package-loader');
|
|
12
|
+
/**
|
|
13
|
+
* @typedef {import('moleculer').Context} Context Moleculer's Context
|
|
14
|
+
*/
|
|
15
|
+
module.exports = {
|
|
16
|
+
name: packageName,
|
|
17
|
+
namespace: "steedos",
|
|
18
|
+
mixins: [packageLoader],
|
|
19
|
+
/**
|
|
20
|
+
* Settings
|
|
21
|
+
*/
|
|
22
|
+
settings: {
|
|
23
|
+
packageInfo: {
|
|
24
|
+
path: __dirname,
|
|
25
|
+
name: packageName
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Dependencies
|
|
31
|
+
*/
|
|
32
|
+
dependencies: ['~packages-standard-objects'],
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Actions
|
|
36
|
+
*/
|
|
37
|
+
actions: {
|
|
38
|
+
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Events
|
|
43
|
+
*/
|
|
44
|
+
events: {
|
|
45
|
+
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Methods
|
|
50
|
+
*/
|
|
51
|
+
methods: {
|
|
52
|
+
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Service created lifecycle event handler
|
|
57
|
+
*/
|
|
58
|
+
async created() {
|
|
59
|
+
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Service started lifecycle event handler
|
|
64
|
+
*/
|
|
65
|
+
async started() {
|
|
66
|
+
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Service stopped lifecycle event handler
|
|
71
|
+
*/
|
|
72
|
+
async stopped() {
|
|
73
|
+
|
|
74
|
+
}
|
|
75
|
+
};
|
package/public/.md
ADDED
package/src/.md
ADDED
package/webapp/.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
- 存放web项目
|