@budibase/server 1.0.79 → 1.0.80-alpha.0
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/__mocks__/node-fetch.ts +1 -0
- package/builder/assets/index.b37e0ebb.js +1288 -0
- package/builder/assets/{index.c8d1e8f0.css → index.c57242d4.css} +2 -2
- package/builder/assets/{vendor.20f80cec.js → vendor.a7c6ad0a.js} +190 -216
- package/builder/index.html +3 -3
- package/coverage/clover.xml +2399 -2336
- package/coverage/coverage-final.json +138 -137
- package/coverage/lcov-report/api/controllers/analytics.js.html +6 -6
- package/coverage/lcov-report/api/controllers/apikeys.js.html +6 -6
- package/coverage/lcov-report/api/controllers/application.js.html +152 -149
- package/coverage/lcov-report/api/controllers/auth.js.html +7 -7
- package/coverage/lcov-report/api/controllers/automation.js.html +21 -21
- package/coverage/lcov-report/api/controllers/backup.js.html +3 -3
- package/coverage/lcov-report/api/controllers/cloud.js.html +11 -11
- package/coverage/lcov-report/api/controllers/component.js.html +5 -5
- package/coverage/lcov-report/api/controllers/datasource.js.html +16 -16
- package/coverage/lcov-report/api/controllers/dev.js.html +19 -19
- package/coverage/lcov-report/api/controllers/index.html +16 -16
- package/coverage/lcov-report/api/controllers/integration.js.html +4 -4
- package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
- package/coverage/lcov-report/api/controllers/metadata.js.html +9 -9
- package/coverage/lcov-report/api/controllers/migrations.js.html +4 -4
- package/coverage/lcov-report/api/controllers/permission.js.html +15 -15
- package/coverage/lcov-report/api/controllers/query/index.html +1 -1
- package/coverage/lcov-report/api/controllers/query/index.js.html +26 -26
- package/coverage/lcov-report/api/controllers/query/validation.js.html +10 -10
- package/coverage/lcov-report/api/controllers/role.js.html +9 -9
- package/coverage/lcov-report/api/controllers/routing.js.html +9 -9
- package/coverage/lcov-report/api/controllers/row/external.js.html +16 -16
- package/coverage/lcov-report/api/controllers/row/index.html +27 -27
- package/coverage/lcov-report/api/controllers/row/index.js.html +46 -46
- package/coverage/lcov-report/api/controllers/row/internal.js.html +94 -82
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +204 -204
- package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +24 -24
- package/coverage/lcov-report/api/controllers/row/utils.js.html +29 -29
- package/coverage/lcov-report/api/controllers/screen.js.html +7 -7
- package/coverage/lcov-report/api/controllers/script.js.html +4 -4
- package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +49 -49
- package/coverage/lcov-report/api/controllers/table/external.js.html +12 -12
- package/coverage/lcov-report/api/controllers/table/index.html +11 -11
- package/coverage/lcov-report/api/controllers/table/index.js.html +47 -44
- package/coverage/lcov-report/api/controllers/table/internal.js.html +50 -50
- package/coverage/lcov-report/api/controllers/table/utils.js.html +80 -80
- package/coverage/lcov-report/api/controllers/templates.js.html +5 -5
- package/coverage/lcov-report/api/controllers/user.js.html +19 -19
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
- package/coverage/lcov-report/api/controllers/view/index.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.js.html +14 -14
- package/coverage/lcov-report/api/controllers/view/utils.js.html +12 -12
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
- package/coverage/lcov-report/api/controllers/webhook.js.html +18 -27
- package/coverage/lcov-report/api/index.html +10 -10
- package/coverage/lcov-report/api/index.js.html +37 -28
- package/coverage/lcov-report/api/routes/analytics.js.html +6 -6
- package/coverage/lcov-report/api/routes/apikeys.js.html +8 -8
- package/coverage/lcov-report/api/routes/application.js.html +9 -9
- package/coverage/lcov-report/api/routes/auth.js.html +6 -6
- package/coverage/lcov-report/api/routes/automation.js.html +19 -109
- package/coverage/lcov-report/api/routes/backup.js.html +8 -8
- package/coverage/lcov-report/api/routes/cloud.js.html +8 -8
- package/coverage/lcov-report/api/routes/component.js.html +8 -8
- package/coverage/lcov-report/api/routes/datasource.js.html +18 -156
- package/coverage/lcov-report/api/routes/deploy.js.html +8 -8
- package/coverage/lcov-report/api/routes/dev.js.html +13 -13
- package/coverage/lcov-report/api/routes/index.html +35 -35
- package/coverage/lcov-report/api/routes/index.js.html +38 -32
- package/coverage/lcov-report/api/routes/integration.js.html +8 -8
- package/coverage/lcov-report/api/routes/layout.js.html +8 -8
- package/coverage/lcov-report/api/routes/metadata.js.html +9 -9
- package/coverage/lcov-report/api/routes/migrations.js.html +7 -7
- package/coverage/lcov-report/api/routes/permission.js.html +16 -58
- package/coverage/lcov-report/api/routes/query.js.html +10 -10
- package/coverage/lcov-report/api/routes/role.js.html +15 -78
- package/coverage/lcov-report/api/routes/routing.js.html +8 -8
- package/coverage/lcov-report/api/routes/row.js.html +17 -14
- package/coverage/lcov-report/api/routes/screen.js.html +14 -95
- package/coverage/lcov-report/api/routes/script.js.html +1 -1
- package/coverage/lcov-report/api/routes/static.js.html +13 -13
- package/coverage/lcov-report/api/routes/table.js.html +17 -62
- package/coverage/lcov-report/api/routes/templates.js.html +8 -8
- package/coverage/lcov-report/api/routes/user.js.html +8 -8
- package/coverage/lcov-report/api/routes/utils/index.html +111 -0
- package/coverage/lcov-report/api/routes/utils/validators.js.html +737 -0
- package/coverage/lcov-report/api/routes/view.js.html +10 -10
- package/coverage/lcov-report/api/routes/webhook.js.html +14 -62
- package/coverage/lcov-report/automations/actions.js.html +24 -24
- package/coverage/lcov-report/automations/automationUtils.js.html +5 -5
- package/coverage/lcov-report/automations/bullboard.js.html +16 -16
- package/coverage/lcov-report/automations/index.html +1 -1
- package/coverage/lcov-report/automations/index.js.html +7 -7
- package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
- package/coverage/lcov-report/automations/steps/createRow.js.html +7 -7
- package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
- package/coverage/lcov-report/automations/steps/deleteRow.js.html +7 -7
- package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
- package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
- package/coverage/lcov-report/automations/steps/filter.js.html +12 -9
- package/coverage/lcov-report/automations/steps/index.html +1 -1
- package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
- package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
- package/coverage/lcov-report/automations/steps/queryRows.js.html +11 -11
- package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
- package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
- package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
- package/coverage/lcov-report/automations/steps/updateRow.js.html +6 -6
- package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
- package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
- package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
- package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
- package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
- package/coverage/lcov-report/automations/triggers.js.html +26 -26
- package/coverage/lcov-report/automations/utils.js.html +35 -35
- package/coverage/lcov-report/constants/index.html +5 -5
- package/coverage/lcov-report/constants/index.js.html +40 -28
- package/coverage/lcov-report/constants/layouts.js.html +5 -5
- package/coverage/lcov-report/constants/screens.js.html +4 -4
- package/coverage/lcov-report/db/client.js.html +18 -18
- package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
- package/coverage/lcov-report/db/index.html +15 -15
- package/coverage/lcov-report/db/index.js.html +3 -3
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +21 -21
- package/coverage/lcov-report/db/linkedRows/index.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.js.html +36 -36
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +30 -30
- package/coverage/lcov-report/db/newid.js.html +4 -4
- package/coverage/lcov-report/db/utils.js.html +123 -87
- package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
- package/coverage/lcov-report/events/index.html +1 -1
- package/coverage/lcov-report/events/index.js.html +8 -8
- package/coverage/lcov-report/events/utils.js.html +18 -18
- package/coverage/lcov-report/index.html +89 -74
- package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
- package/coverage/lcov-report/integrations/tests/index.html +1 -1
- package/coverage/lcov-report/middleware/appInfo.js.html +5 -5
- package/coverage/lcov-report/middleware/authorized.js.html +29 -29
- package/coverage/lcov-report/middleware/builder.js.html +16 -16
- package/coverage/lcov-report/middleware/currentapp.js.html +44 -44
- package/coverage/lcov-report/middleware/index.html +1 -1
- package/coverage/lcov-report/middleware/joi-validator.js.html +14 -14
- package/coverage/lcov-report/middleware/resourceId.js.html +29 -29
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/usageQuota.js.html +17 -17
- package/coverage/lcov-report/middleware/utils.js.html +4 -4
- package/coverage/lcov-report/threads/automation.js.html +1 -1
- package/coverage/lcov-report/threads/index.html +19 -19
- package/coverage/lcov-report/threads/index.js.html +10 -10
- package/coverage/lcov-report/threads/query.js.html +123 -39
- package/coverage/lcov-report/threads/utils.js.html +14 -14
- package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
- package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
- package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
- package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
- package/coverage/lcov-report/utilities/global.js.html +28 -28
- package/coverage/lcov-report/utilities/index.html +18 -18
- package/coverage/lcov-report/utilities/index.js.html +24 -24
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +9 -9
- package/coverage/lcov-report/utilities/queue/index.html +1 -1
- package/coverage/lcov-report/utilities/routing/index.html +1 -1
- package/coverage/lcov-report/utilities/routing/index.js.html +6 -6
- package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +60 -60
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +13 -13
- package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
- package/coverage/lcov-report/utilities/security.js.html +8 -8
- package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/index.js.html +12 -12
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +8 -8
- package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
- package/coverage/lcov-report/utilities/users.js.html +5 -5
- package/coverage/lcov-report/utilities/workerRequests.js.html +200 -53
- package/coverage/lcov.info +3323 -3224
- package/dist/api/controllers/application.js +1 -0
- package/dist/api/controllers/public/applications.js +94 -0
- package/dist/api/controllers/public/mapping/applications.js +29 -0
- package/dist/api/controllers/public/mapping/index.js +11 -0
- package/dist/api/controllers/public/mapping/queries.js +36 -0
- package/dist/api/controllers/public/mapping/rows.js +24 -0
- package/dist/api/controllers/public/mapping/tables.js +23 -0
- package/dist/api/controllers/public/mapping/types.js +2 -0
- package/dist/api/controllers/public/mapping/users.js +29 -0
- package/dist/api/controllers/public/queries.js +38 -0
- package/dist/api/controllers/public/rows.js +97 -0
- package/dist/api/controllers/public/tables.js +75 -0
- package/dist/api/controllers/public/users.js +95 -0
- package/dist/api/controllers/public/utils.js +49 -0
- package/dist/api/controllers/row/internal.js +4 -1
- package/dist/api/controllers/table/index.js +2 -1
- package/dist/api/controllers/webhook.js +3 -5
- package/dist/api/index.js +3 -1
- package/dist/api/routes/automation.js +3 -31
- package/dist/api/routes/datasource.js +3 -50
- package/dist/api/routes/index.js +2 -0
- package/dist/api/routes/permission.js +4 -14
- package/dist/api/routes/public/applications.js +141 -0
- package/dist/api/routes/public/index.js +101 -0
- package/dist/api/routes/public/middleware/mapper.js +94 -0
- package/dist/api/routes/public/queries.js +77 -0
- package/dist/api/routes/public/rows.js +229 -0
- package/dist/api/routes/public/tables.js +154 -0
- package/dist/api/routes/public/users.js +137 -0
- package/dist/api/routes/public/utils/Endpoint.js +36 -0
- package/dist/api/routes/role.js +3 -19
- package/dist/api/routes/row.js +3 -4
- package/dist/api/routes/screen.js +2 -23
- package/dist/api/routes/table.js +3 -17
- package/dist/api/routes/tests/utilities/index.js +23 -0
- package/dist/api/routes/utils/validators.js +200 -0
- package/dist/api/routes/webhook.js +2 -17
- package/dist/automations/steps/filter.js +2 -2
- package/dist/automations/steps/queryRows.js +1 -1
- package/dist/automations/utils.js +2 -2
- package/dist/constants/index.js +3 -0
- package/dist/db/utils.js +11 -0
- package/dist/definitions/openapi.js +6 -0
- package/dist/environment.js +1 -0
- package/dist/integrations/googlesheets.js +3 -0
- package/dist/integrations/microsoftSqlServer.js +35 -29
- package/dist/integrations/mysql.js +3 -0
- package/dist/integrations/oracle.js +14 -19
- package/dist/integrations/postgres.js +34 -28
- package/dist/package.json +11 -7
- package/dist/tests/utilities/TestConfiguration.js +25 -8
- package/dist/threads/query.js +33 -8
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utilities/workerRequests.js +50 -15
- package/package.json +12 -8
- package/scripts/integrations/oracle/oracle.md +2 -2
- package/scripts/integrations/postgres/init.sql +5 -3
- package/scripts/likeCypress.ts +9 -6
- package/specs/generate.js +83 -0
- package/specs/openapi.json +2222 -0
- package/specs/openapi.yaml +1530 -0
- package/specs/parameters.js +59 -0
- package/specs/resources/application.js +101 -0
- package/specs/resources/index.js +24 -0
- package/specs/resources/misc.js +12 -0
- package/specs/resources/query.js +189 -0
- package/specs/resources/row.js +125 -0
- package/specs/resources/table.js +191 -0
- package/specs/resources/user.js +126 -0
- package/specs/resources/utils/Resource.js +26 -0
- package/specs/resources/utils/index.js +11 -0
- package/specs/security.js +7 -0
- package/src/api/controllers/application.js +1 -0
- package/src/api/controllers/public/applications.ts +74 -0
- package/src/api/controllers/public/mapping/applications.ts +32 -0
- package/src/api/controllers/public/mapping/index.ts +13 -0
- package/src/api/controllers/public/mapping/queries.ts +39 -0
- package/src/api/controllers/public/mapping/rows.ts +31 -0
- package/src/api/controllers/public/mapping/tables.ts +26 -0
- package/src/api/controllers/public/mapping/types.ts +13 -0
- package/src/api/controllers/public/mapping/users.ts +32 -0
- package/src/api/controllers/public/queries.ts +20 -0
- package/src/api/controllers/public/rows.ts +77 -0
- package/src/api/controllers/public/tables.ts +56 -0
- package/src/api/controllers/public/users.ts +82 -0
- package/src/api/controllers/public/utils.ts +38 -0
- package/src/api/controllers/row/ExternalRequest.ts +1 -1
- package/src/api/controllers/row/internal.js +4 -0
- package/src/api/controllers/table/index.js +2 -1
- package/src/api/controllers/webhook.js +3 -6
- package/src/api/index.js +4 -1
- package/src/api/routes/automation.js +3 -33
- package/src/api/routes/datasource.js +6 -52
- package/src/api/routes/index.js +2 -0
- package/src/api/routes/permission.js +4 -18
- package/src/api/routes/public/applications.ts +156 -0
- package/src/api/routes/public/index.ts +118 -0
- package/src/api/routes/public/middleware/mapper.ts +81 -0
- package/src/api/routes/public/queries.ts +81 -0
- package/src/api/routes/public/rows.ts +242 -0
- package/src/api/routes/public/tables.ts +169 -0
- package/src/api/routes/public/tests/compare.spec.js +184 -0
- package/src/api/routes/public/users.ts +144 -0
- package/src/api/routes/public/utils/Endpoint.ts +51 -0
- package/src/api/routes/role.js +3 -24
- package/src/api/routes/row.js +3 -2
- package/src/api/routes/screen.js +2 -29
- package/src/api/routes/table.js +4 -19
- package/src/api/routes/tests/utilities/index.js +24 -0
- package/src/api/routes/utils/validators.js +219 -0
- package/src/api/routes/webhook.js +2 -18
- package/src/automations/steps/filter.js +3 -2
- package/src/automations/steps/queryRows.js +1 -1
- package/src/automations/utils.js +2 -2
- package/src/constants/index.js +4 -0
- package/src/db/utils.js +12 -0
- package/src/definitions/common.ts +4 -0
- package/src/definitions/openapi.ts +943 -0
- package/src/environment.js +1 -0
- package/src/integrations/base/datasourcePlus.ts +3 -0
- package/src/integrations/googlesheets.ts +5 -2
- package/src/integrations/microsoftSqlServer.ts +38 -33
- package/src/integrations/mysql.ts +4 -0
- package/src/integrations/oracle.ts +27 -35
- package/src/integrations/postgres.ts +33 -26
- package/src/tests/utilities/TestConfiguration.js +23 -2
- package/src/threads/query.js +37 -9
- package/src/utilities/workerRequests.js +65 -16
- package/builder/assets/index.f28c5d54.js +0 -1352
- package/scripts/proxy/generateProxyConfig.js +0 -70
package/dist/api/routes/table.js
CHANGED
|
@@ -4,22 +4,8 @@ const tableController = require("../controllers/table");
|
|
|
4
4
|
const authorized = require("../../middleware/authorized");
|
|
5
5
|
const { paramResource, bodyResource } = require("../../middleware/resourceId");
|
|
6
6
|
const { BUILDER, PermissionLevels, PermissionTypes, } = require("@budibase/backend-core/permissions");
|
|
7
|
-
const
|
|
8
|
-
const Joi = require("joi");
|
|
7
|
+
const { tableValidator } = require("./utils/validators");
|
|
9
8
|
const router = Router();
|
|
10
|
-
function generateSaveValidator() {
|
|
11
|
-
// prettier-ignore
|
|
12
|
-
return joiValidator.body(Joi.object({
|
|
13
|
-
_id: Joi.string(),
|
|
14
|
-
_rev: Joi.string(),
|
|
15
|
-
type: Joi.string().valid("table", "internal", "external"),
|
|
16
|
-
primaryDisplay: Joi.string(),
|
|
17
|
-
schema: Joi.object().required(),
|
|
18
|
-
name: Joi.string().required(),
|
|
19
|
-
views: Joi.object(),
|
|
20
|
-
dataImport: Joi.object(),
|
|
21
|
-
}).unknown(true));
|
|
22
|
-
}
|
|
23
9
|
router
|
|
24
10
|
/**
|
|
25
11
|
* @api {get} /api/tables Fetch all tables
|
|
@@ -46,7 +32,7 @@ router
|
|
|
46
32
|
*
|
|
47
33
|
* @apiSuccess {object[]} body The response body will be the table that was found.
|
|
48
34
|
*/
|
|
49
|
-
.get("/api/tables/:
|
|
35
|
+
.get("/api/tables/:tableId", paramResource("tableId"), authorized(PermissionTypes.TABLE, PermissionLevels.READ), tableController.find)
|
|
50
36
|
/**
|
|
51
37
|
* @api {post} /api/tables Save a table
|
|
52
38
|
* @apiName Save a table
|
|
@@ -122,7 +108,7 @@ router
|
|
|
122
108
|
*/
|
|
123
109
|
.post("/api/tables",
|
|
124
110
|
// allows control over updating a table
|
|
125
|
-
bodyResource("_id"), authorized(BUILDER),
|
|
111
|
+
bodyResource("_id"), authorized(BUILDER), tableValidator(), tableController.save)
|
|
126
112
|
/**
|
|
127
113
|
* @api {post} /api/tables/csv/validate Validate a CSV for a table
|
|
128
114
|
* @apiName Validate a CSV for a table
|
|
@@ -11,6 +11,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
const TestConfig = require("../../../../tests/utilities/TestConfiguration");
|
|
12
12
|
const structures = require("../../../../tests/utilities/structures");
|
|
13
13
|
const env = require("../../../../environment");
|
|
14
|
+
function user() {
|
|
15
|
+
return {
|
|
16
|
+
_id: "user",
|
|
17
|
+
_rev: "rev",
|
|
18
|
+
createdAt: Date.now(),
|
|
19
|
+
email: "test@test.com",
|
|
20
|
+
roles: {},
|
|
21
|
+
tenantId: "default",
|
|
22
|
+
status: "active",
|
|
23
|
+
};
|
|
24
|
+
}
|
|
14
25
|
jest.mock("../../../../utilities/workerRequests", () => ({
|
|
15
26
|
getGlobalUsers: jest.fn(() => {
|
|
16
27
|
return {
|
|
@@ -22,6 +33,18 @@ jest.mock("../../../../utilities/workerRequests", () => ({
|
|
|
22
33
|
_id: "us_uuid1",
|
|
23
34
|
};
|
|
24
35
|
}),
|
|
36
|
+
allGlobalUsers: jest.fn(() => {
|
|
37
|
+
return [user()];
|
|
38
|
+
}),
|
|
39
|
+
readGlobalUser: jest.fn(() => {
|
|
40
|
+
return user();
|
|
41
|
+
}),
|
|
42
|
+
saveGlobalUser: jest.fn(() => {
|
|
43
|
+
return { _id: "user", _rev: "rev" };
|
|
44
|
+
}),
|
|
45
|
+
deleteGlobalUser: jest.fn(() => {
|
|
46
|
+
return { message: "deleted user" };
|
|
47
|
+
}),
|
|
25
48
|
removeAppFromUserRoles: jest.fn(),
|
|
26
49
|
}));
|
|
27
50
|
exports.delay = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const joiValidator = require("../../../middleware/joi-validator");
|
|
3
|
+
const { DataSourceOperation } = require("../../../constants");
|
|
4
|
+
const { WebhookType } = require("../../../constants");
|
|
5
|
+
const { BUILTIN_PERMISSION_IDS, PermissionLevels, } = require("@budibase/backend-core/permissions");
|
|
6
|
+
const Joi = require("joi");
|
|
7
|
+
const OPTIONAL_STRING = Joi.string().optional().allow(null).allow("");
|
|
8
|
+
const OPTIONAL_NUMBER = Joi.number().optional().allow(null);
|
|
9
|
+
exports.tableValidator = () => {
|
|
10
|
+
// prettier-ignore
|
|
11
|
+
return joiValidator.body(Joi.object({
|
|
12
|
+
_id: OPTIONAL_STRING,
|
|
13
|
+
_rev: OPTIONAL_STRING,
|
|
14
|
+
type: OPTIONAL_STRING.valid("table", "internal", "external"),
|
|
15
|
+
primaryDisplay: OPTIONAL_STRING,
|
|
16
|
+
schema: Joi.object().required(),
|
|
17
|
+
name: Joi.string().required(),
|
|
18
|
+
views: Joi.object(),
|
|
19
|
+
dataImport: Joi.object(),
|
|
20
|
+
}).unknown(true));
|
|
21
|
+
};
|
|
22
|
+
exports.nameValidator = () => {
|
|
23
|
+
// prettier-ignore
|
|
24
|
+
return joiValidator.body(Joi.object({
|
|
25
|
+
name: OPTIONAL_STRING,
|
|
26
|
+
}));
|
|
27
|
+
};
|
|
28
|
+
exports.datasourceValidator = () => {
|
|
29
|
+
// prettier-ignore
|
|
30
|
+
return joiValidator.body(Joi.object({
|
|
31
|
+
_id: Joi.string(),
|
|
32
|
+
_rev: Joi.string(),
|
|
33
|
+
type: OPTIONAL_STRING.allow("datasource_plus"),
|
|
34
|
+
relationships: Joi.array().items(Joi.object({
|
|
35
|
+
from: Joi.string().required(),
|
|
36
|
+
to: Joi.string().required(),
|
|
37
|
+
cardinality: Joi.valid("1:N", "1:1", "N:N").required()
|
|
38
|
+
})),
|
|
39
|
+
}).unknown(true));
|
|
40
|
+
};
|
|
41
|
+
function filterObject() {
|
|
42
|
+
// prettier-ignore
|
|
43
|
+
return Joi.object({
|
|
44
|
+
string: Joi.object().optional(),
|
|
45
|
+
fuzzy: Joi.object().optional(),
|
|
46
|
+
range: Joi.object().optional(),
|
|
47
|
+
equal: Joi.object().optional(),
|
|
48
|
+
notEqual: Joi.object().optional(),
|
|
49
|
+
empty: Joi.object().optional(),
|
|
50
|
+
notEmpty: Joi.object().optional(),
|
|
51
|
+
oneOf: Joi.object().optional(),
|
|
52
|
+
contains: Joi.object().optional(),
|
|
53
|
+
notContains: Joi.object().optional(),
|
|
54
|
+
}).unknown(true);
|
|
55
|
+
}
|
|
56
|
+
exports.internalSearchValidator = () => {
|
|
57
|
+
// prettier-ignore
|
|
58
|
+
return joiValidator.body(Joi.object({
|
|
59
|
+
tableId: OPTIONAL_STRING,
|
|
60
|
+
query: filterObject(),
|
|
61
|
+
limit: OPTIONAL_NUMBER,
|
|
62
|
+
sort: OPTIONAL_STRING,
|
|
63
|
+
sortOrder: OPTIONAL_STRING,
|
|
64
|
+
sortType: OPTIONAL_STRING,
|
|
65
|
+
paginate: Joi.boolean(),
|
|
66
|
+
bookmark: Joi.alternatives().try(OPTIONAL_STRING, OPTIONAL_NUMBER).optional(),
|
|
67
|
+
}));
|
|
68
|
+
};
|
|
69
|
+
exports.externalSearchValidator = () => {
|
|
70
|
+
return joiValidator.body(Joi.object({
|
|
71
|
+
query: filterObject(),
|
|
72
|
+
paginate: Joi.boolean().optional(),
|
|
73
|
+
bookmark: Joi.alternatives()
|
|
74
|
+
.try(OPTIONAL_STRING, OPTIONAL_NUMBER)
|
|
75
|
+
.optional(),
|
|
76
|
+
limit: OPTIONAL_NUMBER,
|
|
77
|
+
sort: Joi.object({
|
|
78
|
+
column: Joi.string(),
|
|
79
|
+
order: OPTIONAL_STRING.valid("ascending", "descending"),
|
|
80
|
+
type: OPTIONAL_STRING.valid("string", "number"),
|
|
81
|
+
}).optional(),
|
|
82
|
+
}));
|
|
83
|
+
};
|
|
84
|
+
exports.datasourceQueryValidator = () => {
|
|
85
|
+
// prettier-ignore
|
|
86
|
+
return joiValidator.body(Joi.object({
|
|
87
|
+
endpoint: Joi.object({
|
|
88
|
+
datasourceId: Joi.string().required(),
|
|
89
|
+
operation: Joi.string().required().valid(...Object.values(DataSourceOperation)),
|
|
90
|
+
entityId: Joi.string().required(),
|
|
91
|
+
}).required(),
|
|
92
|
+
resource: Joi.object({
|
|
93
|
+
fields: Joi.array().items(Joi.string()).optional(),
|
|
94
|
+
}).optional(),
|
|
95
|
+
body: Joi.object().optional(),
|
|
96
|
+
sort: Joi.object().optional(),
|
|
97
|
+
filters: filterObject().optional(),
|
|
98
|
+
paginate: Joi.object({
|
|
99
|
+
page: Joi.string().alphanum().optional(),
|
|
100
|
+
limit: Joi.number().optional(),
|
|
101
|
+
}).optional(),
|
|
102
|
+
}));
|
|
103
|
+
};
|
|
104
|
+
exports.webhookValidator = () => {
|
|
105
|
+
// prettier-ignore
|
|
106
|
+
return joiValidator.body(Joi.object({
|
|
107
|
+
live: Joi.bool(),
|
|
108
|
+
_id: OPTIONAL_STRING,
|
|
109
|
+
_rev: OPTIONAL_STRING,
|
|
110
|
+
name: Joi.string().required(),
|
|
111
|
+
bodySchema: Joi.object().optional(),
|
|
112
|
+
action: Joi.object({
|
|
113
|
+
type: Joi.string().required().valid(WebhookType.AUTOMATION),
|
|
114
|
+
target: Joi.string().required(),
|
|
115
|
+
}).required(),
|
|
116
|
+
}).unknown(true));
|
|
117
|
+
};
|
|
118
|
+
exports.roleValidator = () => {
|
|
119
|
+
const permLevelArray = Object.values(PermissionLevels);
|
|
120
|
+
// prettier-ignore
|
|
121
|
+
return joiValidator.body(Joi.object({
|
|
122
|
+
_id: OPTIONAL_STRING,
|
|
123
|
+
_rev: OPTIONAL_STRING,
|
|
124
|
+
name: Joi.string().required(),
|
|
125
|
+
// this is the base permission ID (for now a built in)
|
|
126
|
+
permissionId: Joi.string().valid(...Object.values(BUILTIN_PERMISSION_IDS)).required(),
|
|
127
|
+
permissions: Joi.object()
|
|
128
|
+
.pattern(/.*/, [Joi.string().valid(...permLevelArray)])
|
|
129
|
+
.optional(),
|
|
130
|
+
inherits: OPTIONAL_STRING,
|
|
131
|
+
}).unknown(true));
|
|
132
|
+
};
|
|
133
|
+
exports.permissionValidator = () => {
|
|
134
|
+
const permLevelArray = Object.values(PermissionLevels);
|
|
135
|
+
// prettier-ignore
|
|
136
|
+
return joiValidator.params(Joi.object({
|
|
137
|
+
level: Joi.string().valid(...permLevelArray).required(),
|
|
138
|
+
resourceId: Joi.string(),
|
|
139
|
+
roleId: Joi.string(),
|
|
140
|
+
}).unknown(true));
|
|
141
|
+
};
|
|
142
|
+
exports.screenValidator = () => {
|
|
143
|
+
// prettier-ignore
|
|
144
|
+
return joiValidator.body(Joi.object({
|
|
145
|
+
name: Joi.string().required(),
|
|
146
|
+
routing: Joi.object({
|
|
147
|
+
route: Joi.string().required(),
|
|
148
|
+
roleId: Joi.string().required().allow(""),
|
|
149
|
+
}).required().unknown(true),
|
|
150
|
+
props: Joi.object({
|
|
151
|
+
_id: Joi.string().required(),
|
|
152
|
+
_component: Joi.string().required(),
|
|
153
|
+
_children: Joi.array().required(),
|
|
154
|
+
_instanceName: Joi.string().required(),
|
|
155
|
+
_styles: Joi.object().required(),
|
|
156
|
+
type: OPTIONAL_STRING,
|
|
157
|
+
table: OPTIONAL_STRING,
|
|
158
|
+
layoutId: OPTIONAL_STRING,
|
|
159
|
+
}).required().unknown(true),
|
|
160
|
+
}).unknown(true));
|
|
161
|
+
};
|
|
162
|
+
function generateStepSchema(allowStepTypes) {
|
|
163
|
+
// prettier-ignore
|
|
164
|
+
return Joi.object({
|
|
165
|
+
stepId: Joi.string().required(),
|
|
166
|
+
id: Joi.string().required(),
|
|
167
|
+
description: Joi.string().required(),
|
|
168
|
+
name: Joi.string().required(),
|
|
169
|
+
tagline: Joi.string().required(),
|
|
170
|
+
icon: Joi.string().required(),
|
|
171
|
+
params: Joi.object(),
|
|
172
|
+
args: Joi.object(),
|
|
173
|
+
type: Joi.string().required().valid(...allowStepTypes),
|
|
174
|
+
}).unknown(true);
|
|
175
|
+
}
|
|
176
|
+
exports.automationValidator = (existing = false) => {
|
|
177
|
+
// prettier-ignore
|
|
178
|
+
return joiValidator.body(Joi.object({
|
|
179
|
+
_id: existing ? Joi.string().required() : OPTIONAL_STRING,
|
|
180
|
+
_rev: existing ? Joi.string().required() : OPTIONAL_STRING,
|
|
181
|
+
name: Joi.string().required(),
|
|
182
|
+
type: Joi.string().valid("automation").required(),
|
|
183
|
+
definition: Joi.object({
|
|
184
|
+
steps: Joi.array().required().items(generateStepSchema(["ACTION", "LOGIC"])),
|
|
185
|
+
trigger: generateStepSchema(["TRIGGER"]).allow(null),
|
|
186
|
+
}).required().unknown(true),
|
|
187
|
+
}).unknown(true));
|
|
188
|
+
};
|
|
189
|
+
exports.applicationValidator = () => {
|
|
190
|
+
// prettier-ignore
|
|
191
|
+
return joiValidator.body(Joi.object({
|
|
192
|
+
_id: OPTIONAL_STRING,
|
|
193
|
+
_rev: OPTIONAL_STRING,
|
|
194
|
+
name: Joi.string().required(),
|
|
195
|
+
url: OPTIONAL_STRING,
|
|
196
|
+
template: Joi.object({
|
|
197
|
+
templateString: OPTIONAL_STRING,
|
|
198
|
+
}).unknown(true),
|
|
199
|
+
}).unknown(true));
|
|
200
|
+
};
|
|
@@ -2,27 +2,12 @@
|
|
|
2
2
|
const Router = require("@koa/router");
|
|
3
3
|
const controller = require("../controllers/webhook");
|
|
4
4
|
const authorized = require("../../middleware/authorized");
|
|
5
|
-
const joiValidator = require("../../middleware/joi-validator");
|
|
6
5
|
const { BUILDER } = require("@budibase/backend-core/permissions");
|
|
7
|
-
const
|
|
6
|
+
const { webhookValidator } = require("./utils/validators");
|
|
8
7
|
const router = Router();
|
|
9
|
-
function generateSaveValidator() {
|
|
10
|
-
// prettier-ignore
|
|
11
|
-
return joiValidator.body(Joi.object({
|
|
12
|
-
live: Joi.bool(),
|
|
13
|
-
_id: Joi.string().optional(),
|
|
14
|
-
_rev: Joi.string().optional(),
|
|
15
|
-
name: Joi.string().required(),
|
|
16
|
-
bodySchema: Joi.object().optional(),
|
|
17
|
-
action: Joi.object({
|
|
18
|
-
type: Joi.string().required().valid(controller.WebhookType.AUTOMATION),
|
|
19
|
-
target: Joi.string().required(),
|
|
20
|
-
}).required(),
|
|
21
|
-
}).unknown(true));
|
|
22
|
-
}
|
|
23
8
|
router
|
|
24
9
|
.get("/api/webhooks", authorized(BUILDER), controller.fetch)
|
|
25
|
-
.put("/api/webhooks", authorized(BUILDER),
|
|
10
|
+
.put("/api/webhooks", authorized(BUILDER), webhookValidator(), controller.save)
|
|
26
11
|
.delete("/api/webhooks/:id/:rev", authorized(BUILDER), controller.destroy)
|
|
27
12
|
.post("/api/webhooks/schema/:instance/:id", authorized(BUILDER), controller.buildSchema)
|
|
28
13
|
// this shouldn't have authorisation, right now its always public
|
|
@@ -23,10 +23,10 @@ const PrettyFilterConditions = {
|
|
|
23
23
|
exports.FilterConditions = FilterConditions;
|
|
24
24
|
exports.PrettyFilterConditions = PrettyFilterConditions;
|
|
25
25
|
exports.definition = {
|
|
26
|
-
name: "
|
|
26
|
+
name: "Condition",
|
|
27
27
|
tagline: "{{inputs.field}} {{inputs.condition}} {{inputs.value}}",
|
|
28
28
|
icon: "Branch2",
|
|
29
|
-
description: "
|
|
29
|
+
description: "Conditionally halt automations which do not meet certain conditions",
|
|
30
30
|
type: "LOGIC",
|
|
31
31
|
internal: true,
|
|
32
32
|
stepId: "FILTER",
|
|
@@ -15,7 +15,7 @@ const CouchDB = require("../db");
|
|
|
15
15
|
const { queue } = require("./bullboard");
|
|
16
16
|
const newid = require("../db/newid");
|
|
17
17
|
const { updateEntityMetadata } = require("../utilities");
|
|
18
|
-
const { MetadataTypes } = require("../constants");
|
|
18
|
+
const { MetadataTypes, WebhookType } = require("../constants");
|
|
19
19
|
const { getProdAppID } = require("@budibase/backend-core/db");
|
|
20
20
|
const { cloneDeep } = require("lodash/fp");
|
|
21
21
|
const { getAppDB, getAppId } = require("@budibase/backend-core/context");
|
|
@@ -145,7 +145,7 @@ exports.checkForWebhooks = ({ oldAuto, newAuto }) => __awaiter(void 0, void 0, v
|
|
|
145
145
|
const ctx = {
|
|
146
146
|
appId,
|
|
147
147
|
request: {
|
|
148
|
-
body: new webhooks.Webhook("Automation webhook",
|
|
148
|
+
body: new webhooks.Webhook("Automation webhook", WebhookType.AUTOMATION, newAuto._id),
|
|
149
149
|
},
|
|
150
150
|
};
|
|
151
151
|
yield webhooks.save(ctx);
|
package/dist/constants/index.js
CHANGED
|
@@ -166,5 +166,8 @@ exports.BuildSchemaErrors = {
|
|
|
166
166
|
NO_KEY: "no_key",
|
|
167
167
|
INVALID_COLUMN: "invalid_column",
|
|
168
168
|
};
|
|
169
|
+
exports.WebhookType = {
|
|
170
|
+
AUTOMATION: "automation",
|
|
171
|
+
};
|
|
169
172
|
// pass through the list from the auth/core lib
|
|
170
173
|
exports.ObjectStoreBuckets = ObjectStoreBuckets;
|
package/dist/db/utils.js
CHANGED
|
@@ -114,6 +114,17 @@ exports.getRowParams = (tableId = null, rowId = null, otherProps = {}) => {
|
|
|
114
114
|
const endOfKey = rowId == null ? `${tableId}${SEPARATOR}` : rowId;
|
|
115
115
|
return getDocParams(DocumentTypes.ROW, endOfKey, otherProps);
|
|
116
116
|
};
|
|
117
|
+
/**
|
|
118
|
+
* Given a row ID this will find the table ID within it (only works for internal tables).
|
|
119
|
+
* @param {string} rowId The ID of the row.
|
|
120
|
+
* @returns {string} The table ID.
|
|
121
|
+
*/
|
|
122
|
+
exports.getTableIDFromRowID = rowId => {
|
|
123
|
+
const components = rowId
|
|
124
|
+
.split(DocumentTypes.TABLE + SEPARATOR)[1]
|
|
125
|
+
.split(SEPARATOR);
|
|
126
|
+
return `${DocumentTypes.TABLE}${SEPARATOR}${components[0]}`;
|
|
127
|
+
};
|
|
117
128
|
/**
|
|
118
129
|
* Gets a new row ID for the specified table.
|
|
119
130
|
* @param {string} tableId The table which the row is being created for.
|
package/dist/environment.js
CHANGED
|
@@ -37,6 +37,7 @@ module.exports = {
|
|
|
37
37
|
INTERNAL_API_KEY: process.env.INTERNAL_API_KEY,
|
|
38
38
|
MULTI_TENANCY: process.env.MULTI_TENANCY,
|
|
39
39
|
HTTP_MIGRATIONS: process.env.HTTP_MIGRATIONS,
|
|
40
|
+
API_REQ_LIMIT_PER_SEC: process.env.API_REQ_LIMIT_PER_SEC,
|
|
40
41
|
// environment
|
|
41
42
|
NODE_ENV: process.env.NODE_ENV,
|
|
42
43
|
JEST_WORKER_ID: process.env.JEST_WORKER_ID,
|
|
@@ -97,6 +97,9 @@ var GoogleSheetsModule;
|
|
|
97
97
|
const spreadsheetId = this.cleanSpreadsheetUrl(this.config.spreadsheetId);
|
|
98
98
|
this.client = new google_spreadsheet_1.GoogleSpreadsheet(spreadsheetId);
|
|
99
99
|
}
|
|
100
|
+
getBindingIdentifier() {
|
|
101
|
+
return "";
|
|
102
|
+
}
|
|
100
103
|
/**
|
|
101
104
|
* Pull the spreadsheet ID out from a valid google sheets URL
|
|
102
105
|
* @param spreadsheetId - the URL or standard spreadsheetId of the google sheet
|
|
@@ -63,32 +63,10 @@ var MSSQLModule;
|
|
|
63
63
|
},
|
|
64
64
|
},
|
|
65
65
|
};
|
|
66
|
-
function internalQuery(client, query, operation = undefined) {
|
|
67
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
68
|
-
const request = client.request();
|
|
69
|
-
try {
|
|
70
|
-
if (Array.isArray(query.bindings)) {
|
|
71
|
-
let count = 0;
|
|
72
|
-
for (let binding of query.bindings) {
|
|
73
|
-
request.input(`p${count++}`, binding);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// this is a hack to get the inserted ID back,
|
|
77
|
-
// no way to do this with Knex nicely
|
|
78
|
-
const sql = operation === datasource_1.Operation.CREATE
|
|
79
|
-
? `${query.sql}; SELECT SCOPE_IDENTITY() AS id;`
|
|
80
|
-
: query.sql;
|
|
81
|
-
return yield request.query(sql);
|
|
82
|
-
}
|
|
83
|
-
catch (err) {
|
|
84
|
-
// @ts-ignore
|
|
85
|
-
throw new Error(err);
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
66
|
class SqlServerIntegration extends Sql {
|
|
90
67
|
constructor(config) {
|
|
91
68
|
super(utils_1.SqlClients.MS_SQL);
|
|
69
|
+
this.index = 0;
|
|
92
70
|
this.tables = {};
|
|
93
71
|
this.schemaErrors = {};
|
|
94
72
|
this.MASTER_TABLES = [
|
|
@@ -109,6 +87,31 @@ var MSSQLModule;
|
|
|
109
87
|
this.pool = new sqlServer.ConnectionPool(clientCfg);
|
|
110
88
|
}
|
|
111
89
|
}
|
|
90
|
+
internalQuery(query, operation = undefined) {
|
|
91
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
92
|
+
const client = this.client;
|
|
93
|
+
const request = client.request();
|
|
94
|
+
this.index = 0;
|
|
95
|
+
try {
|
|
96
|
+
if (Array.isArray(query.bindings)) {
|
|
97
|
+
let count = 0;
|
|
98
|
+
for (let binding of query.bindings) {
|
|
99
|
+
request.input(`p${count++}`, binding);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// this is a hack to get the inserted ID back,
|
|
103
|
+
// no way to do this with Knex nicely
|
|
104
|
+
const sql = operation === datasource_1.Operation.CREATE
|
|
105
|
+
? `${query.sql}; SELECT SCOPE_IDENTITY() AS id;`
|
|
106
|
+
: query.sql;
|
|
107
|
+
return yield request.query(sql);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
// @ts-ignore
|
|
111
|
+
throw new Error(err);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
112
115
|
getDefinitionSQL(tableName) {
|
|
113
116
|
return `select *
|
|
114
117
|
from INFORMATION_SCHEMA.COLUMNS
|
|
@@ -134,6 +137,9 @@ var MSSQLModule;
|
|
|
134
137
|
FROM INFORMATION_SCHEMA.COLUMNS
|
|
135
138
|
WHERE TABLE_NAME='${tableName}'`;
|
|
136
139
|
}
|
|
140
|
+
getBindingIdentifier() {
|
|
141
|
+
return `(@p${this.index++})`;
|
|
142
|
+
}
|
|
137
143
|
connect() {
|
|
138
144
|
return __awaiter(this, void 0, void 0, function* () {
|
|
139
145
|
try {
|
|
@@ -147,7 +153,7 @@ var MSSQLModule;
|
|
|
147
153
|
}
|
|
148
154
|
runSQL(sql) {
|
|
149
155
|
return __awaiter(this, void 0, void 0, function* () {
|
|
150
|
-
return (yield internalQuery(
|
|
156
|
+
return (yield this.internalQuery(utils_1.getSqlQuery(sql))).recordset;
|
|
151
157
|
});
|
|
152
158
|
}
|
|
153
159
|
/**
|
|
@@ -207,28 +213,28 @@ var MSSQLModule;
|
|
|
207
213
|
read(query) {
|
|
208
214
|
return __awaiter(this, void 0, void 0, function* () {
|
|
209
215
|
yield this.connect();
|
|
210
|
-
const response = yield internalQuery(
|
|
216
|
+
const response = yield this.internalQuery(utils_1.getSqlQuery(query));
|
|
211
217
|
return response.recordset;
|
|
212
218
|
});
|
|
213
219
|
}
|
|
214
220
|
create(query) {
|
|
215
221
|
return __awaiter(this, void 0, void 0, function* () {
|
|
216
222
|
yield this.connect();
|
|
217
|
-
const response = yield internalQuery(
|
|
223
|
+
const response = yield this.internalQuery(utils_1.getSqlQuery(query));
|
|
218
224
|
return response.recordset || [{ created: true }];
|
|
219
225
|
});
|
|
220
226
|
}
|
|
221
227
|
update(query) {
|
|
222
228
|
return __awaiter(this, void 0, void 0, function* () {
|
|
223
229
|
yield this.connect();
|
|
224
|
-
const response = yield internalQuery(
|
|
230
|
+
const response = yield this.internalQuery(utils_1.getSqlQuery(query));
|
|
225
231
|
return response.recordset || [{ updated: true }];
|
|
226
232
|
});
|
|
227
233
|
}
|
|
228
234
|
delete(query) {
|
|
229
235
|
return __awaiter(this, void 0, void 0, function* () {
|
|
230
236
|
yield this.connect();
|
|
231
|
-
const response = yield internalQuery(
|
|
237
|
+
const response = yield this.internalQuery(utils_1.getSqlQuery(query));
|
|
232
238
|
return response.recordset || [{ deleted: true }];
|
|
233
239
|
});
|
|
234
240
|
}
|
|
@@ -236,7 +242,7 @@ var MSSQLModule;
|
|
|
236
242
|
return __awaiter(this, void 0, void 0, function* () {
|
|
237
243
|
yield this.connect();
|
|
238
244
|
const operation = this._operation(json);
|
|
239
|
-
const queryFn = (query, op) => internalQuery(
|
|
245
|
+
const queryFn = (query, op) => this.internalQuery(query, op);
|
|
240
246
|
const processFn = (result) => result.recordset ? result.recordset : [{ [operation]: true }];
|
|
241
247
|
return this.queryWithReturning(json, queryFn, processFn);
|
|
242
248
|
});
|
|
@@ -74,6 +74,7 @@ var OracleModule;
|
|
|
74
74
|
class OracleIntegration extends sql_1.default {
|
|
75
75
|
constructor(config) {
|
|
76
76
|
super(utils_1.SqlClients.ORACLE);
|
|
77
|
+
this.index = 1;
|
|
77
78
|
this.tables = {};
|
|
78
79
|
this.schemaErrors = {};
|
|
79
80
|
this.COLUMNS_SQL = `
|
|
@@ -116,6 +117,9 @@ var OracleModule;
|
|
|
116
117
|
});
|
|
117
118
|
this.config = config;
|
|
118
119
|
}
|
|
120
|
+
getBindingIdentifier() {
|
|
121
|
+
return `:${this.index++}`;
|
|
122
|
+
}
|
|
119
123
|
/**
|
|
120
124
|
* Map the flat tabular columns and constraints data into a nested object
|
|
121
125
|
*/
|
|
@@ -167,24 +171,18 @@ var OracleModule;
|
|
|
167
171
|
}
|
|
168
172
|
return oracleTables;
|
|
169
173
|
}
|
|
170
|
-
isSupportedColumn(column) {
|
|
171
|
-
|
|
172
|
-
return false;
|
|
173
|
-
}
|
|
174
|
-
return true;
|
|
174
|
+
static isSupportedColumn(column) {
|
|
175
|
+
return !UNSUPPORTED_TYPES.includes(column.type);
|
|
175
176
|
}
|
|
176
|
-
isAutoColumn(column) {
|
|
177
|
-
|
|
178
|
-
return true;
|
|
179
|
-
}
|
|
180
|
-
return false;
|
|
177
|
+
static isAutoColumn(column) {
|
|
178
|
+
return !!(column.default && column.default.toLowerCase().includes("nextval"));
|
|
181
179
|
}
|
|
182
180
|
/**
|
|
183
181
|
* No native boolean in oracle. Best we can do is to check if a manual 1 or 0 number constraint has been set up
|
|
184
182
|
* This matches the default behaviour for generating DDL used in knex.
|
|
185
183
|
*/
|
|
186
184
|
isBooleanType(column) {
|
|
187
|
-
|
|
185
|
+
return (column.type.toLowerCase() === "number" &&
|
|
188
186
|
Object.values(column.constraints).filter(c => {
|
|
189
187
|
if (c.type === OracleContraintTypes.NOT_NULL_OR_CHECK &&
|
|
190
188
|
c.searchCondition) {
|
|
@@ -197,10 +195,7 @@ var OracleModule;
|
|
|
197
195
|
}
|
|
198
196
|
}
|
|
199
197
|
return false;
|
|
200
|
-
}).length > 0)
|
|
201
|
-
return true;
|
|
202
|
-
}
|
|
203
|
-
return false;
|
|
198
|
+
}).length > 0);
|
|
204
199
|
}
|
|
205
200
|
internalConvertType(column) {
|
|
206
201
|
if (this.isBooleanType(column)) {
|
|
@@ -235,7 +230,7 @@ var OracleModule;
|
|
|
235
230
|
// iterate each column on the table
|
|
236
231
|
Object.values(oracleTable.columns)
|
|
237
232
|
// remove columns that we can't read / save
|
|
238
|
-
.filter(oracleColumn =>
|
|
233
|
+
.filter(oracleColumn => OracleIntegration.isSupportedColumn(oracleColumn))
|
|
239
234
|
// match the order of the columns in the db
|
|
240
235
|
.sort((c1, c2) => c1.id - c2.id)
|
|
241
236
|
.forEach(oracleColumn => {
|
|
@@ -243,7 +238,7 @@ var OracleModule;
|
|
|
243
238
|
let fieldSchema = table.schema[columnName];
|
|
244
239
|
if (!fieldSchema) {
|
|
245
240
|
fieldSchema = {
|
|
246
|
-
autocolumn:
|
|
241
|
+
autocolumn: OracleIntegration.isAutoColumn(oracleColumn),
|
|
247
242
|
name: columnName,
|
|
248
243
|
type: this.internalConvertType(oracleColumn),
|
|
249
244
|
};
|
|
@@ -266,11 +261,11 @@ var OracleModule;
|
|
|
266
261
|
return __awaiter(this, void 0, void 0, function* () {
|
|
267
262
|
let connection;
|
|
268
263
|
try {
|
|
264
|
+
this.index = 1;
|
|
269
265
|
connection = yield this.getConnection();
|
|
270
266
|
const options = { autoCommit: true };
|
|
271
267
|
const bindings = query.bindings || [];
|
|
272
|
-
|
|
273
|
-
return result;
|
|
268
|
+
return yield connection.execute(query.sql, bindings, options);
|
|
274
269
|
}
|
|
275
270
|
finally {
|
|
276
271
|
if (connection) {
|