@budibase/server 1.0.98 → 1.0.101
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/builder/assets/index.cca3db8c.js +1291 -0
- package/builder/assets/{index.7c8961b4.css → index.ea3718aa.css} +2 -2
- package/builder/assets/{vendor.a7c6ad0a.js → vendor.8e34a169.js} +1 -1
- package/builder/index.html +3 -3
- package/coverage/clover.xml +354 -334
- package/coverage/coverage-final.json +15 -15
- package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
- package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/controllers/application.js.html +1 -1
- package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
- package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
- package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
- package/coverage/lcov-report/api/controllers/component.js.html +4 -4
- package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
- package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
- package/coverage/lcov-report/api/controllers/index.html +18 -18
- package/coverage/lcov-report/api/controllers/integration.js.html +59 -11
- package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
- package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
- package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
- package/coverage/lcov-report/api/controllers/permission.js.html +7 -7
- package/coverage/lcov-report/api/controllers/query/index.html +1 -1
- package/coverage/lcov-report/api/controllers/query/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/query/validation.js.html +2 -2
- package/coverage/lcov-report/api/controllers/role.js.html +1 -1
- package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/index.html +10 -10
- package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internal.js.html +19 -7
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/utils.js.html +6 -6
- package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
- package/coverage/lcov-report/api/controllers/script.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
- package/coverage/lcov-report/api/controllers/user.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
- package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
- package/coverage/lcov-report/api/index.html +1 -1
- package/coverage/lcov-report/api/index.js.html +1 -1
- package/coverage/lcov-report/api/routes/analytics.js.html +3 -3
- package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/routes/application.js.html +1 -1
- package/coverage/lcov-report/api/routes/auth.js.html +1 -1
- package/coverage/lcov-report/api/routes/automation.js.html +1 -1
- package/coverage/lcov-report/api/routes/backup.js.html +1 -1
- package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
- package/coverage/lcov-report/api/routes/component.js.html +1 -1
- package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
- package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
- package/coverage/lcov-report/api/routes/dev.js.html +1 -1
- package/coverage/lcov-report/api/routes/index.html +1 -1
- package/coverage/lcov-report/api/routes/index.js.html +1 -1
- package/coverage/lcov-report/api/routes/integration.js.html +1 -1
- package/coverage/lcov-report/api/routes/layout.js.html +1 -1
- package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
- package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
- package/coverage/lcov-report/api/routes/permission.js.html +1 -1
- package/coverage/lcov-report/api/routes/query.js.html +1 -1
- package/coverage/lcov-report/api/routes/role.js.html +1 -1
- package/coverage/lcov-report/api/routes/routing.js.html +1 -1
- package/coverage/lcov-report/api/routes/row.js.html +1 -1
- package/coverage/lcov-report/api/routes/screen.js.html +1 -1
- package/coverage/lcov-report/api/routes/script.js.html +1 -1
- package/coverage/lcov-report/api/routes/static.js.html +1 -1
- package/coverage/lcov-report/api/routes/table.js.html +2 -2
- package/coverage/lcov-report/api/routes/templates.js.html +1 -1
- package/coverage/lcov-report/api/routes/user.js.html +1 -1
- package/coverage/lcov-report/api/routes/utils/index.html +1 -1
- package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
- package/coverage/lcov-report/api/routes/view.js.html +1 -1
- package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/actions.js.html +1 -1
- package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
- package/coverage/lcov-report/automations/bullboard.js.html +1 -1
- package/coverage/lcov-report/automations/index.html +12 -12
- package/coverage/lcov-report/automations/index.js.html +1 -1
- package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
- package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
- package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
- package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
- package/coverage/lcov-report/automations/steps/index.html +1 -1
- package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
- package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
- package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
- package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
- package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
- package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
- package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
- package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/triggers.js.html +1 -1
- package/coverage/lcov-report/automations/utils.js.html +20 -8
- package/coverage/lcov-report/constants/index.html +1 -1
- package/coverage/lcov-report/constants/index.js.html +1 -1
- package/coverage/lcov-report/constants/layouts.js.html +1 -1
- package/coverage/lcov-report/constants/screens.js.html +1 -1
- package/coverage/lcov-report/db/client.js.html +1 -1
- package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
- package/coverage/lcov-report/db/index.html +1 -1
- package/coverage/lcov-report/db/index.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.js.html +10 -10
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +7 -7
- package/coverage/lcov-report/db/newid.js.html +2 -2
- package/coverage/lcov-report/db/utils.js.html +2 -2
- 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 +1 -1
- package/coverage/lcov-report/events/utils.js.html +1 -1
- package/coverage/lcov-report/index.html +31 -31
- 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 +1 -1
- package/coverage/lcov-report/middleware/authorized.js.html +75 -15
- package/coverage/lcov-report/middleware/builder.js.html +1 -1
- package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
- package/coverage/lcov-report/middleware/index.html +15 -15
- package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
- package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
- package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
- package/coverage/lcov-report/middleware/utils.js.html +1 -1
- package/coverage/lcov-report/threads/automation.js.html +1 -1
- package/coverage/lcov-report/threads/index.html +1 -1
- package/coverage/lcov-report/threads/index.js.html +1 -1
- package/coverage/lcov-report/threads/query.js.html +1 -1
- package/coverage/lcov-report/threads/utils.js.html +1 -1
- package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
- package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
- package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
- package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
- package/coverage/lcov-report/utilities/global.js.html +1 -1
- package/coverage/lcov-report/utilities/index.html +1 -1
- package/coverage/lcov-report/utilities/index.js.html +1 -1
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
- 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 +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +12 -12
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +8 -8
- package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
- package/coverage/lcov-report/utilities/security.js.html +1 -1
- 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 +1 -1
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
- package/coverage/lcov-report/utilities/users.js.html +1 -1
- package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
- package/coverage/lcov.info +584 -546
- package/dist/api/controllers/integration.js +15 -1
- package/dist/api/controllers/permission.js +3 -4
- package/dist/api/controllers/query/import/index.js +2 -1
- package/dist/api/controllers/query/import/sources/base/index.js +12 -1
- package/dist/api/controllers/query/import/sources/curl.js +2 -2
- package/dist/api/controllers/query/import/sources/openapi3.js +174 -0
- package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
- package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
- package/dist/api/controllers/row/internal.js +2 -1
- package/dist/api/routes/analytics.js +2 -2
- package/dist/api/routes/table.js +1 -1
- package/dist/automations/utils.js +3 -1
- package/dist/definitions/datasource.js +1 -0
- package/dist/environment.js +2 -0
- package/dist/integrations/base/sql.js +16 -9
- package/dist/integrations/dynamodb.js +3 -1
- package/dist/integrations/firebase.js +192 -0
- package/dist/integrations/googlesheets.js +17 -1
- package/dist/integrations/index.js +4 -1
- package/dist/integrations/mysql.js +14 -1
- package/dist/integrations/rest.js +2 -1
- package/dist/middleware/authorized.js +24 -7
- package/dist/package.json +7 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -5
- package/scripts/dev/manage.js +2 -1
- package/specs/openapi.json +23 -3
- package/specs/openapi.yaml +20 -4
- package/specs/resources/query.js +27 -5
- package/src/api/controllers/integration.js +17 -1
- package/src/api/controllers/permission.js +3 -3
- package/src/api/controllers/query/import/index.ts +2 -1
- package/src/api/controllers/query/import/sources/base/index.ts +12 -2
- package/src/api/controllers/query/import/sources/curl.ts +2 -2
- package/src/api/controllers/query/import/sources/openapi3.ts +205 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.yaml +153 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.yaml +804 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/openapi3.spec.js +240 -0
- package/src/api/controllers/query/import/tests/index.spec.js +43 -0
- package/src/api/controllers/row/internal.js +5 -1
- package/src/api/routes/analytics.js +2 -2
- package/src/api/routes/table.js +1 -1
- package/src/api/routes/tests/misc.spec.js +2 -2
- package/src/automations/utils.js +5 -1
- package/src/definitions/datasource.ts +2 -5
- package/src/definitions/openapi.ts +480 -470
- package/src/environment.js +2 -0
- package/src/integrations/base/sql.ts +14 -9
- package/src/integrations/dynamodb.ts +3 -1
- package/src/integrations/firebase.ts +205 -0
- package/src/integrations/googlesheets.ts +16 -1
- package/src/integrations/index.ts +4 -1
- package/src/integrations/mysql.ts +15 -1
- package/src/integrations/rest.ts +2 -1
- package/src/integrations/tests/sql.spec.js +51 -0
- package/src/middleware/authorized.js +26 -6
- package/builder/assets/index.2dcb5072.js +0 -1291
|
@@ -91,7 +91,8 @@ exports.patch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
91
91
|
const isUserTable = tableId === InternalTables.USER_METADATA;
|
|
92
92
|
let oldRow;
|
|
93
93
|
try {
|
|
94
|
-
|
|
94
|
+
let dbTable = yield db.get(tableId);
|
|
95
|
+
oldRow = yield outputProcessing(dbTable, yield findRow(ctx, tableId, inputs._id));
|
|
95
96
|
}
|
|
96
97
|
catch (err) {
|
|
97
98
|
if (isUserTable) {
|
|
@@ -3,6 +3,6 @@ const Router = require("@koa/router");
|
|
|
3
3
|
const controller = require("../controllers/analytics");
|
|
4
4
|
const router = Router();
|
|
5
5
|
router
|
|
6
|
-
.get("/api/
|
|
7
|
-
.post("/api/
|
|
6
|
+
.get("/api/bbtel", controller.isEnabled)
|
|
7
|
+
.post("/api/bbtel/ping", controller.endUserPing);
|
|
8
8
|
module.exports = router;
|
package/dist/api/routes/table.js
CHANGED
|
@@ -32,7 +32,7 @@ router
|
|
|
32
32
|
*
|
|
33
33
|
* @apiSuccess {object[]} body The response body will be the table that was found.
|
|
34
34
|
*/
|
|
35
|
-
.get("/api/tables/:tableId", paramResource("tableId"), authorized(PermissionTypes.TABLE, PermissionLevels.READ), tableController.find)
|
|
35
|
+
.get("/api/tables/:tableId", paramResource("tableId"), authorized(PermissionTypes.TABLE, PermissionLevels.READ, { schema: true }), tableController.find)
|
|
36
36
|
/**
|
|
37
37
|
* @api {post} /api/tables Save a table
|
|
38
38
|
* @apiName Save a table
|
|
@@ -25,10 +25,12 @@ const Runner = new Thread(ThreadType.AUTOMATION);
|
|
|
25
25
|
exports.processEvent = (job) => __awaiter(void 0, void 0, void 0, function* () {
|
|
26
26
|
try {
|
|
27
27
|
// need to actually await these so that an error can be captured properly
|
|
28
|
+
console.log(`${job.data.automation.appId} automation ${job.data.automation._id} running`);
|
|
28
29
|
return yield Runner.run(job);
|
|
29
30
|
}
|
|
30
31
|
catch (err) {
|
|
31
|
-
|
|
32
|
+
const errJson = JSON.stringify(err);
|
|
33
|
+
console.error(`${job.data.automation.appId} automation ${job.data.automation._id} was unable to run - ${errJson}`);
|
|
32
34
|
console.trace(err);
|
|
33
35
|
return { err };
|
|
34
36
|
}
|
|
@@ -50,6 +50,7 @@ var SourceNames;
|
|
|
50
50
|
SourceNames["REST"] = "REST";
|
|
51
51
|
SourceNames["ORACLE"] = "ORACLE";
|
|
52
52
|
SourceNames["GOOGLE_SHEETS"] = "GOOGLE_SHEETS";
|
|
53
|
+
SourceNames["FIREBASE"] = "FIREBASE";
|
|
53
54
|
})(SourceNames = exports.SourceNames || (exports.SourceNames = {}));
|
|
54
55
|
var IncludeRelationships;
|
|
55
56
|
(function (IncludeRelationships) {
|
package/dist/environment.js
CHANGED
|
@@ -38,6 +38,8 @@ module.exports = {
|
|
|
38
38
|
MULTI_TENANCY: process.env.MULTI_TENANCY,
|
|
39
39
|
HTTP_MIGRATIONS: process.env.HTTP_MIGRATIONS,
|
|
40
40
|
API_REQ_LIMIT_PER_SEC: process.env.API_REQ_LIMIT_PER_SEC,
|
|
41
|
+
GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID,
|
|
42
|
+
GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET,
|
|
41
43
|
// environment
|
|
42
44
|
NODE_ENV: process.env.NODE_ENV,
|
|
43
45
|
JEST_WORKER_ID: process.env.JEST_WORKER_ID,
|
|
@@ -34,11 +34,8 @@ function parse(input) {
|
|
|
34
34
|
if (typeof input !== "string") {
|
|
35
35
|
return input;
|
|
36
36
|
}
|
|
37
|
-
if (input === MAX_ISO_DATE) {
|
|
38
|
-
return
|
|
39
|
-
}
|
|
40
|
-
if (input === MIN_ISO_DATE) {
|
|
41
|
-
return new Date(-8640000000000000);
|
|
37
|
+
if (input === MAX_ISO_DATE || input === MIN_ISO_DATE) {
|
|
38
|
+
return null;
|
|
42
39
|
}
|
|
43
40
|
if (utils_1.isIsoDateString(input)) {
|
|
44
41
|
return new Date(input);
|
|
@@ -127,11 +124,21 @@ class InternalBuilder {
|
|
|
127
124
|
}
|
|
128
125
|
if (filters.range) {
|
|
129
126
|
iterate(filters.range, (key, value) => {
|
|
130
|
-
if (
|
|
131
|
-
|
|
127
|
+
if (value.low && value.high) {
|
|
128
|
+
// Use a between operator if we have 2 valid range values
|
|
129
|
+
const fnc = allOr ? "orWhereBetween" : "whereBetween";
|
|
130
|
+
query = query[fnc](key, [value.low, value.high]);
|
|
131
|
+
}
|
|
132
|
+
else if (value.low) {
|
|
133
|
+
// Use just a single greater than operator if we only have a low
|
|
134
|
+
const fnc = allOr ? "orWhere" : "where";
|
|
135
|
+
query = query[fnc](key, ">", value.low);
|
|
136
|
+
}
|
|
137
|
+
else if (value.high) {
|
|
138
|
+
// Use just a single less than operator if we only have a high
|
|
139
|
+
const fnc = allOr ? "orWhere" : "where";
|
|
140
|
+
query = query[fnc](key, "<", value.high);
|
|
132
141
|
}
|
|
133
|
-
const fnc = allOr ? "orWhereBetween" : "whereBetween";
|
|
134
|
-
query = query[fnc](key, [value.low, value.high]);
|
|
135
142
|
});
|
|
136
143
|
}
|
|
137
144
|
if (filters.equal) {
|
|
@@ -124,7 +124,9 @@ var DynamoModule;
|
|
|
124
124
|
class DynamoDBIntegration {
|
|
125
125
|
constructor(config) {
|
|
126
126
|
this.config = config;
|
|
127
|
-
this.
|
|
127
|
+
if (!this.config.endpoint) {
|
|
128
|
+
this.connect();
|
|
129
|
+
}
|
|
128
130
|
let options = {
|
|
129
131
|
correctClockSkew: true,
|
|
130
132
|
endpoint: config.endpoint ? config.endpoint : undefined,
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const datasource_1 = require("../definitions/datasource");
|
|
13
|
+
const firestore_1 = require("@google-cloud/firestore");
|
|
14
|
+
var Firebase;
|
|
15
|
+
(function (Firebase) {
|
|
16
|
+
const SCHEMA = {
|
|
17
|
+
docs: "https://firebase.google.com/docs/firestore/quickstart",
|
|
18
|
+
friendlyName: "Firestore",
|
|
19
|
+
description: "Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud.",
|
|
20
|
+
datasource: {
|
|
21
|
+
email: {
|
|
22
|
+
type: datasource_1.DatasourceFieldTypes.STRING,
|
|
23
|
+
required: true,
|
|
24
|
+
},
|
|
25
|
+
privateKey: {
|
|
26
|
+
type: datasource_1.DatasourceFieldTypes.STRING,
|
|
27
|
+
required: true,
|
|
28
|
+
},
|
|
29
|
+
projectId: {
|
|
30
|
+
type: datasource_1.DatasourceFieldTypes.STRING,
|
|
31
|
+
required: true,
|
|
32
|
+
},
|
|
33
|
+
serviceAccount: {
|
|
34
|
+
type: datasource_1.DatasourceFieldTypes.JSON,
|
|
35
|
+
required: false,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
query: {
|
|
39
|
+
create: {
|
|
40
|
+
type: datasource_1.QueryTypes.JSON,
|
|
41
|
+
},
|
|
42
|
+
read: {
|
|
43
|
+
type: datasource_1.QueryTypes.JSON,
|
|
44
|
+
},
|
|
45
|
+
update: {
|
|
46
|
+
type: datasource_1.QueryTypes.JSON,
|
|
47
|
+
},
|
|
48
|
+
delete: {
|
|
49
|
+
type: datasource_1.QueryTypes.JSON,
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
extra: {
|
|
53
|
+
collection: {
|
|
54
|
+
displayName: "Collection",
|
|
55
|
+
type: datasource_1.DatasourceFieldTypes.STRING,
|
|
56
|
+
required: true,
|
|
57
|
+
},
|
|
58
|
+
filterField: {
|
|
59
|
+
displayName: "Filter field",
|
|
60
|
+
type: datasource_1.DatasourceFieldTypes.STRING,
|
|
61
|
+
required: false,
|
|
62
|
+
},
|
|
63
|
+
filter: {
|
|
64
|
+
displayName: "Filter comparison",
|
|
65
|
+
type: datasource_1.DatasourceFieldTypes.LIST,
|
|
66
|
+
required: false,
|
|
67
|
+
data: {
|
|
68
|
+
read: [
|
|
69
|
+
"==",
|
|
70
|
+
"<",
|
|
71
|
+
"<=",
|
|
72
|
+
"==",
|
|
73
|
+
"!=",
|
|
74
|
+
">=",
|
|
75
|
+
">",
|
|
76
|
+
"array-contains",
|
|
77
|
+
"in",
|
|
78
|
+
"not-in",
|
|
79
|
+
"array-contains-any",
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
filterValue: {
|
|
84
|
+
displayName: "Filter value",
|
|
85
|
+
type: datasource_1.DatasourceFieldTypes.STRING,
|
|
86
|
+
required: false,
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
class FirebaseIntegration {
|
|
91
|
+
constructor(config) {
|
|
92
|
+
this.config = config;
|
|
93
|
+
if (config.serviceAccount) {
|
|
94
|
+
const serviceAccount = JSON.parse(config.serviceAccount);
|
|
95
|
+
this.db = new firestore_1.Firestore({
|
|
96
|
+
projectId: serviceAccount.project_id,
|
|
97
|
+
credentials: {
|
|
98
|
+
client_email: serviceAccount.client_email,
|
|
99
|
+
private_key: serviceAccount.private_key,
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
this.db = new firestore_1.Firestore({
|
|
105
|
+
projectId: config.projectId,
|
|
106
|
+
credentials: {
|
|
107
|
+
client_email: config.email,
|
|
108
|
+
private_key: config.privateKey,
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
create(query) {
|
|
114
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
115
|
+
try {
|
|
116
|
+
const documentReference = this.db
|
|
117
|
+
.collection(query.extra.collection)
|
|
118
|
+
.doc();
|
|
119
|
+
yield documentReference.set(Object.assign(Object.assign({}, query.json), { id: documentReference.id }));
|
|
120
|
+
const snapshot = yield documentReference.get();
|
|
121
|
+
return snapshot.data();
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
console.error("Error writing to Firestore", err);
|
|
125
|
+
throw err;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
read(query) {
|
|
130
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
131
|
+
try {
|
|
132
|
+
let snapshot;
|
|
133
|
+
const collectionRef = this.db.collection(query.extra.collection);
|
|
134
|
+
if (query.extra.filterField &&
|
|
135
|
+
query.extra.filter &&
|
|
136
|
+
query.extra.filterValue) {
|
|
137
|
+
snapshot = yield collectionRef
|
|
138
|
+
.where(query.extra.filterField, query.extra.filter, query.extra.filterValue)
|
|
139
|
+
.get();
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
snapshot = yield collectionRef.get();
|
|
143
|
+
}
|
|
144
|
+
const result = [];
|
|
145
|
+
snapshot.forEach(doc => result.push(doc.data()));
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
console.error("Error querying Firestore", err);
|
|
150
|
+
throw err;
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
update(query) {
|
|
155
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
156
|
+
try {
|
|
157
|
+
yield this.db
|
|
158
|
+
.collection(query.extra.collection)
|
|
159
|
+
.doc(query.json.id)
|
|
160
|
+
.update(query.json);
|
|
161
|
+
return (yield this.db
|
|
162
|
+
.collection(query.extra.collection)
|
|
163
|
+
.doc(query.json.id)
|
|
164
|
+
.get()).data();
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
console.error("Error writing to firebase", err);
|
|
168
|
+
throw err;
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
delete(query) {
|
|
173
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
174
|
+
try {
|
|
175
|
+
yield this.db
|
|
176
|
+
.collection(query.extra.collection)
|
|
177
|
+
.doc(query.json.id)
|
|
178
|
+
.delete();
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
console.error("Error writing to mongodb", err);
|
|
183
|
+
throw err;
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
module.exports = {
|
|
189
|
+
schema: SCHEMA,
|
|
190
|
+
integration: FirebaseIntegration,
|
|
191
|
+
};
|
|
192
|
+
})(Firebase || (Firebase = {}));
|
|
@@ -8,12 +8,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
11
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
15
|
const datasource_1 = require("../definitions/datasource");
|
|
13
16
|
const google_auth_library_1 = require("google-auth-library");
|
|
14
17
|
const utils_1 = require("./utils");
|
|
15
18
|
const constants_1 = require("../constants");
|
|
16
19
|
const google_spreadsheet_1 = require("google-spreadsheet");
|
|
20
|
+
const environment_1 = __importDefault(require("../environment"));
|
|
17
21
|
var GoogleSheetsModule;
|
|
18
22
|
(function (GoogleSheetsModule) {
|
|
19
23
|
const { getGlobalDB } = require("@budibase/backend-core/tenancy");
|
|
@@ -120,13 +124,25 @@ var GoogleSheetsModule;
|
|
|
120
124
|
try {
|
|
121
125
|
// Initialise oAuth client
|
|
122
126
|
const db = getGlobalDB();
|
|
123
|
-
|
|
127
|
+
let googleConfig = yield getScopedConfig(db, {
|
|
124
128
|
type: Configs.GOOGLE,
|
|
125
129
|
});
|
|
130
|
+
if (!googleConfig) {
|
|
131
|
+
googleConfig = {
|
|
132
|
+
clientID: environment_1.default.GOOGLE_CLIENT_ID,
|
|
133
|
+
clientSecret: environment_1.default.GOOGLE_CLIENT_SECRET,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
126
136
|
const oauthClient = new google_auth_library_1.OAuth2Client({
|
|
127
137
|
clientId: googleConfig.clientID,
|
|
128
138
|
clientSecret: googleConfig.clientSecret,
|
|
129
139
|
});
|
|
140
|
+
oauthClient.on("tokens", tokens => {
|
|
141
|
+
oauthClient.setCredentials({
|
|
142
|
+
refresh_token: googleConfig.refreshToken,
|
|
143
|
+
access_token: tokens.access_token,
|
|
144
|
+
});
|
|
145
|
+
});
|
|
130
146
|
oauthClient.credentials.access_token = this.config.auth.accessToken;
|
|
131
147
|
oauthClient.credentials.refresh_token = this.config.auth.refreshToken;
|
|
132
148
|
this.client.useOAuth2Client(oauthClient);
|
|
@@ -11,6 +11,7 @@ const mysql = require("./mysql");
|
|
|
11
11
|
const arangodb = require("./arangodb");
|
|
12
12
|
const rest = require("./rest");
|
|
13
13
|
const googlesheets = require("./googlesheets");
|
|
14
|
+
const firebase = require("./firebase");
|
|
14
15
|
const { SourceNames } = require("../definitions/datasource");
|
|
15
16
|
const environment = require("../environment");
|
|
16
17
|
const DEFINITIONS = {
|
|
@@ -25,6 +26,7 @@ const DEFINITIONS = {
|
|
|
25
26
|
[SourceNames.MYSQL]: mysql.schema,
|
|
26
27
|
[SourceNames.ARANGODB]: arangodb.schema,
|
|
27
28
|
[SourceNames.REST]: rest.schema,
|
|
29
|
+
[SourceNames.FIREBASE]: firebase.schema,
|
|
28
30
|
};
|
|
29
31
|
const INTEGRATIONS = {
|
|
30
32
|
[SourceNames.POSTGRES]: postgres.integration,
|
|
@@ -38,6 +40,8 @@ const INTEGRATIONS = {
|
|
|
38
40
|
[SourceNames.MYSQL]: mysql.integration,
|
|
39
41
|
[SourceNames.ARANGODB]: arangodb.integration,
|
|
40
42
|
[SourceNames.REST]: rest.integration,
|
|
43
|
+
[SourceNames.FIREBASE]: firebase.integration,
|
|
44
|
+
[SourceNames.GOOGLE_SHEETS]: googlesheets.integration,
|
|
41
45
|
};
|
|
42
46
|
// optionally add oracle integration if the oracle binary can be installed
|
|
43
47
|
if (!(process.arch === "arm64" && process.platform === "darwin")) {
|
|
@@ -47,7 +51,6 @@ if (!(process.arch === "arm64" && process.platform === "darwin")) {
|
|
|
47
51
|
}
|
|
48
52
|
if (environment.SELF_HOSTED) {
|
|
49
53
|
DEFINITIONS[SourceNames.GOOGLE_SHEETS] = googlesheets.schema;
|
|
50
|
-
INTEGRATIONS[SourceNames.GOOGLE_SHEETS] = googlesheets.integration;
|
|
51
54
|
}
|
|
52
55
|
module.exports = {
|
|
53
56
|
definitions: DEFINITIONS,
|
|
@@ -65,6 +65,19 @@ var MySQLModule;
|
|
|
65
65
|
},
|
|
66
66
|
},
|
|
67
67
|
};
|
|
68
|
+
function bindingTypeCoerce(bindings) {
|
|
69
|
+
for (let i = 0; i < bindings.length; i++) {
|
|
70
|
+
const binding = bindings[i];
|
|
71
|
+
if (typeof binding !== "string") {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const matches = binding.match(/^\d*/g);
|
|
75
|
+
if (matches && matches[0] !== "" && !isNaN(Number(matches[0]))) {
|
|
76
|
+
bindings[i] = parseFloat(binding);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return bindings;
|
|
80
|
+
}
|
|
68
81
|
class MySQLIntegration extends Sql {
|
|
69
82
|
constructor(config) {
|
|
70
83
|
super(utils_1.SqlClients.MY_SQL);
|
|
@@ -99,7 +112,7 @@ var MySQLModule;
|
|
|
99
112
|
yield this.connect();
|
|
100
113
|
}
|
|
101
114
|
// Node MySQL is callback based, so we must wrap our call in a promise
|
|
102
|
-
const response = yield this.client.query(query.sql, query.bindings || []);
|
|
115
|
+
const response = yield this.client.query(query.sql, bindingTypeCoerce(query.bindings || []));
|
|
103
116
|
return response[0];
|
|
104
117
|
}
|
|
105
118
|
finally {
|
|
@@ -10,6 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
const datasource_1 = require("../definitions/datasource");
|
|
13
|
+
const lodash_1 = require("lodash");
|
|
13
14
|
const BodyTypes = {
|
|
14
15
|
NONE: "none",
|
|
15
16
|
FORM_DATA: "form",
|
|
@@ -148,7 +149,7 @@ var RestModule;
|
|
|
148
149
|
// Check if a pagination cursor exists in the response
|
|
149
150
|
let nextCursor = null;
|
|
150
151
|
if (pagination === null || pagination === void 0 ? void 0 : pagination.responseParam) {
|
|
151
|
-
nextCursor = data
|
|
152
|
+
nextCursor = lodash_1.get(data, pagination.responseParam);
|
|
152
153
|
}
|
|
153
154
|
return {
|
|
154
155
|
data,
|
|
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
const { getUserRoleHierarchy, getRequiredResourceRole, BUILTIN_ROLE_IDS, } = require("@budibase/backend-core/roles");
|
|
12
|
-
const { PermissionTypes, doesHaveBasePermission, } = require("@budibase/backend-core/permissions");
|
|
12
|
+
const { PermissionTypes, PermissionLevels, doesHaveBasePermission, } = require("@budibase/backend-core/permissions");
|
|
13
13
|
const builderMiddleware = require("./builder");
|
|
14
14
|
const { isWebhookEndpoint } = require("./utils");
|
|
15
15
|
const { buildCsrfMiddleware } = require("@budibase/backend-core/auth");
|
|
@@ -57,7 +57,7 @@ const checkAuthorizedResource = (ctx, resourceRoles, permType, permLevel) => __a
|
|
|
57
57
|
}
|
|
58
58
|
});
|
|
59
59
|
module.exports =
|
|
60
|
-
(permType, permLevel = null) => (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
60
|
+
(permType, permLevel = null, opts = { schema: false }) => (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
61
61
|
// webhooks don't need authentication, each webhook unique
|
|
62
62
|
// also internal requests (between services) don't need authorized
|
|
63
63
|
if (isWebhookEndpoint(ctx) || ctx.internal) {
|
|
@@ -70,22 +70,39 @@ module.exports =
|
|
|
70
70
|
// to find API endpoints which are builder focused
|
|
71
71
|
yield builderMiddleware(ctx, permType);
|
|
72
72
|
// get the resource roles
|
|
73
|
-
let resourceRoles = [];
|
|
73
|
+
let resourceRoles = [], otherLevelRoles;
|
|
74
|
+
const otherLevel = permLevel === PermissionLevels.READ
|
|
75
|
+
? PermissionLevels.WRITE
|
|
76
|
+
: PermissionLevels.READ;
|
|
74
77
|
const appId = getAppId();
|
|
75
78
|
if (appId && hasResource(ctx)) {
|
|
76
79
|
resourceRoles = yield getRequiredResourceRole(permLevel, ctx);
|
|
80
|
+
if (opts && opts.schema) {
|
|
81
|
+
otherLevelRoles = yield getRequiredResourceRole(otherLevel, ctx);
|
|
82
|
+
}
|
|
77
83
|
}
|
|
78
84
|
// if the resource is public, proceed
|
|
79
|
-
|
|
80
|
-
|
|
85
|
+
if (resourceRoles.includes(BUILTIN_ROLE_IDS.PUBLIC) ||
|
|
86
|
+
(otherLevelRoles && otherLevelRoles.includes(BUILTIN_ROLE_IDS.PUBLIC))) {
|
|
81
87
|
return next();
|
|
82
88
|
}
|
|
83
89
|
// check authenticated
|
|
84
90
|
if (!ctx.isAuthenticated) {
|
|
85
91
|
return ctx.throw(403, "Session not authenticated");
|
|
86
92
|
}
|
|
87
|
-
|
|
88
|
-
|
|
93
|
+
try {
|
|
94
|
+
// check authorized
|
|
95
|
+
yield checkAuthorized(ctx, resourceRoles, permType, permLevel);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
// this is a schema, check if
|
|
99
|
+
if (opts && opts.schema && permLevel) {
|
|
100
|
+
yield checkAuthorized(ctx, otherLevelRoles, permType, otherLevel);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
throw err;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
89
106
|
// csrf protection
|
|
90
107
|
return csrf(ctx, next);
|
|
91
108
|
});
|
package/dist/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/server",
|
|
3
3
|
"email": "hi@budibase.com",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.100",
|
|
5
5
|
"description": "Budibase Web Server",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
7
|
"repository": {
|
|
@@ -68,12 +68,13 @@
|
|
|
68
68
|
"license": "GPL-3.0",
|
|
69
69
|
"dependencies": {
|
|
70
70
|
"@apidevtools/swagger-parser": "^10.0.3",
|
|
71
|
-
"@budibase/backend-core": "^1.0.
|
|
72
|
-
"@budibase/client": "^1.0.
|
|
73
|
-
"@budibase/string-templates": "^1.0.
|
|
71
|
+
"@budibase/backend-core": "^1.0.100",
|
|
72
|
+
"@budibase/client": "^1.0.100",
|
|
73
|
+
"@budibase/string-templates": "^1.0.100",
|
|
74
74
|
"@bull-board/api": "^3.7.0",
|
|
75
75
|
"@bull-board/koa": "^3.7.0",
|
|
76
76
|
"@elastic/elasticsearch": "7.10.0",
|
|
77
|
+
"@google-cloud/firestore": "^5.0.2",
|
|
77
78
|
"@koa/router": "8.0.0",
|
|
78
79
|
"@sendgrid/mail": "7.1.1",
|
|
79
80
|
"@sentry/node": "^6.0.0",
|
|
@@ -145,6 +146,7 @@
|
|
|
145
146
|
"@types/jest": "^26.0.23",
|
|
146
147
|
"@types/koa": "^2.13.3",
|
|
147
148
|
"@types/koa-router": "^7.4.2",
|
|
149
|
+
"@types/lodash": "4.14.180",
|
|
148
150
|
"@types/node": "^15.12.4",
|
|
149
151
|
"@types/oracledb": "^5.2.1",
|
|
150
152
|
"@types/redis": "^4.0.11",
|
|
@@ -153,6 +155,7 @@
|
|
|
153
155
|
"copyfiles": "^2.4.1",
|
|
154
156
|
"docker-compose": "^0.23.6",
|
|
155
157
|
"eslint": "^6.8.0",
|
|
158
|
+
"is-wsl": "^2.2.0",
|
|
156
159
|
"jest": "^27.0.5",
|
|
157
160
|
"jest-openapi": "^0.14.2",
|
|
158
161
|
"nodemon": "^2.0.4",
|