@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,37 @@
|
|
|
1
|
+
const objectql = require("@steedos/objectql");
|
|
2
|
+
const schema = objectql.getSteedosSchema();
|
|
3
|
+
const objectName = "permission_fields";
|
|
4
|
+
const SERVICE_NAME = `~database-${objectName}`;
|
|
5
|
+
Meteor.startup(function () {
|
|
6
|
+
var _change, _remove, inited = false;
|
|
7
|
+
_change = function (document) {
|
|
8
|
+
objectql.registerPermissionFields.register(schema.broker, SERVICE_NAME, document)
|
|
9
|
+
};
|
|
10
|
+
_remove = function (document) {
|
|
11
|
+
objectql.registerPermissionFields.remove(schema.broker, SERVICE_NAME, document)
|
|
12
|
+
};
|
|
13
|
+
Creator.getCollection(objectName).find({}, {
|
|
14
|
+
fields: {
|
|
15
|
+
created: 0,
|
|
16
|
+
created_by: 0,
|
|
17
|
+
modified: 0,
|
|
18
|
+
modified_by: 0
|
|
19
|
+
}
|
|
20
|
+
}).observe({
|
|
21
|
+
added: function (newDocument) {
|
|
22
|
+
if (inited) {
|
|
23
|
+
return _change(newDocument);
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
changed: function (newDocument, oldDocument) {
|
|
27
|
+
if (newDocument.name != oldDocument.name) {
|
|
28
|
+
_remove(oldDocument)
|
|
29
|
+
}
|
|
30
|
+
return _change(newDocument);
|
|
31
|
+
},
|
|
32
|
+
removed: function (oldDocument) {
|
|
33
|
+
return _remove(oldDocument);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
inited = true;
|
|
37
|
+
});
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const objectql = require("@steedos/objectql");
|
|
2
|
+
const objectName = "object_fields";
|
|
3
|
+
Meteor.startup(function () {
|
|
4
|
+
var _change, _remove, inited = false;
|
|
5
|
+
_change = function (document) {
|
|
6
|
+
try {
|
|
7
|
+
objectql.getSteedosSchema().broker.call(`permission_fields.resetAllPermissionSetFieldPermissions`, {
|
|
8
|
+
objectName: document.object
|
|
9
|
+
}, {
|
|
10
|
+
meta: {
|
|
11
|
+
user: {
|
|
12
|
+
userId: document.owner,
|
|
13
|
+
spaceId: document.space,
|
|
14
|
+
company_id: document.company_id,
|
|
15
|
+
company_ids: document.company_ids,
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
} catch (error) {
|
|
20
|
+
console.error(`resetAllPermissionSetFieldPermissions`, error)
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
Creator.getCollection(objectName).find({}, {
|
|
24
|
+
fields: {
|
|
25
|
+
created: 0,
|
|
26
|
+
created_by: 0,
|
|
27
|
+
modified: 0,
|
|
28
|
+
modified_by: 0
|
|
29
|
+
}
|
|
30
|
+
}).observe({
|
|
31
|
+
added: function (newDocument) {
|
|
32
|
+
if (inited) {
|
|
33
|
+
return _change(newDocument);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
changed: function (newDocument, oldDocument) {
|
|
37
|
+
return _change(newDocument);
|
|
38
|
+
},
|
|
39
|
+
removed: function (oldDocument) {
|
|
40
|
+
return _change(oldDocument);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
inited = true;
|
|
44
|
+
});
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const objectql = require("@steedos/objectql");
|
|
2
|
+
const objectName = "permission_objects";
|
|
3
|
+
Meteor.startup(function () {
|
|
4
|
+
var _change, _remove, inited = false;
|
|
5
|
+
_change = function (document) {
|
|
6
|
+
try {
|
|
7
|
+
objectql.getSteedosSchema().broker.call(`permission_fields.resetFieldPermissions`, {
|
|
8
|
+
permissionObjectId: document._id
|
|
9
|
+
}, {
|
|
10
|
+
meta: {
|
|
11
|
+
user: {
|
|
12
|
+
userId: document.owner,
|
|
13
|
+
spaceId: document.space,
|
|
14
|
+
company_id: document.company_id,
|
|
15
|
+
company_ids: document.company_ids,
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
} catch (error) {
|
|
20
|
+
console.error(`resetFieldPermissions`, error)
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
Creator.getCollection(objectName).find({}, {
|
|
24
|
+
fields: {
|
|
25
|
+
created: 0,
|
|
26
|
+
created_by: 0,
|
|
27
|
+
modified: 0,
|
|
28
|
+
modified_by: 0
|
|
29
|
+
}
|
|
30
|
+
}).observe({
|
|
31
|
+
added: function (newDocument) {
|
|
32
|
+
if (inited) {
|
|
33
|
+
return _change(newDocument);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
changed: function (newDocument, oldDocument) {
|
|
37
|
+
return _change(newDocument);
|
|
38
|
+
},
|
|
39
|
+
// removed: function (oldDocument) {
|
|
40
|
+
// return _change(oldDocument);
|
|
41
|
+
// }
|
|
42
|
+
});
|
|
43
|
+
inited = true;
|
|
44
|
+
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
var objectql = require('@steedos/objectql');
|
|
2
|
+
var triggerCore = require('./object_triggers.core.js');
|
|
3
|
+
|
|
4
|
+
Meteor.startup(function () {
|
|
5
|
+
var _change, _remove;
|
|
6
|
+
_change = function (document) {
|
|
7
|
+
triggerCore.loadObjectTrigger(document)
|
|
8
|
+
};
|
|
9
|
+
_remove = function (document) {
|
|
10
|
+
triggerCore.removeObjectTrigger(document);
|
|
11
|
+
};
|
|
12
|
+
var config = objectql.getSteedosConfig();
|
|
13
|
+
if(config.tenant && config.tenant.saas){
|
|
14
|
+
return ;
|
|
15
|
+
}else{
|
|
16
|
+
Creator.getCollection("object_triggers").find({is_enable: true}, {
|
|
17
|
+
fields: {
|
|
18
|
+
created: 0,
|
|
19
|
+
created_by: 0,
|
|
20
|
+
modified: 0,
|
|
21
|
+
modified_by: 0
|
|
22
|
+
}
|
|
23
|
+
}).observe({
|
|
24
|
+
added: function (newDocument) {
|
|
25
|
+
return _change(newDocument);
|
|
26
|
+
},
|
|
27
|
+
changed: function (newDocument, oldDocument) {
|
|
28
|
+
return _change(newDocument);
|
|
29
|
+
},
|
|
30
|
+
removed: function (oldDocument) {
|
|
31
|
+
return _remove(oldDocument);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
var permissionCore = require('./permission_objects.core.js');
|
|
2
|
+
|
|
3
|
+
Meteor.startup(function () {
|
|
4
|
+
var _change, _remove;
|
|
5
|
+
_change = function (document) {
|
|
6
|
+
permissionCore.loadObjectPermission(document)
|
|
7
|
+
};
|
|
8
|
+
_remove = function (document) {
|
|
9
|
+
permissionCore.removeObjectPermission(document);
|
|
10
|
+
};
|
|
11
|
+
Creator.getCollection("permission_objects").find({}, {
|
|
12
|
+
fields: {
|
|
13
|
+
created: 0,
|
|
14
|
+
created_by: 0,
|
|
15
|
+
modified: 0,
|
|
16
|
+
modified_by: 0
|
|
17
|
+
}
|
|
18
|
+
}).observe({
|
|
19
|
+
added: function (newDocument) {
|
|
20
|
+
return _change(newDocument);
|
|
21
|
+
},
|
|
22
|
+
changed: function (newDocument, oldDocument) {
|
|
23
|
+
return _change(newDocument);
|
|
24
|
+
},
|
|
25
|
+
removed: function (oldDocument) {
|
|
26
|
+
return _remove(oldDocument);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
var updateSpaceUserSessionRolesCache = require('@steedos/auth').updateSpaceUserSessionRolesCache;
|
|
2
|
+
var wrapAsync = require('@steedos/objectql').wrapAsync;
|
|
3
|
+
const _ = require('underscore');
|
|
4
|
+
|
|
5
|
+
Meteor.startup(function () {
|
|
6
|
+
var _update, server_permission_set_init = false;
|
|
7
|
+
_update = function (spaceId, users) {
|
|
8
|
+
if (users) {
|
|
9
|
+
for (let index = 0; index < users.length; index++) {
|
|
10
|
+
var updateFn = function () {
|
|
11
|
+
return updateSpaceUserSessionRolesCache(spaceId, users[index]);
|
|
12
|
+
}
|
|
13
|
+
wrapAsync(updateFn, {});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
Creator.getCollection("permission_set").find({}, {
|
|
18
|
+
fields: {
|
|
19
|
+
space: 1,
|
|
20
|
+
users: 1
|
|
21
|
+
}
|
|
22
|
+
}).observe({
|
|
23
|
+
added: function (newDocument) {
|
|
24
|
+
if (server_permission_set_init) {
|
|
25
|
+
return _update(newDocument.space, newDocument.users);
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
changed: function (newDocument, oldDocument) {
|
|
29
|
+
var newUsers = newDocument.users;
|
|
30
|
+
var oldUsers = oldDocument.users;
|
|
31
|
+
var diffUsers = _.difference(newUsers, oldUsers).concat(_.difference(oldUsers, newUsers));
|
|
32
|
+
return _update(newDocument.space, diffUsers);
|
|
33
|
+
},
|
|
34
|
+
removed: function (oldDocument) {
|
|
35
|
+
return _update(oldDocument.space, oldDocument.users);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
server_permission_set_init = true;
|
|
39
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const core = require("@steedos/core");
|
|
2
|
+
const objectName = "holidays";
|
|
3
|
+
|
|
4
|
+
Meteor.startup(function () {
|
|
5
|
+
var _change, _remove, inited = false;
|
|
6
|
+
_change = function (document) {
|
|
7
|
+
core.updateHolidaysCache(document.space, document.date.getUTCFullYear());
|
|
8
|
+
};
|
|
9
|
+
Creator.getCollection(objectName).find({}, {
|
|
10
|
+
fields: {
|
|
11
|
+
created: 0,
|
|
12
|
+
created_by: 0,
|
|
13
|
+
modified: 0,
|
|
14
|
+
modified_by: 0
|
|
15
|
+
}
|
|
16
|
+
}).observe({
|
|
17
|
+
added: function (newDocument) {
|
|
18
|
+
if (inited) {
|
|
19
|
+
return _change(newDocument);
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
changed: function (newDocument, oldDocument) {
|
|
23
|
+
return _change(newDocument);
|
|
24
|
+
},
|
|
25
|
+
removed: function (oldDocument) {
|
|
26
|
+
return _change(oldDocument);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
inited = true;
|
|
30
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const objectql = require("@steedos/objectql");
|
|
2
|
+
const objectName = "business_hours";
|
|
3
|
+
|
|
4
|
+
Meteor.startup(function () {
|
|
5
|
+
var _change, _remove, inited = false;
|
|
6
|
+
_change = function (document) {
|
|
7
|
+
objectql.addConfig(objectName, document);
|
|
8
|
+
};
|
|
9
|
+
_remove = function (document) {
|
|
10
|
+
objectql.removeConfig(objectName, document);
|
|
11
|
+
};
|
|
12
|
+
Creator.getCollection(objectName).find({ is_default: true }, {
|
|
13
|
+
fields: {
|
|
14
|
+
created: 0,
|
|
15
|
+
created_by: 0,
|
|
16
|
+
modified: 0,
|
|
17
|
+
modified_by: 0
|
|
18
|
+
}
|
|
19
|
+
}).observe({
|
|
20
|
+
added: function (newDocument) {
|
|
21
|
+
if (inited) {
|
|
22
|
+
return _change(newDocument);
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
changed: function (newDocument, oldDocument) {
|
|
26
|
+
return _change(newDocument);
|
|
27
|
+
},
|
|
28
|
+
removed: function (oldDocument) {
|
|
29
|
+
return _remove(oldDocument);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
inited = true;
|
|
33
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
var objectql = require('@steedos/objectql');
|
|
2
|
+
var objectCore = require('./objects.core.js');
|
|
3
|
+
var lodash = require('lodash');
|
|
4
|
+
Meteor.startup(function () {
|
|
5
|
+
var _change, _remove;
|
|
6
|
+
_change = function (document) {
|
|
7
|
+
// 防止visible默认值丢失
|
|
8
|
+
if(!document.visible && !lodash.isBoolean(document.visible)){
|
|
9
|
+
document.visible = true;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
document._visible = document.visible;
|
|
13
|
+
objectCore.triggerReloadObject(document.object, 'action', document, 'update');
|
|
14
|
+
};
|
|
15
|
+
_remove = function (document) {
|
|
16
|
+
objectql.removeObjectButtonsConfig(document.object, document);
|
|
17
|
+
objectql.removeLazyLoadButton(document.object, document);
|
|
18
|
+
objectCore.triggerReloadObject(document.object, 'action', document, 'remove');
|
|
19
|
+
};
|
|
20
|
+
var config = objectql.getSteedosConfig();
|
|
21
|
+
if (config.tenant && config.tenant.saas) {
|
|
22
|
+
return;
|
|
23
|
+
} else {
|
|
24
|
+
Creator.getCollection("object_actions").find({ is_enable: true }, {
|
|
25
|
+
fields: {
|
|
26
|
+
created: 0,
|
|
27
|
+
created_by: 0,
|
|
28
|
+
modified: 0,
|
|
29
|
+
modified_by: 0
|
|
30
|
+
}
|
|
31
|
+
}).observe({
|
|
32
|
+
added: function (newDocument) {
|
|
33
|
+
return _change(Object.assign(newDocument, {_previousName: newDocument.name}));
|
|
34
|
+
},
|
|
35
|
+
changed: function (newDocument, oldDocument) {
|
|
36
|
+
return _change(Object.assign(newDocument, {_previousName: oldDocument.name}));
|
|
37
|
+
},
|
|
38
|
+
removed: function (oldDocument) {
|
|
39
|
+
return _remove(oldDocument);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const objectql = require("@steedos/objectql");
|
|
2
|
+
const objectName = "object_layouts";
|
|
3
|
+
|
|
4
|
+
Meteor.startup(function () {
|
|
5
|
+
var _change, _remove, inited = false;
|
|
6
|
+
_change = function (document) {
|
|
7
|
+
objectql.loadObjectLayoutMetadata(document, `~database-${objectName}`)
|
|
8
|
+
};
|
|
9
|
+
_remove = function (document) {
|
|
10
|
+
objectql.getSteedosSchema().metadataRegister.removeLayout(`${document.object_name}.${document._id}`)
|
|
11
|
+
};
|
|
12
|
+
Creator.getCollection(objectName).find({}, {
|
|
13
|
+
fields: {
|
|
14
|
+
created: 0,
|
|
15
|
+
created_by: 0,
|
|
16
|
+
modified: 0,
|
|
17
|
+
modified_by: 0
|
|
18
|
+
}
|
|
19
|
+
}).observe({
|
|
20
|
+
added: function (newDocument) {
|
|
21
|
+
if (inited) {
|
|
22
|
+
return _change(newDocument);
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
changed: function (newDocument, oldDocument) {
|
|
26
|
+
return _change(newDocument);
|
|
27
|
+
},
|
|
28
|
+
removed: function (oldDocument) {
|
|
29
|
+
return _remove(oldDocument);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
inited = true;
|
|
33
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const objectql = require("@steedos/objectql");
|
|
2
|
+
const objectName = "apps";
|
|
3
|
+
const SERVICE_NAME = `~database-${objectName}`;
|
|
4
|
+
Meteor.startup(function () {
|
|
5
|
+
var _change, _remove, inited = false;
|
|
6
|
+
_change = function (document) {
|
|
7
|
+
objectql.addAppConfig(document, SERVICE_NAME)
|
|
8
|
+
};
|
|
9
|
+
_remove = function (document) {
|
|
10
|
+
objectql.removeApp(document._id)
|
|
11
|
+
};
|
|
12
|
+
Creator.getCollection(objectName).find({}, {
|
|
13
|
+
fields: {
|
|
14
|
+
created: 0,
|
|
15
|
+
created_by: 0,
|
|
16
|
+
modified: 0,
|
|
17
|
+
modified_by: 0
|
|
18
|
+
}
|
|
19
|
+
}).observe({
|
|
20
|
+
added: function (newDocument) {
|
|
21
|
+
if (inited) {
|
|
22
|
+
return _change(newDocument);
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
changed: function (newDocument, oldDocument) {
|
|
26
|
+
return _change(newDocument);
|
|
27
|
+
},
|
|
28
|
+
removed: function (oldDocument) {
|
|
29
|
+
return _remove(oldDocument);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
inited = true;
|
|
33
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
testConnection: function(object_name, record_id, fields){
|
|
3
|
+
window.$("body").addClass("loading");
|
|
4
|
+
var userSession = Creator.USER_CONTEXT;
|
|
5
|
+
var spaceId = userSession.spaceId;
|
|
6
|
+
var authToken = userSession.authToken ? userSession.authToken : userSession.user.authToken;
|
|
7
|
+
var url = "/api/v4/datasources/" + record_id + "/testConnection";
|
|
8
|
+
url = Steedos.absoluteUrl(url);
|
|
9
|
+
try {
|
|
10
|
+
var authorization = "Bearer " + spaceId + "," + authToken;
|
|
11
|
+
var headers = [{
|
|
12
|
+
name: 'Content-Type',
|
|
13
|
+
value: 'application/json'
|
|
14
|
+
}, {
|
|
15
|
+
name: 'Authorization',
|
|
16
|
+
value: authorization
|
|
17
|
+
}];
|
|
18
|
+
window.$.ajax({
|
|
19
|
+
type: "get",
|
|
20
|
+
url: url,
|
|
21
|
+
dataType: "json",
|
|
22
|
+
contentType: 'application/json',
|
|
23
|
+
beforeSend: function (XHR) {
|
|
24
|
+
if (headers && headers.length) {
|
|
25
|
+
return headers.forEach(function (header) {
|
|
26
|
+
return XHR.setRequestHeader(header.name, header.value);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
success: function (data) {
|
|
31
|
+
window.$("body").removeClass("loading");
|
|
32
|
+
toastr.success(t('_datasources_testConnection_ok'));
|
|
33
|
+
},
|
|
34
|
+
error: function (XMLHttpRequest, textStatus, errorThrown) {
|
|
35
|
+
console.error(XMLHttpRequest.responseJSON);
|
|
36
|
+
window.$("body").removeClass("loading");
|
|
37
|
+
if (XMLHttpRequest.responseJSON && XMLHttpRequest.responseJSON.error) {
|
|
38
|
+
toastr.error(t(XMLHttpRequest.responseJSON.error.replace(/:/g, ':')))
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
toastr.error(XMLHttpRequest.responseJSON)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
} catch (err) {
|
|
46
|
+
console.error(err);
|
|
47
|
+
toastr.error(err);
|
|
48
|
+
window.$("body").removeClass("loading");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
|
|
2
|
+
function checkNodeModule(id){
|
|
3
|
+
try {
|
|
4
|
+
require.resolve(id);
|
|
5
|
+
} catch (error) {
|
|
6
|
+
throw new Error(`_datasources_driver_error_notFind_${id}`);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function checkDriver(driver){
|
|
11
|
+
switch (driver) {
|
|
12
|
+
case 'sqlserver':
|
|
13
|
+
checkNodeModule('mssql');
|
|
14
|
+
break;
|
|
15
|
+
case 'postgres':
|
|
16
|
+
checkNodeModule('pg');
|
|
17
|
+
break;
|
|
18
|
+
case 'oracle':
|
|
19
|
+
checkNodeModule('oracledb');
|
|
20
|
+
break;
|
|
21
|
+
case 'mysql':
|
|
22
|
+
checkNodeModule('mysql');
|
|
23
|
+
break;
|
|
24
|
+
case 'sqlite':
|
|
25
|
+
checkNodeModule('sqlite3');
|
|
26
|
+
break;
|
|
27
|
+
default:
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
module.exports = {
|
|
33
|
+
checkDriver
|
|
34
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
const _ = require("underscore");
|
|
2
|
+
var objectql = require('@steedos/objectql');
|
|
3
|
+
var schema = objectql.getSteedosSchema();
|
|
4
|
+
const datasourceCore = require('./datasources.core');
|
|
5
|
+
const defaultDatasourceName = 'default';
|
|
6
|
+
const defaultDatasourcesName = ['default','meteor'];
|
|
7
|
+
|
|
8
|
+
Meteor.publish("datasources", function (spaceId) {
|
|
9
|
+
var userId = this.userId
|
|
10
|
+
if (!userId)
|
|
11
|
+
throw new Meteor.Error("401", "Authentication is required and has not been provided.")
|
|
12
|
+
|
|
13
|
+
if (db.space_users.findOne({ user: userId, space: spaceId })) {
|
|
14
|
+
return Creator.Collections["datasources"].find({ space: spaceId }, { fields: { _id: 1, space: 1, name: 1, label:1 } })
|
|
15
|
+
}
|
|
16
|
+
return [];
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
Creator.Objects['datasources'].methods = {
|
|
20
|
+
testConnection: async function (req, res) {
|
|
21
|
+
var userSession = req.user
|
|
22
|
+
var recordId = req.params._id;
|
|
23
|
+
var spaceId = userSession.spaceId
|
|
24
|
+
let doc = await objectql.getObject('datasources').findOne(recordId, {filters: `(space eq \'${spaceId}\')`});
|
|
25
|
+
if(doc){
|
|
26
|
+
var datasource;
|
|
27
|
+
try {
|
|
28
|
+
datasourceCore.checkDriver(doc.driver);
|
|
29
|
+
let datasourceName = `${recordId}_${spaceId}_${doc.name}__test`
|
|
30
|
+
doc.name = datasourceName
|
|
31
|
+
if (doc.mssql_options) {
|
|
32
|
+
doc.options = JSON.parse(doc.mssql_options)
|
|
33
|
+
delete doc.mssql_options
|
|
34
|
+
}
|
|
35
|
+
datasource = schema.addDataSource(doc.name, doc, true);
|
|
36
|
+
if(doc.driver === 'mongo'){
|
|
37
|
+
await datasource._adapter.connect();
|
|
38
|
+
}else{
|
|
39
|
+
await datasource._adapter.init({});
|
|
40
|
+
}
|
|
41
|
+
await datasource.close();
|
|
42
|
+
schema.removeDataSource(datasourceName);
|
|
43
|
+
return res.send({ok: 1});
|
|
44
|
+
} catch (error) {
|
|
45
|
+
if(datasource){
|
|
46
|
+
await datasource.close();
|
|
47
|
+
}
|
|
48
|
+
return res.status(500).send({error: error.message || error.toString()});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return res.status(404).send({error: 'not find'});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function checkName(name){
|
|
56
|
+
var reg = new RegExp('^[a-z]([a-z0-9]|_(?!_))*[a-z0-9]$');
|
|
57
|
+
if(!reg.test(name)){
|
|
58
|
+
throw new Error("datasources__error_name_invalid_format");
|
|
59
|
+
}
|
|
60
|
+
if(name.length > 50){
|
|
61
|
+
throw new Error("API 名称长度不能大于50个字符");
|
|
62
|
+
}
|
|
63
|
+
return true
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function getConfigDatasources(){
|
|
67
|
+
var config = objectql.getSteedosConfig() || {};
|
|
68
|
+
return _.keys(config.datasources);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function isRepeatedName(id, name) {
|
|
72
|
+
if(name === defaultDatasourceName){
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if(_.include(defaultDatasourcesName, name)){
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if(_.include(getConfigDatasources(), name)){
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
var other;
|
|
85
|
+
other = Creator.getCollection("datasources").find({
|
|
86
|
+
_id: {
|
|
87
|
+
$ne: id
|
|
88
|
+
},
|
|
89
|
+
name: name
|
|
90
|
+
}, {
|
|
91
|
+
fields: {
|
|
92
|
+
_id: 1
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
if (other.count() > 0) {
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
function allowChangeDatasource(){
|
|
102
|
+
var config = objectql.getSteedosConfig();
|
|
103
|
+
if(config.tenant && config.tenant.saas){
|
|
104
|
+
return false
|
|
105
|
+
}else{
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
Creator.Objects.datasources.triggers = {
|
|
111
|
+
"before.insert.server.datasources": {
|
|
112
|
+
on: "server",
|
|
113
|
+
when: "before.insert",
|
|
114
|
+
todo: function (userId, doc) {
|
|
115
|
+
if(!allowChangeDatasource()){
|
|
116
|
+
throw new Meteor.Error(500, "华炎云服务不包含自定义数据源的功能,请部署私有云版本");
|
|
117
|
+
}
|
|
118
|
+
checkName(doc.name);
|
|
119
|
+
if (isRepeatedName(doc._id, doc.name)) {
|
|
120
|
+
throw new Meteor.Error(500, "数据源名称不能重复");
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if(doc.is_enable){
|
|
124
|
+
datasourceCore.checkDriver(doc.driver)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
doc.custom = true;
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
"before.update.server.datasources": {
|
|
131
|
+
on: "server",
|
|
132
|
+
when: "before.update",
|
|
133
|
+
todo: function (userId, doc, fieldNames, modifier, options) {
|
|
134
|
+
modifier.$set = modifier.$set || {}
|
|
135
|
+
if(!allowChangeDatasource()){
|
|
136
|
+
throw new Meteor.Error(500, "华炎云服务不包含自定义数据源的功能,请部署私有云版本");
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if(_.has(modifier.$set, "name") && modifier.$set.name != doc.name){
|
|
140
|
+
checkName(modifier.$set.name);
|
|
141
|
+
if (isRepeatedName(doc._id, modifier.$set.name)) {
|
|
142
|
+
throw new Meteor.Error(500, "数据源名称不能重复");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if(_.has(modifier.$set, "is_enable") && modifier.$set.is_enable || _.has(modifier.$set, "driver")){
|
|
147
|
+
datasourceCore.checkDriver(doc.driver)
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
"before.remove.server.datasources": {
|
|
152
|
+
on: "server",
|
|
153
|
+
when: "before.remove",
|
|
154
|
+
todo: function (userId, doc) {
|
|
155
|
+
if(!allowChangeDatasource()){
|
|
156
|
+
throw new Meteor.Error(500, "华炎云服务不包含自定义数据源的功能,请部署私有云版本");
|
|
157
|
+
}
|
|
158
|
+
var documents = Creator.getCollection("objects").find({datasource: doc._id}, {
|
|
159
|
+
fields: {
|
|
160
|
+
_id: 1
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
if (documents.count() > 0) {
|
|
164
|
+
throw new Meteor.Error(500, `数据源(${doc.label})中已经有对象记录,请先删除对象`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
}
|