@budibase/server 1.0.123 → 1.0.125
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.3d890df7.js +1299 -0
- package/builder/assets/index.89795487.css +6 -0
- package/builder/assets/{vendor.8e34a169.js → vendor.5240f480.js} +1 -1
- package/builder/index.html +3 -3
- package/coverage/clover.xml +695 -1678
- package/coverage/coverage-final.json +28 -43
- package/coverage/lcov-report/api/controllers/analytics.js.html +8 -3
- package/coverage/lcov-report/api/controllers/apikeys.js.html +9 -4
- package/coverage/lcov-report/api/controllers/auth.js.html +8 -3
- package/coverage/lcov-report/api/controllers/automation.js.html +8 -3
- package/coverage/lcov-report/api/controllers/backup.js.html +8 -3
- package/coverage/lcov-report/api/controllers/cloud.js.html +8 -3
- package/coverage/lcov-report/api/controllers/component.js.html +8 -3
- package/coverage/lcov-report/api/controllers/datasource.js.html +11 -6
- package/coverage/lcov-report/api/controllers/dev.js.html +8 -3
- package/coverage/lcov-report/api/controllers/index.html +16 -26
- package/coverage/lcov-report/api/controllers/integration.js.html +8 -3
- package/coverage/lcov-report/api/controllers/layout.js.html +8 -3
- package/coverage/lcov-report/api/controllers/metadata.js.html +8 -3
- package/coverage/lcov-report/api/controllers/migrations.js.html +8 -3
- package/coverage/lcov-report/api/controllers/permission.js.html +8 -3
- package/coverage/lcov-report/api/controllers/query/index.html +16 -26
- package/coverage/lcov-report/api/controllers/query/validation.js.html +8 -3
- package/coverage/lcov-report/api/controllers/role.js.html +10 -5
- package/coverage/lcov-report/api/controllers/routing.js.html +9 -4
- package/coverage/lcov-report/api/controllers/row/external.js.html +8 -3
- package/coverage/lcov-report/api/controllers/row/index.html +25 -35
- package/coverage/lcov-report/api/controllers/row/internal.js.html +32 -24
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +21 -16
- package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +24 -19
- package/coverage/lcov-report/api/controllers/row/utils.js.html +33 -19
- package/coverage/lcov-report/api/controllers/screen.js.html +9 -4
- package/coverage/lcov-report/api/controllers/script.js.html +8 -3
- package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +55 -50
- package/coverage/lcov-report/api/controllers/table/external.js.html +8 -3
- package/coverage/lcov-report/api/controllers/table/index.html +19 -44
- package/coverage/lcov-report/api/controllers/table/index.js.html +20 -15
- package/coverage/lcov-report/api/controllers/templates.js.html +8 -3
- package/coverage/lcov-report/api/controllers/user.js.html +8 -3
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +8 -3
- package/coverage/lcov-report/api/controllers/view/index.html +8 -3
- package/coverage/lcov-report/api/controllers/view/index.js.html +10 -5
- package/coverage/lcov-report/api/controllers/view/utils.js.html +8 -3
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +8 -3
- package/coverage/lcov-report/api/controllers/webhook.js.html +10 -5
- package/coverage/lcov-report/api/index.html +18 -13
- package/coverage/lcov-report/api/index.js.html +28 -8
- package/coverage/lcov-report/api/routes/analytics.js.html +8 -3
- package/coverage/lcov-report/api/routes/apikeys.js.html +8 -3
- package/coverage/lcov-report/api/routes/auth.js.html +8 -3
- package/coverage/lcov-report/api/routes/automation.js.html +8 -3
- package/coverage/lcov-report/api/routes/backup.js.html +8 -3
- package/coverage/lcov-report/api/routes/cloud.js.html +8 -3
- package/coverage/lcov-report/api/routes/component.js.html +8 -3
- package/coverage/lcov-report/api/routes/datasource.js.html +8 -3
- package/coverage/lcov-report/api/routes/deploy.js.html +8 -3
- package/coverage/lcov-report/api/routes/dev.js.html +9 -4
- package/coverage/lcov-report/api/routes/index.html +13 -68
- package/coverage/lcov-report/api/routes/integration.js.html +8 -3
- package/coverage/lcov-report/api/routes/layout.js.html +8 -3
- package/coverage/lcov-report/api/routes/metadata.js.html +8 -3
- package/coverage/lcov-report/api/routes/migrations.js.html +8 -3
- package/coverage/lcov-report/api/routes/permission.js.html +8 -3
- package/coverage/lcov-report/api/routes/query.js.html +8 -3
- package/coverage/lcov-report/api/routes/role.js.html +8 -3
- package/coverage/lcov-report/api/routes/routing.js.html +8 -3
- package/coverage/lcov-report/api/routes/screen.js.html +8 -3
- package/coverage/lcov-report/api/routes/script.js.html +8 -3
- package/coverage/lcov-report/api/routes/table.js.html +8 -3
- package/coverage/lcov-report/api/routes/templates.js.html +8 -3
- package/coverage/lcov-report/api/routes/user.js.html +8 -3
- package/coverage/lcov-report/api/routes/utils/index.html +8 -3
- package/coverage/lcov-report/api/routes/utils/validators.js.html +8 -3
- package/coverage/lcov-report/api/routes/view.js.html +8 -3
- package/coverage/lcov-report/api/routes/webhook.js.html +8 -3
- package/coverage/lcov-report/automations/actions.js.html +21 -7
- package/coverage/lcov-report/automations/automationUtils.js.html +64 -23
- package/coverage/lcov-report/automations/bullboard.js.html +8 -3
- package/coverage/lcov-report/automations/index.html +27 -37
- package/coverage/lcov-report/automations/index.js.html +8 -3
- package/coverage/lcov-report/automations/steps/bash.js.html +8 -3
- package/coverage/lcov-report/automations/steps/delay.js.html +8 -3
- package/coverage/lcov-report/automations/steps/discord.js.html +8 -3
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +8 -3
- package/coverage/lcov-report/automations/steps/executeScript.js.html +8 -3
- package/coverage/lcov-report/automations/steps/filter.js.html +8 -3
- package/coverage/lcov-report/automations/steps/index.html +31 -41
- package/coverage/lcov-report/automations/steps/integromat.js.html +8 -3
- package/coverage/lcov-report/{api/routes/static.js.html → automations/steps/loop.js.html} +70 -80
- package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +9 -4
- package/coverage/lcov-report/automations/steps/queryRows.js.html +9 -4
- package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +8 -3
- package/coverage/lcov-report/automations/steps/serverLog.js.html +8 -3
- package/coverage/lcov-report/automations/steps/slack.js.html +8 -3
- package/coverage/lcov-report/automations/steps/updateRow.js.html +8 -3
- package/coverage/lcov-report/automations/steps/utils.js.html +14 -9
- package/coverage/lcov-report/automations/steps/zapier.js.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/app.js.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/cron.js.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/index.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +8 -3
- package/coverage/lcov-report/automations/triggers.js.html +16 -11
- package/coverage/lcov-report/block-navigation.js +8 -0
- package/coverage/lcov-report/constants/index.html +12 -7
- package/coverage/lcov-report/constants/index.js.html +55 -32
- package/coverage/lcov-report/constants/layouts.js.html +8 -3
- package/coverage/lcov-report/constants/screens.js.html +8 -3
- package/coverage/lcov-report/db/inMemoryView.js.html +8 -3
- package/coverage/lcov-report/db/index.html +8 -3
- package/coverage/lcov-report/db/index.js.html +9 -4
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +20 -15
- package/coverage/lcov-report/db/linkedRows/index.html +8 -3
- package/coverage/lcov-report/db/linkedRows/index.js.html +22 -17
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +12 -7
- package/coverage/lcov-report/db/newid.js.html +11 -6
- package/coverage/lcov-report/db/utils.js.html +84 -79
- package/coverage/lcov-report/events/AutomationEmitter.js.html +14 -9
- package/coverage/lcov-report/events/index.html +8 -3
- package/coverage/lcov-report/events/index.js.html +9 -4
- package/coverage/lcov-report/events/utils.js.html +18 -13
- package/coverage/lcov-report/index.html +125 -120
- package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +8 -3
- package/coverage/lcov-report/integrations/tests/index.html +8 -3
- package/coverage/lcov-report/middleware/appInfo.js.html +8 -3
- package/coverage/lcov-report/middleware/builder.js.html +8 -3
- package/coverage/lcov-report/middleware/currentapp.js.html +65 -15
- package/coverage/lcov-report/middleware/index.html +25 -50
- package/coverage/lcov-report/middleware/joi-validator.js.html +9 -4
- package/coverage/lcov-report/middleware/publicApi.js.html +8 -3
- package/coverage/lcov-report/middleware/resourceId.js.html +8 -3
- package/coverage/lcov-report/middleware/selfhost.js.html +9 -4
- package/coverage/lcov-report/middleware/utils.js.html +8 -3
- package/coverage/lcov-report/sorter.js +26 -0
- package/coverage/lcov-report/threads/automation.js.html +581 -90
- package/coverage/lcov-report/threads/index.html +30 -40
- package/coverage/lcov-report/threads/query.js.html +9 -4
- package/coverage/lcov-report/threads/utils.js.html +17 -9
- package/coverage/lcov-report/utilities/bcrypt.js.html +8 -3
- package/coverage/lcov-report/utilities/budibaseDir.js.html +8 -3
- package/coverage/lcov-report/utilities/centralPath.js.html +8 -3
- package/coverage/lcov-report/utilities/csvParser.js.html +10 -5
- package/coverage/lcov-report/utilities/global.js.html +9 -4
- package/coverage/lcov-report/utilities/index.html +8 -3
- package/coverage/lcov-report/utilities/index.js.html +11 -6
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +32 -9
- package/coverage/lcov-report/utilities/queue/index.html +12 -7
- package/coverage/lcov-report/utilities/routing/index.html +8 -3
- package/coverage/lcov-report/utilities/routing/index.js.html +8 -3
- package/coverage/lcov-report/utilities/rowProcessor/index.html +8 -3
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +48 -43
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +18 -13
- package/coverage/lcov-report/utilities/scriptRunner.js.html +8 -3
- package/coverage/lcov-report/utilities/security.js.html +9 -4
- package/coverage/lcov-report/utilities/statusCodes.js.html +8 -3
- package/coverage/lcov-report/utilities/usageQuota/index.html +24 -34
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +44 -39
- package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +8 -3
- package/coverage/lcov-report/utilities/users.js.html +8 -3
- package/coverage/lcov-report/utilities/workerRequests.js.html +9 -4
- package/coverage/lcov.info +1144 -2875
- package/dist/api/controllers/application.js +145 -73
- package/dist/api/controllers/deploy/index.js +68 -36
- package/dist/api/controllers/public/applications.js +29 -9
- package/dist/api/controllers/public/queries.js +27 -7
- package/dist/api/controllers/public/rows.js +32 -12
- package/dist/api/controllers/public/tables.js +2 -2
- package/dist/api/controllers/public/users.js +8 -8
- package/dist/api/controllers/public/utils.js +1 -1
- package/dist/api/controllers/query/import/index.js +3 -3
- package/dist/api/controllers/query/index.js +57 -44
- package/dist/api/controllers/row/ExternalRequest.js +27 -27
- package/dist/api/controllers/row/index.js +83 -60
- package/dist/api/controllers/row/internal.js +2 -1
- package/dist/api/controllers/row/utils.js +2 -1
- package/dist/api/controllers/static/templates/BudibaseApp.svelte +3 -0
- package/dist/api/controllers/table/bulkFormula.js +2 -1
- package/dist/api/controllers/table/internal.js +41 -35
- package/dist/api/controllers/table/utils.js +271 -229
- package/dist/api/index.js +5 -0
- package/dist/api/routes/application.js +39 -13
- package/dist/api/routes/index.js +61 -56
- package/dist/api/routes/public/index.js +6 -9
- package/dist/api/routes/public/queries.js +1 -1
- package/dist/api/routes/public/rows.js +1 -1
- package/dist/api/routes/public/tables.js +3 -3
- package/dist/api/routes/public/users.js +1 -1
- package/dist/api/routes/row.js +43 -17
- package/dist/api/routes/static.js +40 -13
- package/dist/api/routes/tests/utilities/TestFunctions.js +75 -33
- package/dist/app.js +8 -4
- package/dist/automations/actions.js +3 -0
- package/dist/automations/automationUtils.js +10 -0
- package/dist/automations/steps/createRow.js +12 -12
- package/dist/automations/steps/deleteRow.js +13 -16
- package/dist/automations/steps/loop.js +51 -0
- package/dist/automations/tests/utilities/index.js +13 -11
- package/dist/automations/utils.js +187 -133
- package/dist/constants/index.js +5 -0
- package/dist/definitions/datasource.js +1 -0
- package/dist/environment.js +2 -3
- package/dist/index.js +4 -0
- package/dist/integrations/base/sql.js +2 -2
- package/dist/integrations/base/sqlTable.js +2 -2
- package/dist/integrations/googlesheets.js +1 -1
- package/dist/integrations/index.js +4 -0
- package/dist/integrations/microsoftSqlServer.js +8 -8
- package/dist/integrations/mysql.js +9 -9
- package/dist/integrations/oracle.js +7 -7
- package/dist/integrations/postgres.js +7 -7
- package/dist/integrations/queries/sql.js +2 -2
- package/dist/integrations/redis.js +158 -0
- package/dist/integrations/rest.js +1 -1
- package/dist/middleware/authorized.js +51 -51
- package/dist/middleware/currentapp.js +15 -1
- package/dist/migrations/functions/appUrls.js +1 -1
- package/dist/migrations/functions/developerQuota.js +49 -0
- package/dist/migrations/functions/publishedAppsQuota.js +47 -0
- package/dist/migrations/functions/quotas1.js +6 -2
- package/dist/migrations/functions/usageQuotas/index.js +0 -4
- package/dist/migrations/functions/usageQuotas/syncApps.js +4 -7
- package/dist/migrations/functions/usageQuotas/syncDevelopers.js +24 -0
- package/dist/migrations/functions/usageQuotas/syncPublishedApps.js +26 -0
- package/dist/migrations/functions/usageQuotas/syncRows.js +5 -8
- package/dist/migrations/index.js +17 -1
- package/dist/package.json +14 -8
- package/dist/threads/automation.js +149 -27
- package/dist/threads/index.js +36 -10
- package/dist/threads/utils.js +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/utilities/queue/inMemoryQueue.js +6 -1
- package/nodemon.json +1 -1
- package/package.json +15 -9
- package/scripts/dev/manage.js +2 -0
- package/src/api/controllers/{application.js → application.ts} +118 -51
- package/src/api/controllers/deploy/{index.js → index.ts} +53 -29
- package/src/api/controllers/public/applications.ts +2 -2
- package/src/api/controllers/public/queries.ts +1 -1
- package/src/api/controllers/public/rows.ts +1 -1
- package/src/api/controllers/query/{index.js → index.ts} +51 -48
- package/src/api/controllers/row/ExternalRequest.ts +1 -1
- package/src/api/controllers/row/{index.js → index.ts} +24 -17
- package/src/api/controllers/row/internal.js +2 -1
- package/src/api/controllers/row/utils.js +4 -1
- package/src/api/controllers/static/templates/BudibaseApp.svelte +3 -0
- package/src/api/controllers/table/bulkFormula.js +1 -1
- package/src/api/controllers/table/{internal.js → internal.ts} +30 -26
- package/src/api/controllers/table/{utils.js → utils.ts} +86 -69
- package/src/api/index.js +5 -0
- package/src/api/routes/{application.js → application.ts} +8 -14
- package/src/api/routes/index.ts +60 -0
- package/src/api/routes/public/index.ts +1 -4
- package/src/api/routes/{row.js → row.ts} +7 -15
- package/src/api/routes/{static.js → static.ts} +11 -11
- package/src/api/routes/tests/misc.spec.js +39 -37
- package/src/api/routes/tests/utilities/{TestFunctions.js → TestFunctions.ts} +57 -33
- package/src/app.ts +1 -2
- package/src/automations/actions.js +3 -0
- package/src/automations/automationUtils.js +12 -0
- package/src/automations/steps/{createRow.js → createRow.ts} +9 -15
- package/src/automations/steps/{deleteRow.js → deleteRow.ts} +10 -16
- package/src/automations/steps/loop.js +50 -0
- package/src/automations/tests/automation.spec.js +0 -1
- package/src/automations/tests/{createRow.spec.js → createRow.spec.ts} +4 -15
- package/src/automations/tests/{deleteRow.spec.js → deleteRow.spec.ts} +3 -5
- package/src/automations/tests/utilities/index.js +12 -10
- package/src/automations/{utils.js → utils.ts} +39 -28
- package/src/constants/index.js +6 -0
- package/src/definitions/common.ts +1 -0
- package/src/definitions/datasource.ts +1 -0
- package/src/environment.js +2 -3
- package/src/index.ts +3 -0
- package/src/integrations/index.ts +4 -0
- package/src/integrations/redis.ts +152 -0
- package/src/integrations/tests/redis.spec.js +60 -0
- package/src/middleware/{authorized.js → authorized.ts} +20 -14
- package/src/middleware/currentapp.js +16 -1
- package/src/middleware/tests/currentapp.spec.js +8 -4
- package/src/migrations/functions/developerQuota.ts +15 -0
- package/src/migrations/functions/publishedAppsQuota.ts +13 -0
- package/src/migrations/functions/tests/quotas1.spec.js +0 -2
- package/src/migrations/functions/usageQuotas/index.ts +0 -5
- package/src/migrations/functions/usageQuotas/syncApps.ts +3 -6
- package/src/migrations/functions/usageQuotas/syncDevelopers.ts +19 -0
- package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +21 -0
- package/src/migrations/functions/usageQuotas/syncRows.ts +3 -6
- package/src/migrations/functions/usageQuotas/tests/syncApps.spec.ts +34 -0
- package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +40 -0
- package/src/migrations/index.ts +13 -1
- package/src/threads/automation.js +196 -34
- package/src/threads/{index.js → index.ts} +18 -14
- package/src/threads/utils.js +1 -0
- package/src/utilities/queue/inMemoryQueue.js +7 -1
- package/tsconfig.build.json +10 -0
- package/tsconfig.json +2 -2
- package/builder/assets/index.68a7f4e3.css +0 -6
- package/builder/assets/index.8d4a5b33.js +0 -1291
- package/coverage/lcov-report/api/controllers/application.js.html +0 -1436
- package/coverage/lcov-report/api/controllers/query/index.js.html +0 -713
- package/coverage/lcov-report/api/controllers/row/index.js.html +0 -524
- package/coverage/lcov-report/api/controllers/table/internal.js.html +0 -620
- package/coverage/lcov-report/api/controllers/table/utils.js.html +0 -1331
- package/coverage/lcov-report/api/routes/application.js.html +0 -179
- package/coverage/lcov-report/api/routes/index.js.html +0 -266
- package/coverage/lcov-report/api/routes/row.js.html +0 -908
- package/coverage/lcov-report/automations/steps/createRow.js.html +0 -380
- package/coverage/lcov-report/automations/steps/deleteRow.js.html +0 -347
- package/coverage/lcov-report/automations/utils.js.html +0 -665
- package/coverage/lcov-report/middleware/authorized.js.html +0 -458
- package/coverage/lcov-report/middleware/usageQuota.js.html +0 -572
- package/coverage/lcov-report/threads/index.js.html +0 -296
- package/coverage/lcov-report/utilities/usageQuota/index.js.html +0 -359
- package/dist/middleware/usageQuota.js +0 -154
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/utilities/usageQuota/index.js +0 -86
- package/src/api/routes/index.js +0 -62
- package/src/middleware/tests/usageQuota.spec.js +0 -120
- package/src/middleware/usageQuota.js +0 -164
- package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +0 -41
- package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +0 -45
- package/src/utilities/tests/usageQuota/usageQuota.spec.js +0 -72
- package/src/utilities/usageQuota/index.js +0 -93
|
@@ -1,26 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { Thread, ThreadType } from "../threads"
|
|
2
|
+
import { definitions } from "./triggerInfo"
|
|
3
|
+
import * as webhooks from "../api/controllers/webhook"
|
|
4
|
+
import { queue } from "./bullboard"
|
|
5
|
+
import newid from "../db/newid"
|
|
6
|
+
import { updateEntityMetadata } from "../utilities"
|
|
7
|
+
import { MetadataTypes, WebhookType } from "../constants"
|
|
8
|
+
import { getProdAppID, doWithDB } from "@budibase/backend-core/db"
|
|
9
|
+
import { cloneDeep } from "lodash/fp"
|
|
10
|
+
import { getAppDB, getAppId } from "@budibase/backend-core/context"
|
|
11
|
+
import { tenancy } from "@budibase/backend-core"
|
|
12
|
+
import { quotas } from "@budibase/pro"
|
|
12
13
|
|
|
13
14
|
const WH_STEP_ID = definitions.WEBHOOK.stepId
|
|
14
15
|
const CRON_STEP_ID = definitions.CRON.stepId
|
|
15
16
|
const Runner = new Thread(ThreadType.AUTOMATION)
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
export async function processEvent(job: any) {
|
|
18
19
|
try {
|
|
19
|
-
// need to actually await these so that an error can be captured properly
|
|
20
20
|
console.log(
|
|
21
21
|
`${job.data.automation.appId} automation ${job.data.automation._id} running`
|
|
22
22
|
)
|
|
23
|
-
|
|
23
|
+
// need to actually await these so that an error can be captured properly
|
|
24
|
+
const tenantId = tenancy.getTenantIDFromAppID(job.data.event.appId)
|
|
25
|
+
return await tenancy.doInTenant(tenantId, async () => {
|
|
26
|
+
const runFn = () => Runner.run(job)
|
|
27
|
+
return quotas.addAutomation(runFn)
|
|
28
|
+
})
|
|
24
29
|
} catch (err) {
|
|
25
30
|
const errJson = JSON.stringify(err)
|
|
26
31
|
console.error(
|
|
@@ -31,11 +36,15 @@ exports.processEvent = async job => {
|
|
|
31
36
|
}
|
|
32
37
|
}
|
|
33
38
|
|
|
34
|
-
|
|
39
|
+
export async function updateTestHistory(
|
|
40
|
+
appId: any,
|
|
41
|
+
automation: any,
|
|
42
|
+
history: any
|
|
43
|
+
) {
|
|
35
44
|
return updateEntityMetadata(
|
|
36
45
|
MetadataTypes.AUTOMATION_TEST_HISTORY,
|
|
37
46
|
automation._id,
|
|
38
|
-
metadata => {
|
|
47
|
+
(metadata: any) => {
|
|
39
48
|
if (metadata && Array.isArray(metadata.history)) {
|
|
40
49
|
metadata.history.push(history)
|
|
41
50
|
} else {
|
|
@@ -48,7 +57,7 @@ exports.updateTestHistory = async (appId, automation, history) => {
|
|
|
48
57
|
)
|
|
49
58
|
}
|
|
50
59
|
|
|
51
|
-
|
|
60
|
+
export function removeDeprecated(definitions: any) {
|
|
52
61
|
const base = cloneDeep(definitions)
|
|
53
62
|
for (let key of Object.keys(base)) {
|
|
54
63
|
if (base[key].deprecated) {
|
|
@@ -59,13 +68,15 @@ exports.removeDeprecated = definitions => {
|
|
|
59
68
|
}
|
|
60
69
|
|
|
61
70
|
// end the repetition and the job itself
|
|
62
|
-
|
|
71
|
+
export async function disableAllCrons(appId: any) {
|
|
63
72
|
const promises = []
|
|
64
73
|
const jobs = await queue.getRepeatableJobs()
|
|
65
74
|
for (let job of jobs) {
|
|
66
75
|
if (job.key.includes(`${appId}_cron`)) {
|
|
67
76
|
promises.push(queue.removeRepeatableByKey(job.key))
|
|
68
|
-
|
|
77
|
+
if (job.id) {
|
|
78
|
+
promises.push(queue.removeJobs(job.id))
|
|
79
|
+
}
|
|
69
80
|
}
|
|
70
81
|
}
|
|
71
82
|
return Promise.all(promises)
|
|
@@ -76,9 +87,9 @@ exports.disableAllCrons = async appId => {
|
|
|
76
87
|
* @param {string} appId The ID of the app in which we are checking for webhooks
|
|
77
88
|
* @param {object|undefined} automation The automation object to be updated.
|
|
78
89
|
*/
|
|
79
|
-
|
|
90
|
+
export async function enableCronTrigger(appId: any, automation: any) {
|
|
80
91
|
const trigger = automation ? automation.definition.trigger : null
|
|
81
|
-
function isCronTrigger(auto) {
|
|
92
|
+
function isCronTrigger(auto: any) {
|
|
82
93
|
return (
|
|
83
94
|
auto &&
|
|
84
95
|
auto.definition.trigger &&
|
|
@@ -89,7 +100,7 @@ exports.enableCronTrigger = async (appId, automation) => {
|
|
|
89
100
|
if (isCronTrigger(automation)) {
|
|
90
101
|
// make a job id rather than letting Bull decide, makes it easier to handle on way out
|
|
91
102
|
const jobId = `${appId}_cron_${newid()}`
|
|
92
|
-
const job = await queue.add(
|
|
103
|
+
const job: any = await queue.add(
|
|
93
104
|
{
|
|
94
105
|
automation,
|
|
95
106
|
event: { appId, timestamp: Date.now() },
|
|
@@ -101,7 +112,7 @@ exports.enableCronTrigger = async (appId, automation) => {
|
|
|
101
112
|
// can't use getAppDB here as this is likely to be called from dev app,
|
|
102
113
|
// but this call could be for dev app or prod app, need to just use what
|
|
103
114
|
// was passed in
|
|
104
|
-
await doWithDB(appId, async db => {
|
|
115
|
+
await doWithDB(appId, async (db: any) => {
|
|
105
116
|
const response = await db.put(automation)
|
|
106
117
|
automation._id = response.id
|
|
107
118
|
automation._rev = response.rev
|
|
@@ -118,13 +129,13 @@ exports.enableCronTrigger = async (appId, automation) => {
|
|
|
118
129
|
* @returns {Promise<object|undefined>} After this is complete the new automation object may have been updated and should be
|
|
119
130
|
* written to DB (this does not write to DB as it would be wasteful to repeat).
|
|
120
131
|
*/
|
|
121
|
-
|
|
132
|
+
export async function checkForWebhooks({ oldAuto, newAuto }: any) {
|
|
122
133
|
const appId = getAppId()
|
|
123
134
|
const oldTrigger = oldAuto ? oldAuto.definition.trigger : null
|
|
124
135
|
const newTrigger = newAuto ? newAuto.definition.trigger : null
|
|
125
136
|
const triggerChanged =
|
|
126
137
|
oldTrigger && newTrigger && oldTrigger.id !== newTrigger.id
|
|
127
|
-
function isWebhookTrigger(auto) {
|
|
138
|
+
function isWebhookTrigger(auto: any) {
|
|
128
139
|
return (
|
|
129
140
|
auto &&
|
|
130
141
|
auto.definition.trigger &&
|
|
@@ -160,7 +171,7 @@ exports.checkForWebhooks = async ({ oldAuto, newAuto }) => {
|
|
|
160
171
|
(!isWebhookTrigger(oldAuto) || triggerChanged) &&
|
|
161
172
|
isWebhookTrigger(newAuto)
|
|
162
173
|
) {
|
|
163
|
-
const ctx = {
|
|
174
|
+
const ctx: any = {
|
|
164
175
|
appId,
|
|
165
176
|
request: {
|
|
166
177
|
body: new webhooks.Webhook(
|
|
@@ -190,6 +201,6 @@ exports.checkForWebhooks = async ({ oldAuto, newAuto }) => {
|
|
|
190
201
|
* @param appId {string} the app that is being removed.
|
|
191
202
|
* @return {Promise<void>} clean is complete if this succeeds.
|
|
192
203
|
*/
|
|
193
|
-
|
|
194
|
-
await
|
|
204
|
+
export async function cleanupAutomations(appId: any) {
|
|
205
|
+
await disableAllCrons(appId)
|
|
195
206
|
}
|
package/src/constants/index.js
CHANGED
|
@@ -198,5 +198,11 @@ exports.WebhookType = {
|
|
|
198
198
|
AUTOMATION: "automation",
|
|
199
199
|
}
|
|
200
200
|
|
|
201
|
+
exports.AutomationErrors = {
|
|
202
|
+
INCORRECT_TYPE: "INCORRECT_TYPE",
|
|
203
|
+
MAX_ITERATIONS: "MAX_ITERATIONS_REACHED",
|
|
204
|
+
FAILURE_CONDITION: "FAILURE_CONDITION_MET",
|
|
205
|
+
}
|
|
206
|
+
|
|
201
207
|
// pass through the list from the auth/core lib
|
|
202
208
|
exports.ObjectStoreBuckets = ObjectStoreBuckets
|
package/src/environment.js
CHANGED
|
@@ -34,7 +34,7 @@ let inThread = false
|
|
|
34
34
|
|
|
35
35
|
module.exports = {
|
|
36
36
|
// important
|
|
37
|
-
PORT: process.env.PORT,
|
|
37
|
+
PORT: process.env.PORT || process.env.APP_PORT,
|
|
38
38
|
JWT_SECRET: process.env.JWT_SECRET,
|
|
39
39
|
COUCH_DB_URL: process.env.COUCH_DB_URL,
|
|
40
40
|
MINIO_URL: process.env.MINIO_URL,
|
|
@@ -44,8 +44,6 @@ module.exports = {
|
|
|
44
44
|
ENABLE_ANALYTICS: process.env.ENABLE_ANALYTICS,
|
|
45
45
|
MINIO_ACCESS_KEY: process.env.MINIO_ACCESS_KEY,
|
|
46
46
|
MINIO_SECRET_KEY: process.env.MINIO_SECRET_KEY,
|
|
47
|
-
USE_QUOTAS: process.env.USE_QUOTAS,
|
|
48
|
-
EXCLUDE_QUOTAS_TENANTS: process.env.EXCLUDE_QUOTAS_TENANTS,
|
|
49
47
|
REDIS_URL: process.env.REDIS_URL,
|
|
50
48
|
REDIS_PASSWORD: process.env.REDIS_PASSWORD,
|
|
51
49
|
INTERNAL_API_KEY: process.env.INTERNAL_API_KEY,
|
|
@@ -65,6 +63,7 @@ module.exports = {
|
|
|
65
63
|
LOG_LEVEL: process.env.LOG_LEVEL,
|
|
66
64
|
AUTOMATION_DIRECTORY: process.env.AUTOMATION_DIRECTORY,
|
|
67
65
|
AUTOMATION_BUCKET: process.env.AUTOMATION_BUCKET,
|
|
66
|
+
AUTOMATION_MAX_ITERATIONS: process.env.AUTOMATION_MAX_ITERATIONS,
|
|
68
67
|
SENDGRID_API_KEY: process.env.SENDGRID_API_KEY,
|
|
69
68
|
DYNAMO_ENDPOINT: process.env.DYNAMO_ENDPOINT,
|
|
70
69
|
POSTHOG_TOKEN: process.env.POSTHOG_TOKEN,
|
package/src/index.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bootstrap } from "global-agent"
|
|
1
2
|
const fixPath = require("fix-path")
|
|
2
3
|
const { checkDevelopmentEnvironment } = require("./utilities/fileSystem")
|
|
3
4
|
|
|
@@ -6,6 +7,8 @@ function runServer() {
|
|
|
6
7
|
// will print an error explaining what to do
|
|
7
8
|
checkDevelopmentEnvironment()
|
|
8
9
|
fixPath()
|
|
10
|
+
// this will setup http and https proxies form env variables
|
|
11
|
+
bootstrap()
|
|
9
12
|
require("./app")
|
|
10
13
|
}
|
|
11
14
|
|
|
@@ -11,6 +11,7 @@ const arangodb = require("./arangodb")
|
|
|
11
11
|
const rest = require("./rest")
|
|
12
12
|
const googlesheets = require("./googlesheets")
|
|
13
13
|
const firebase = require("./firebase")
|
|
14
|
+
const redis = require("./redis")
|
|
14
15
|
const { SourceNames } = require("../definitions/datasource")
|
|
15
16
|
const environment = require("../environment")
|
|
16
17
|
|
|
@@ -26,6 +27,8 @@ const DEFINITIONS = {
|
|
|
26
27
|
[SourceNames.MYSQL]: mysql.schema,
|
|
27
28
|
[SourceNames.ARANGODB]: arangodb.schema,
|
|
28
29
|
[SourceNames.REST]: rest.schema,
|
|
30
|
+
[SourceNames.FIREBASE]: firebase.schema,
|
|
31
|
+
[SourceNames.REDIS]: redis.schema,
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
const INTEGRATIONS = {
|
|
@@ -42,6 +45,7 @@ const INTEGRATIONS = {
|
|
|
42
45
|
[SourceNames.REST]: rest.integration,
|
|
43
46
|
[SourceNames.FIREBASE]: firebase.integration,
|
|
44
47
|
[SourceNames.GOOGLE_SHEETS]: googlesheets.integration,
|
|
48
|
+
[SourceNames.REDIS]: redis.integration,
|
|
45
49
|
}
|
|
46
50
|
|
|
47
51
|
// optionally add oracle integration if the oracle binary can be installed
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DatasourceFieldTypes,
|
|
3
|
+
Integration,
|
|
4
|
+
QueryTypes,
|
|
5
|
+
} from "../definitions/datasource"
|
|
6
|
+
import Redis from "ioredis"
|
|
7
|
+
|
|
8
|
+
module RedisModule {
|
|
9
|
+
interface RedisConfig {
|
|
10
|
+
host: string
|
|
11
|
+
port: number
|
|
12
|
+
username: string
|
|
13
|
+
password?: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const SCHEMA: Integration = {
|
|
17
|
+
docs: "https://redis.io/docs/",
|
|
18
|
+
description: "",
|
|
19
|
+
friendlyName: "Redis",
|
|
20
|
+
datasource: {
|
|
21
|
+
host: {
|
|
22
|
+
type: "string",
|
|
23
|
+
required: true,
|
|
24
|
+
default: "localhost",
|
|
25
|
+
},
|
|
26
|
+
port: {
|
|
27
|
+
type: "number",
|
|
28
|
+
required: true,
|
|
29
|
+
default: 6379,
|
|
30
|
+
},
|
|
31
|
+
username: {
|
|
32
|
+
type: "string",
|
|
33
|
+
required: false,
|
|
34
|
+
},
|
|
35
|
+
password: {
|
|
36
|
+
type: "password",
|
|
37
|
+
required: false,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
query: {
|
|
41
|
+
create: {
|
|
42
|
+
type: QueryTypes.FIELDS,
|
|
43
|
+
fields: {
|
|
44
|
+
key: {
|
|
45
|
+
type: DatasourceFieldTypes.STRING,
|
|
46
|
+
required: true,
|
|
47
|
+
},
|
|
48
|
+
value: {
|
|
49
|
+
type: DatasourceFieldTypes.STRING,
|
|
50
|
+
required: true,
|
|
51
|
+
},
|
|
52
|
+
ttl: {
|
|
53
|
+
type: DatasourceFieldTypes.NUMBER,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
read: {
|
|
58
|
+
readable: true,
|
|
59
|
+
type: QueryTypes.FIELDS,
|
|
60
|
+
fields: {
|
|
61
|
+
key: {
|
|
62
|
+
type: DatasourceFieldTypes.STRING,
|
|
63
|
+
required: true,
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
delete: {
|
|
68
|
+
type: QueryTypes.FIELDS,
|
|
69
|
+
fields: {
|
|
70
|
+
key: {
|
|
71
|
+
type: DatasourceFieldTypes.STRING,
|
|
72
|
+
required: true,
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
command: {
|
|
77
|
+
readable: true,
|
|
78
|
+
displayName: "Redis Command",
|
|
79
|
+
type: QueryTypes.JSON,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
class RedisIntegration {
|
|
85
|
+
private readonly config: RedisConfig
|
|
86
|
+
private client: any
|
|
87
|
+
|
|
88
|
+
constructor(config: RedisConfig) {
|
|
89
|
+
this.config = config
|
|
90
|
+
this.client = new Redis({
|
|
91
|
+
host: this.config.host,
|
|
92
|
+
port: this.config.port,
|
|
93
|
+
username: this.config.username,
|
|
94
|
+
password: this.config.password,
|
|
95
|
+
})
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async disconnect() {
|
|
99
|
+
this.client.disconnect()
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async redisContext(query: Function) {
|
|
103
|
+
try {
|
|
104
|
+
return await query()
|
|
105
|
+
} catch (err) {
|
|
106
|
+
throw new Error(`Redis error: ${err}`)
|
|
107
|
+
} finally {
|
|
108
|
+
this.disconnect()
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async create(query: { key: string; value: string; ttl: number }) {
|
|
113
|
+
return this.redisContext(async () => {
|
|
114
|
+
const response = await this.client.set(query.key, query.value)
|
|
115
|
+
if (query.ttl) {
|
|
116
|
+
await this.client.expire(query.key, query.ttl)
|
|
117
|
+
}
|
|
118
|
+
return response
|
|
119
|
+
})
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
async read(query: { key: string }) {
|
|
123
|
+
return this.redisContext(async () => {
|
|
124
|
+
const response = await this.client.get(query.key)
|
|
125
|
+
return response
|
|
126
|
+
})
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async delete(query: { key: string }) {
|
|
130
|
+
return this.redisContext(async () => {
|
|
131
|
+
const response = await this.client.del(query.key)
|
|
132
|
+
return response
|
|
133
|
+
})
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async command(query: { json: string }) {
|
|
137
|
+
return this.redisContext(async () => {
|
|
138
|
+
const commands = query.json.trim().split(" ")
|
|
139
|
+
const pipeline = this.client.pipeline([commands])
|
|
140
|
+
const result = await pipeline.exec()
|
|
141
|
+
return {
|
|
142
|
+
response: result[0][1],
|
|
143
|
+
}
|
|
144
|
+
})
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
module.exports = {
|
|
149
|
+
schema: SCHEMA,
|
|
150
|
+
integration: RedisIntegration,
|
|
151
|
+
}
|
|
152
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const Redis = require("ioredis-mock")
|
|
2
|
+
const RedisIntegration = require("../redis")
|
|
3
|
+
|
|
4
|
+
class TestConfiguration {
|
|
5
|
+
constructor(config = {}) {
|
|
6
|
+
this.integration = new RedisIntegration.integration(config)
|
|
7
|
+
this.redis = new Redis({
|
|
8
|
+
data: {
|
|
9
|
+
test: 'test',
|
|
10
|
+
result: "1"
|
|
11
|
+
},
|
|
12
|
+
})
|
|
13
|
+
this.integration.client = this.redis
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
describe("Redis Integration", () => {
|
|
18
|
+
let config
|
|
19
|
+
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
config = new TestConfiguration()
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
it("calls the create method with the correct params", async () => {
|
|
25
|
+
const body = {
|
|
26
|
+
key: "key",
|
|
27
|
+
value: "value"
|
|
28
|
+
}
|
|
29
|
+
const response = await config.integration.create(body)
|
|
30
|
+
expect(await config.redis.get("key")).toEqual("value")
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it("calls the read method with the correct params", async () => {
|
|
34
|
+
const body = {
|
|
35
|
+
key: "test"
|
|
36
|
+
}
|
|
37
|
+
const response = await config.integration.read(body)
|
|
38
|
+
expect(response).toEqual("test")
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it("calls the delete method with the correct params", async () => {
|
|
42
|
+
const body = {
|
|
43
|
+
key: "test"
|
|
44
|
+
}
|
|
45
|
+
await config.integration.delete(body)
|
|
46
|
+
expect(await config.redis.get(body.key)).toEqual(null)
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
it("calls the command method with the correct params", async () => {
|
|
50
|
+
const body = {
|
|
51
|
+
json: "KEYS *"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// ioredis-mock doesn't support pipelines
|
|
55
|
+
config.integration.client.pipeline = jest.fn(() => ({ exec: jest.fn(() => [[]]) }))
|
|
56
|
+
|
|
57
|
+
await config.integration.command(body)
|
|
58
|
+
expect(config.integration.client.pipeline).toHaveBeenCalledWith([["KEYS", "*"]])
|
|
59
|
+
})
|
|
60
|
+
})
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import {
|
|
2
2
|
getUserRoleHierarchy,
|
|
3
3
|
getRequiredResourceRole,
|
|
4
4
|
BUILTIN_ROLE_IDS,
|
|
5
|
-
}
|
|
5
|
+
} from "@budibase/backend-core/roles"
|
|
6
6
|
const {
|
|
7
7
|
PermissionTypes,
|
|
8
8
|
PermissionLevels,
|
|
@@ -13,7 +13,7 @@ const { isWebhookEndpoint } = require("./utils")
|
|
|
13
13
|
const { buildCsrfMiddleware } = require("@budibase/backend-core/auth")
|
|
14
14
|
const { getAppId } = require("@budibase/backend-core/context")
|
|
15
15
|
|
|
16
|
-
function hasResource(ctx) {
|
|
16
|
+
function hasResource(ctx: any) {
|
|
17
17
|
return ctx.resourceId != null
|
|
18
18
|
}
|
|
19
19
|
|
|
@@ -25,7 +25,12 @@ const csrf = buildCsrfMiddleware()
|
|
|
25
25
|
* - Builders can access all resources.
|
|
26
26
|
* - Otherwise the user must have the required role.
|
|
27
27
|
*/
|
|
28
|
-
const checkAuthorized = async (
|
|
28
|
+
const checkAuthorized = async (
|
|
29
|
+
ctx: any,
|
|
30
|
+
resourceRoles: any,
|
|
31
|
+
permType: any,
|
|
32
|
+
permLevel: any
|
|
33
|
+
) => {
|
|
29
34
|
// check if this is a builder api and the user is not a builder
|
|
30
35
|
const isBuilder = ctx.user && ctx.user.builder && ctx.user.builder.global
|
|
31
36
|
const isBuilderApi = permType === PermissionTypes.BUILDER
|
|
@@ -40,10 +45,10 @@ const checkAuthorized = async (ctx, resourceRoles, permType, permLevel) => {
|
|
|
40
45
|
}
|
|
41
46
|
|
|
42
47
|
const checkAuthorizedResource = async (
|
|
43
|
-
ctx,
|
|
44
|
-
resourceRoles,
|
|
45
|
-
permType,
|
|
46
|
-
permLevel
|
|
48
|
+
ctx: any,
|
|
49
|
+
resourceRoles: any,
|
|
50
|
+
permType: any,
|
|
51
|
+
permLevel: any
|
|
47
52
|
) => {
|
|
48
53
|
// get the user's roles
|
|
49
54
|
const roleId = ctx.roleId || BUILTIN_ROLE_IDS.PUBLIC
|
|
@@ -54,7 +59,9 @@ const checkAuthorizedResource = async (
|
|
|
54
59
|
// check if the user has the required role
|
|
55
60
|
if (resourceRoles.length > 0) {
|
|
56
61
|
// deny access if the user doesn't have the required resource role
|
|
57
|
-
const found = userRoles.find(
|
|
62
|
+
const found = userRoles.find(
|
|
63
|
+
(role: any) => resourceRoles.indexOf(role._id) !== -1
|
|
64
|
+
)
|
|
58
65
|
if (!found) {
|
|
59
66
|
ctx.throw(403, permError)
|
|
60
67
|
}
|
|
@@ -64,9 +71,8 @@ const checkAuthorizedResource = async (
|
|
|
64
71
|
}
|
|
65
72
|
}
|
|
66
73
|
|
|
67
|
-
|
|
68
|
-
(
|
|
69
|
-
async (ctx, next) => {
|
|
74
|
+
export = (permType: any, permLevel: any = null, opts = { schema: false }) =>
|
|
75
|
+
async (ctx: any, next: any) => {
|
|
70
76
|
// webhooks don't need authentication, each webhook unique
|
|
71
77
|
// also internal requests (between services) don't need authorized
|
|
72
78
|
if (isWebhookEndpoint(ctx) || ctx.internal) {
|
|
@@ -82,8 +88,8 @@ module.exports =
|
|
|
82
88
|
await builderMiddleware(ctx, permType)
|
|
83
89
|
|
|
84
90
|
// get the resource roles
|
|
85
|
-
let resourceRoles = []
|
|
86
|
-
|
|
91
|
+
let resourceRoles: any = []
|
|
92
|
+
let otherLevelRoles: any = []
|
|
87
93
|
const otherLevel =
|
|
88
94
|
permLevel === PermissionLevels.READ
|
|
89
95
|
? PermissionLevels.WRITE
|
|
@@ -4,7 +4,7 @@ const {
|
|
|
4
4
|
getCookie,
|
|
5
5
|
clearCookie,
|
|
6
6
|
} = require("@budibase/backend-core/utils")
|
|
7
|
-
const { Cookies } = require("@budibase/backend-core/constants")
|
|
7
|
+
const { Cookies, Headers } = require("@budibase/backend-core/constants")
|
|
8
8
|
const { getRole } = require("@budibase/backend-core/roles")
|
|
9
9
|
const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
|
|
10
10
|
const { generateUserMetadataID, isDevAppID } = require("../db/utils")
|
|
@@ -63,6 +63,21 @@ module.exports = async (ctx, next) => {
|
|
|
63
63
|
appId = requestAppId
|
|
64
64
|
// retrieving global user gets the right role
|
|
65
65
|
roleId = globalUser.roleId || roleId
|
|
66
|
+
|
|
67
|
+
// Allow builders to specify their role via a header
|
|
68
|
+
const isBuilder =
|
|
69
|
+
globalUser && globalUser.builder && globalUser.builder.global
|
|
70
|
+
const isDevApp = appId && isDevAppID(appId)
|
|
71
|
+
const roleHeader = ctx.request && ctx.request.headers[Headers.PREVIEW_ROLE]
|
|
72
|
+
if (isBuilder && isDevApp && roleHeader) {
|
|
73
|
+
// Ensure the role is valid by ensuring a definition exists
|
|
74
|
+
try {
|
|
75
|
+
await getRole(roleHeader)
|
|
76
|
+
roleId = roleHeader
|
|
77
|
+
} catch (error) {
|
|
78
|
+
// Swallow error and do nothing
|
|
79
|
+
}
|
|
80
|
+
}
|
|
66
81
|
}
|
|
67
82
|
|
|
68
83
|
// nothing more to do
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
mockAuthWithNoCookie()
|
|
2
2
|
mockWorker()
|
|
3
3
|
|
|
4
|
-
jest.mock("@budibase/backend-core/db", () =>
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
jest.mock("@budibase/backend-core/db", () => {
|
|
5
|
+
const coreDb = jest.requireActual("@budibase/backend-core/db")
|
|
6
|
+
coreDb.init()
|
|
7
|
+
return {
|
|
8
|
+
...coreDb,
|
|
9
|
+
dbExists: () => true,
|
|
10
|
+
}
|
|
11
|
+
})
|
|
8
12
|
|
|
9
13
|
function mockWorker() {
|
|
10
14
|
jest.mock("../../utilities/workerRequests", () => ({
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const { createUserBuildersView } = require("@budibase/backend-core/db")
|
|
2
|
+
import * as syncDevelopers from "./usageQuotas/syncDevelopers"
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Date:
|
|
6
|
+
* March 2022
|
|
7
|
+
*
|
|
8
|
+
* Description:
|
|
9
|
+
* Create the builder users view and sync the developer count
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export const run = async (db: any) => {
|
|
13
|
+
await createUserBuildersView(db)
|
|
14
|
+
await syncDevelopers.run()
|
|
15
|
+
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
const env = require("../../../environment")
|
|
2
1
|
const TestConfig = require("../../../tests/utilities/TestConfiguration")
|
|
3
2
|
|
|
4
3
|
const syncApps = jest.fn()
|
|
@@ -14,7 +13,6 @@ describe("run", () => {
|
|
|
14
13
|
|
|
15
14
|
beforeEach(async () => {
|
|
16
15
|
await config.init()
|
|
17
|
-
env._set("USE_QUOTAS", 1)
|
|
18
16
|
})
|
|
19
17
|
|
|
20
18
|
afterAll(config.end)
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getTenantId } from "@budibase/backend-core/tenancy"
|
|
2
2
|
import { getAllApps } from "@budibase/backend-core/db"
|
|
3
|
-
import {
|
|
3
|
+
import { quotas, QuotaUsageType, StaticQuotaName } from "@budibase/pro"
|
|
4
4
|
|
|
5
5
|
export const run = async () => {
|
|
6
|
-
const db = getGlobalDB()
|
|
7
6
|
// get app count
|
|
8
7
|
// @ts-ignore
|
|
9
8
|
const devApps = await getAllApps({ dev: true })
|
|
@@ -12,7 +11,5 @@ export const run = async () => {
|
|
|
12
11
|
// sync app count
|
|
13
12
|
const tenantId = getTenantId()
|
|
14
13
|
console.log(`[Tenant: ${tenantId}] Syncing app count: ${appCount}`)
|
|
15
|
-
|
|
16
|
-
usageDoc.usageQuota.apps = appCount
|
|
17
|
-
await db.put(usageDoc)
|
|
14
|
+
await quotas.setUsage(appCount, StaticQuotaName.APPS, QuotaUsageType.STATIC)
|
|
18
15
|
}
|