@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.
Files changed (90) hide show
  1. package/main/default/applications/.gitkeep +0 -0
  2. package/main/default/client/datasources.client.js +7 -0
  3. package/main/default/client/object_fields.client.js +212 -0
  4. package/main/default/client/object_layouts.client.js +86 -0
  5. package/main/default/objectTranslations/_object_reload_logs.en/_object_reload_logs.en.objectTranslation.yml +16 -0
  6. package/main/default/objectTranslations/_object_reload_logs.zh-CN/_object_reload_logs.zh-CN.objectTranslation.yml +16 -0
  7. package/main/default/objectTranslations/datasources.en/datasources.en.objectTranslation.yml +121 -0
  8. package/main/default/objectTranslations/datasources.zh-CN/datasources.zh-CN.objectTranslation.yml +105 -0
  9. package/main/default/objectTranslations/object_actions.en/object_actions.en.objectTranslation.yml +55 -0
  10. package/main/default/objectTranslations/object_actions.zh-CN/object_actions.zh-CN.objectTranslation.yml +50 -0
  11. package/main/default/objectTranslations/object_fields.en/object_fields.en.objectTranslation.yml +335 -0
  12. package/main/default/objectTranslations/object_fields.zh-CN/object_fields.zh-CN.objectTranslation.yml +312 -0
  13. package/main/default/objectTranslations/object_layouts.en/object_layouts.en.objectTranslation.yml +72 -0
  14. package/main/default/objectTranslations/object_layouts.zh-CN/object_layouts.zh-CN.objectTranslation.yml +116 -0
  15. package/main/default/objectTranslations/object_listviews.en/object_listviews.en.objectTranslation.yml +153 -0
  16. package/main/default/objectTranslations/object_listviews.zh-CN/object_listviews.zh-CN.objectTranslation.yml +146 -0
  17. package/main/default/objectTranslations/object_related_list.en/object_related_list.en.objectTranslation.yml +82 -0
  18. package/main/default/objectTranslations/object_related_list.zh-CN/object_related_list.zh-CN.objectTranslation.yml +82 -0
  19. package/main/default/objectTranslations/object_triggers.en/object_triggers.en.objectTranslation.yml +30 -0
  20. package/main/default/objectTranslations/object_triggers.zh-CN/object_triggers.zh-CN.objectTranslation.yml +29 -0
  21. package/main/default/objectTranslations/object_validation_rules.en/object_validation_rules.en.objectTranslation.yml +40 -0
  22. package/main/default/objectTranslations/object_validation_rules.zh-CN/object_validation_rules.zh-CN.objectTranslation.yml +38 -0
  23. package/main/default/objectTranslations/objects.en/objects.en.objectTranslation.yml +219 -0
  24. package/main/default/objectTranslations/objects.zh-CN/objects.zh-CN.objectTranslation.yml +218 -0
  25. package/main/default/objects/0.datasources.observe.object.js +83 -0
  26. package/main/default/objects/0.objects_reload.object.js +26 -0
  27. package/main/default/objects/1.objects.observe.object.js +61 -0
  28. package/main/default/objects/10.tabs.observe.object.js +36 -0
  29. package/main/default/objects/11.restriction_rules.observe.object.js +37 -0
  30. package/main/default/objects/12.share_rules.observe.object.js +37 -0
  31. package/main/default/objects/13.permission_fields.observe.object.js +37 -0
  32. package/main/default/objects/14.object_fields.observe.object.js +44 -0
  33. package/main/default/objects/15.permission_objects.observe.object.js +44 -0
  34. package/main/default/objects/2.object_triggers.observe.object.js +35 -0
  35. package/main/default/objects/3.permission_objects.observe.object.js +29 -0
  36. package/main/default/objects/4.permission_set.observe.object.js +39 -0
  37. package/main/default/objects/5.holidays.observe.object.js +30 -0
  38. package/main/default/objects/6.business_hours.observe.object.js +33 -0
  39. package/main/default/objects/7.object_actions.observe.object.js +43 -0
  40. package/main/default/objects/7.object_layouts.observe.object.js +33 -0
  41. package/main/default/objects/9.apps.observe.object.js +33 -0
  42. package/main/default/objects/_object_reload_logs.object.yml +10 -0
  43. package/main/default/objects/datasources.action.js +51 -0
  44. package/main/default/objects/datasources.core.js +34 -0
  45. package/main/default/objects/datasources.object.js +168 -0
  46. package/main/default/objects/datasources.object.yml +113 -0
  47. package/main/default/objects/object_actions.object.js +152 -0
  48. package/main/default/objects/object_actions.object.yml +142 -0
  49. package/main/default/objects/object_fields.action.js +128 -0
  50. package/main/default/objects/object_fields.function.js +104 -0
  51. package/main/default/objects/object_fields.object.js +501 -0
  52. package/main/default/objects/object_fields.object.yml +690 -0
  53. package/main/default/objects/object_layouts.action.js +31 -0
  54. package/main/default/objects/object_layouts.layouts.action.js +19 -0
  55. package/main/default/objects/object_layouts.object.yml +356 -0
  56. package/main/default/objects/object_listviews.action.js +93 -0
  57. package/main/default/objects/object_listviews.object.js +100 -0
  58. package/main/default/objects/object_listviews.object.yml +309 -0
  59. package/main/default/objects/object_manager.app.todo.yml +11 -0
  60. package/main/default/objects/object_related_list.object.js +110 -0
  61. package/main/default/objects/object_related_list.object.yml +208 -0
  62. package/main/default/objects/object_triggers.core.js +58 -0
  63. package/main/default/objects/object_triggers.object.js +65 -0
  64. package/main/default/objects/object_triggers.object.yml +124 -0
  65. package/main/default/objects/object_validation_rules.action.js +33 -0
  66. package/main/default/objects/object_validation_rules.object.yml +100 -0
  67. package/main/default/objects/objects.action.js +157 -0
  68. package/main/default/objects/objects.core.js +398 -0
  69. package/main/default/objects/objects.erd.data.function.js +85 -0
  70. package/main/default/objects/objects.lib.js +42 -0
  71. package/main/default/objects/objects.object.js +543 -0
  72. package/main/default/objects/objects.object.yml +512 -0
  73. package/main/default/objects/objects.tree.js +58 -0
  74. package/main/default/objects/permission_objects.core.js +75 -0
  75. package/main/default/permissionsets/.gitkeep +0 -0
  76. package/main/default/profiles/.gitkeep +0 -0
  77. package/main/default/tabs/.gitkeep +0 -0
  78. package/main/default/triggers/datasources.trigger.js +93 -0
  79. package/main/default/triggers/object_actions.trigger.js +98 -0
  80. package/main/default/triggers/object_fields.trigger.js +376 -0
  81. package/main/default/triggers/object_layouts.trigger.js +153 -0
  82. package/main/default/triggers/object_listviews.trigger.js +139 -0
  83. package/main/default/triggers/object_triggers.trigger.js +50 -0
  84. package/main/default/triggers/object_validation_rules.trigger.js +80 -0
  85. package/main/default/triggers/objects.trigger.js +136 -0
  86. package/package.json +16 -0
  87. package/package.service.js +75 -0
  88. package/public/.md +3 -0
  89. package/src/.md +3 -0
  90. 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,10 @@
1
+ name: _object_reload_logs
2
+ hidden: true
3
+ fields:
4
+ object_name:
5
+ type: text
6
+ change_date:
7
+ type: object
8
+ blackbox: true
9
+ change_time:
10
+ type: datetime
@@ -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
+ }