@budibase/server 1.0.123-alpha.0 → 1.0.123
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.68a7f4e3.css +6 -0
- package/builder/assets/index.8d4a5b33.js +1291 -0
- package/builder/assets/{vendor.5240f480.js → vendor.8e34a169.js} +1 -1
- package/builder/index.html +3 -3
- package/coverage/clover.xml +1763 -758
- package/coverage/coverage-final.json +43 -28
- package/coverage/lcov-report/api/controllers/analytics.js.html +3 -8
- package/coverage/lcov-report/api/controllers/apikeys.js.html +4 -9
- package/coverage/lcov-report/api/controllers/application.js.html +1436 -0
- package/coverage/lcov-report/api/controllers/auth.js.html +3 -8
- package/coverage/lcov-report/api/controllers/automation.js.html +3 -8
- package/coverage/lcov-report/api/controllers/backup.js.html +3 -8
- package/coverage/lcov-report/api/controllers/cloud.js.html +3 -8
- package/coverage/lcov-report/api/controllers/component.js.html +3 -8
- package/coverage/lcov-report/api/controllers/datasource.js.html +6 -11
- package/coverage/lcov-report/api/controllers/dev.js.html +3 -8
- package/coverage/lcov-report/api/controllers/index.html +26 -16
- package/coverage/lcov-report/api/controllers/integration.js.html +3 -8
- package/coverage/lcov-report/api/controllers/layout.js.html +3 -8
- package/coverage/lcov-report/api/controllers/metadata.js.html +3 -8
- package/coverage/lcov-report/api/controllers/migrations.js.html +3 -8
- package/coverage/lcov-report/api/controllers/permission.js.html +3 -8
- package/coverage/lcov-report/api/controllers/query/index.html +26 -16
- package/coverage/lcov-report/api/controllers/query/index.js.html +713 -0
- package/coverage/lcov-report/api/controllers/query/validation.js.html +3 -8
- package/coverage/lcov-report/api/controllers/role.js.html +5 -10
- package/coverage/lcov-report/api/controllers/routing.js.html +4 -9
- package/coverage/lcov-report/api/controllers/row/external.js.html +3 -8
- package/coverage/lcov-report/api/controllers/row/index.html +35 -25
- package/coverage/lcov-report/api/controllers/row/index.js.html +524 -0
- package/coverage/lcov-report/api/controllers/row/internal.js.html +24 -32
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +16 -21
- package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +19 -24
- package/coverage/lcov-report/api/controllers/row/utils.js.html +19 -33
- package/coverage/lcov-report/api/controllers/screen.js.html +4 -9
- package/coverage/lcov-report/api/controllers/script.js.html +3 -8
- package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +50 -55
- package/coverage/lcov-report/api/controllers/table/external.js.html +3 -8
- package/coverage/lcov-report/api/controllers/table/index.html +44 -19
- package/coverage/lcov-report/api/controllers/table/index.js.html +15 -20
- package/coverage/lcov-report/api/controllers/table/internal.js.html +620 -0
- package/coverage/lcov-report/api/controllers/table/utils.js.html +1331 -0
- package/coverage/lcov-report/api/controllers/templates.js.html +3 -8
- package/coverage/lcov-report/api/controllers/user.js.html +3 -8
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +3 -8
- package/coverage/lcov-report/api/controllers/view/index.html +3 -8
- package/coverage/lcov-report/api/controllers/view/index.js.html +5 -10
- package/coverage/lcov-report/api/controllers/view/utils.js.html +3 -8
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +3 -8
- package/coverage/lcov-report/api/controllers/webhook.js.html +5 -10
- package/coverage/lcov-report/api/index.html +13 -18
- package/coverage/lcov-report/api/index.js.html +8 -28
- package/coverage/lcov-report/api/routes/analytics.js.html +3 -8
- package/coverage/lcov-report/api/routes/apikeys.js.html +3 -8
- package/coverage/lcov-report/api/routes/application.js.html +179 -0
- package/coverage/lcov-report/api/routes/auth.js.html +3 -8
- package/coverage/lcov-report/api/routes/automation.js.html +3 -8
- package/coverage/lcov-report/api/routes/backup.js.html +3 -8
- package/coverage/lcov-report/api/routes/cloud.js.html +3 -8
- package/coverage/lcov-report/api/routes/component.js.html +3 -8
- package/coverage/lcov-report/api/routes/datasource.js.html +3 -8
- package/coverage/lcov-report/api/routes/deploy.js.html +3 -8
- package/coverage/lcov-report/api/routes/dev.js.html +4 -9
- package/coverage/lcov-report/api/routes/index.html +68 -13
- package/coverage/lcov-report/api/routes/index.js.html +266 -0
- package/coverage/lcov-report/api/routes/integration.js.html +3 -8
- package/coverage/lcov-report/api/routes/layout.js.html +3 -8
- package/coverage/lcov-report/api/routes/metadata.js.html +3 -8
- package/coverage/lcov-report/api/routes/migrations.js.html +3 -8
- package/coverage/lcov-report/api/routes/permission.js.html +3 -8
- package/coverage/lcov-report/api/routes/query.js.html +3 -8
- package/coverage/lcov-report/api/routes/role.js.html +3 -8
- package/coverage/lcov-report/api/routes/routing.js.html +3 -8
- package/coverage/lcov-report/api/routes/row.js.html +908 -0
- package/coverage/lcov-report/api/routes/screen.js.html +3 -8
- package/coverage/lcov-report/api/routes/script.js.html +3 -8
- package/coverage/lcov-report/{automations/steps/loop.js.html → api/routes/static.js.html} +80 -70
- package/coverage/lcov-report/api/routes/table.js.html +3 -8
- package/coverage/lcov-report/api/routes/templates.js.html +3 -8
- package/coverage/lcov-report/api/routes/user.js.html +3 -8
- package/coverage/lcov-report/api/routes/utils/index.html +3 -8
- package/coverage/lcov-report/api/routes/utils/validators.js.html +3 -8
- package/coverage/lcov-report/api/routes/view.js.html +3 -8
- package/coverage/lcov-report/api/routes/webhook.js.html +3 -8
- package/coverage/lcov-report/automations/actions.js.html +7 -21
- package/coverage/lcov-report/automations/automationUtils.js.html +23 -64
- package/coverage/lcov-report/automations/bullboard.js.html +3 -8
- package/coverage/lcov-report/automations/index.html +37 -27
- package/coverage/lcov-report/automations/index.js.html +3 -8
- package/coverage/lcov-report/automations/steps/bash.js.html +3 -8
- package/coverage/lcov-report/automations/steps/createRow.js.html +380 -0
- package/coverage/lcov-report/automations/steps/delay.js.html +3 -8
- package/coverage/lcov-report/automations/steps/deleteRow.js.html +347 -0
- package/coverage/lcov-report/automations/steps/discord.js.html +3 -8
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +3 -8
- package/coverage/lcov-report/automations/steps/executeScript.js.html +3 -8
- package/coverage/lcov-report/automations/steps/filter.js.html +3 -8
- package/coverage/lcov-report/automations/steps/index.html +41 -31
- package/coverage/lcov-report/automations/steps/integromat.js.html +3 -8
- package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +4 -9
- package/coverage/lcov-report/automations/steps/queryRows.js.html +4 -9
- package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +3 -8
- package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -8
- package/coverage/lcov-report/automations/steps/slack.js.html +3 -8
- package/coverage/lcov-report/automations/steps/updateRow.js.html +3 -8
- package/coverage/lcov-report/automations/steps/utils.js.html +9 -14
- package/coverage/lcov-report/automations/steps/zapier.js.html +3 -8
- package/coverage/lcov-report/automations/triggerInfo/app.js.html +3 -8
- package/coverage/lcov-report/automations/triggerInfo/cron.js.html +3 -8
- package/coverage/lcov-report/automations/triggerInfo/index.html +3 -8
- package/coverage/lcov-report/automations/triggerInfo/index.js.html +3 -8
- package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +3 -8
- package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +3 -8
- package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +3 -8
- package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +3 -8
- package/coverage/lcov-report/automations/triggers.js.html +11 -16
- package/coverage/lcov-report/automations/utils.js.html +665 -0
- package/coverage/lcov-report/block-navigation.js +0 -8
- package/coverage/lcov-report/constants/index.html +3 -8
- package/coverage/lcov-report/constants/index.js.html +42 -41
- package/coverage/lcov-report/constants/layouts.js.html +3 -8
- package/coverage/lcov-report/constants/screens.js.html +3 -8
- package/coverage/lcov-report/db/inMemoryView.js.html +3 -8
- package/coverage/lcov-report/db/index.html +3 -8
- package/coverage/lcov-report/db/index.js.html +4 -9
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +23 -25
- package/coverage/lcov-report/db/linkedRows/index.html +12 -17
- package/coverage/lcov-report/db/linkedRows/index.js.html +17 -22
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +7 -12
- package/coverage/lcov-report/db/newid.js.html +6 -11
- package/coverage/lcov-report/db/utils.js.html +79 -84
- package/coverage/lcov-report/events/AutomationEmitter.js.html +9 -14
- package/coverage/lcov-report/events/index.html +3 -8
- package/coverage/lcov-report/events/index.js.html +4 -9
- package/coverage/lcov-report/events/utils.js.html +13 -18
- package/coverage/lcov-report/index.html +132 -137
- package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +3 -8
- package/coverage/lcov-report/integrations/tests/index.html +3 -8
- package/coverage/lcov-report/middleware/appInfo.js.html +3 -8
- package/coverage/lcov-report/middleware/authorized.js.html +458 -0
- package/coverage/lcov-report/middleware/builder.js.html +3 -8
- package/coverage/lcov-report/middleware/currentapp.js.html +15 -65
- package/coverage/lcov-report/middleware/index.html +50 -25
- package/coverage/lcov-report/middleware/joi-validator.js.html +4 -9
- package/coverage/lcov-report/middleware/publicApi.js.html +3 -8
- package/coverage/lcov-report/middleware/resourceId.js.html +3 -8
- package/coverage/lcov-report/middleware/selfhost.js.html +4 -9
- package/coverage/lcov-report/middleware/usageQuota.js.html +572 -0
- package/coverage/lcov-report/middleware/utils.js.html +3 -8
- package/coverage/lcov-report/sorter.js +0 -26
- package/coverage/lcov-report/threads/automation.js.html +90 -581
- package/coverage/lcov-report/threads/index.html +40 -30
- package/coverage/lcov-report/threads/index.js.html +296 -0
- package/coverage/lcov-report/threads/query.js.html +4 -9
- package/coverage/lcov-report/threads/utils.js.html +9 -17
- package/coverage/lcov-report/utilities/bcrypt.js.html +3 -8
- package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -8
- package/coverage/lcov-report/utilities/centralPath.js.html +3 -8
- package/coverage/lcov-report/utilities/csvParser.js.html +5 -10
- package/coverage/lcov-report/utilities/global.js.html +4 -9
- package/coverage/lcov-report/utilities/index.html +3 -8
- package/coverage/lcov-report/utilities/index.js.html +6 -11
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +9 -32
- package/coverage/lcov-report/utilities/queue/index.html +7 -12
- package/coverage/lcov-report/utilities/routing/index.html +3 -8
- package/coverage/lcov-report/utilities/routing/index.js.html +3 -8
- package/coverage/lcov-report/utilities/rowProcessor/index.html +27 -32
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +71 -67
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +106 -27
- package/coverage/lcov-report/utilities/scriptRunner.js.html +3 -8
- package/coverage/lcov-report/utilities/security.js.html +4 -9
- package/coverage/lcov-report/utilities/statusCodes.js.html +3 -8
- package/coverage/lcov-report/utilities/usageQuota/index.html +34 -24
- package/coverage/lcov-report/utilities/usageQuota/index.js.html +359 -0
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +39 -44
- package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +3 -8
- package/coverage/lcov-report/utilities/users.js.html +3 -8
- package/coverage/lcov-report/utilities/workerRequests.js.html +4 -9
- package/coverage/lcov.info +3061 -1290
- package/dist/api/controllers/application.js +73 -145
- package/dist/api/controllers/deploy/index.js +36 -68
- package/dist/api/controllers/public/applications.js +9 -29
- package/dist/api/controllers/public/queries.js +7 -27
- package/dist/api/controllers/public/rows.js +12 -32
- 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 +44 -57
- package/dist/api/controllers/row/ExternalRequest.js +27 -27
- package/dist/api/controllers/row/index.js +60 -83
- package/dist/api/controllers/row/internal.js +1 -2
- package/dist/api/controllers/row/utils.js +1 -2
- package/dist/api/controllers/static/templates/BudibaseApp.svelte +0 -3
- package/dist/api/controllers/table/bulkFormula.js +1 -2
- package/dist/api/controllers/table/internal.js +55 -40
- package/dist/api/controllers/table/utils.js +229 -271
- package/dist/api/index.js +0 -5
- package/dist/api/routes/application.js +13 -39
- package/dist/api/routes/index.js +56 -61
- package/dist/api/routes/public/index.js +9 -6
- 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 +17 -43
- package/dist/api/routes/static.js +13 -40
- package/dist/api/routes/tests/utilities/TestFunctions.js +33 -75
- package/dist/app.js +4 -8
- package/dist/automations/actions.js +0 -3
- package/dist/automations/automationUtils.js +0 -10
- package/dist/automations/steps/createRow.js +12 -12
- package/dist/automations/steps/deleteRow.js +16 -13
- package/dist/automations/tests/utilities/index.js +11 -13
- package/dist/automations/utils.js +133 -187
- package/dist/constants/index.js +7 -5
- package/dist/db/linkedRows/LinkController.js +1 -0
- package/dist/definitions/datasource.js +0 -1
- package/dist/environment.js +3 -2
- package/dist/index.js +0 -4
- 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 +0 -4
- 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/rest.js +1 -1
- package/dist/middleware/authorized.js +51 -51
- package/dist/middleware/currentapp.js +1 -15
- package/dist/middleware/usageQuota.js +154 -0
- package/dist/migrations/functions/appUrls.js +1 -1
- package/dist/migrations/functions/quotas1.js +2 -6
- package/dist/migrations/functions/usageQuotas/index.js +4 -0
- package/dist/migrations/functions/usageQuotas/syncApps.js +7 -4
- package/dist/migrations/functions/usageQuotas/syncRows.js +8 -5
- package/dist/migrations/index.js +1 -17
- package/dist/package.json +4 -10
- package/dist/threads/automation.js +27 -149
- package/dist/threads/index.js +10 -36
- package/dist/threads/utils.js +0 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/utilities/queue/inMemoryQueue.js +1 -6
- package/dist/utilities/rowProcessor/index.js +11 -6
- package/dist/utilities/rowProcessor/utils.js +27 -1
- package/dist/utilities/usageQuota/index.js +86 -0
- package/nodemon.json +1 -1
- package/package.json +9 -15
- package/scripts/dev/manage.js +0 -2
- package/src/api/controllers/{application.ts → application.js} +51 -118
- package/src/api/controllers/deploy/{index.ts → index.js} +29 -53
- 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.ts → index.js} +48 -51
- package/src/api/controllers/row/ExternalRequest.ts +1 -1
- package/src/api/controllers/row/{index.ts → index.js} +17 -24
- package/src/api/controllers/row/internal.js +1 -2
- package/src/api/controllers/row/utils.js +1 -4
- package/src/api/controllers/static/templates/BudibaseApp.svelte +0 -3
- package/src/api/controllers/table/bulkFormula.js +1 -1
- package/src/api/controllers/table/{internal.ts → internal.js} +48 -27
- package/src/api/controllers/table/{utils.ts → utils.js} +69 -86
- package/src/api/index.js +0 -5
- package/src/api/routes/{application.ts → application.js} +14 -8
- package/src/api/routes/index.js +62 -0
- package/src/api/routes/public/index.ts +4 -1
- package/src/api/routes/{row.ts → row.js} +15 -7
- package/src/api/routes/{static.ts → static.js} +11 -11
- package/src/api/routes/tests/misc.spec.js +37 -39
- package/src/api/routes/tests/routing.spec.js +0 -1
- package/src/api/routes/tests/utilities/{TestFunctions.ts → TestFunctions.js} +33 -57
- package/src/app.ts +2 -1
- package/src/automations/actions.js +0 -3
- package/src/automations/automationUtils.js +0 -12
- package/src/automations/steps/{createRow.ts → createRow.js} +15 -9
- package/src/automations/steps/{deleteRow.ts → deleteRow.js} +16 -10
- package/src/automations/tests/automation.spec.js +1 -0
- package/src/automations/tests/{createRow.spec.ts → createRow.spec.js} +15 -4
- package/src/automations/tests/{deleteRow.spec.ts → deleteRow.spec.js} +5 -3
- package/src/automations/tests/utilities/index.js +10 -12
- package/src/automations/{utils.ts → utils.js} +28 -39
- package/src/constants/index.js +8 -6
- package/src/db/linkedRows/LinkController.js +1 -0
- package/src/definitions/datasource.ts +0 -1
- package/src/environment.js +3 -2
- package/src/index.ts +0 -3
- package/src/integrations/index.ts +0 -4
- package/src/middleware/{authorized.ts → authorized.js} +14 -20
- package/src/middleware/currentapp.js +1 -16
- package/src/middleware/tests/usageQuota.spec.js +120 -0
- package/src/middleware/usageQuota.js +164 -0
- package/src/migrations/functions/tests/quotas1.spec.js +2 -0
- package/src/migrations/functions/usageQuotas/index.ts +5 -0
- package/src/migrations/functions/usageQuotas/syncApps.ts +6 -3
- package/src/migrations/functions/usageQuotas/syncRows.ts +6 -3
- package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +41 -0
- package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +45 -0
- package/src/migrations/index.ts +1 -13
- package/src/threads/automation.js +34 -196
- package/src/threads/{index.ts → index.js} +14 -18
- package/src/threads/utils.js +0 -1
- package/src/utilities/queue/inMemoryQueue.js +1 -7
- package/src/utilities/rowProcessor/index.js +12 -9
- package/src/utilities/rowProcessor/utils.js +29 -1
- package/src/utilities/tests/usageQuota/usageQuota.spec.js +72 -0
- package/src/utilities/usageQuota/index.js +93 -0
- package/tsconfig.json +2 -2
- package/builder/assets/index.89795487.css +0 -6
- package/builder/assets/index.be9a1b80.js +0 -1299
- package/dist/automations/steps/loop.js +0 -51
- package/dist/integrations/redis.js +0 -158
- package/dist/migrations/functions/developerQuota.js +0 -49
- package/dist/migrations/functions/publishedAppsQuota.js +0 -47
- package/dist/migrations/functions/usageQuotas/syncDevelopers.js +0 -24
- package/dist/migrations/functions/usageQuotas/syncPublishedApps.js +0 -26
- package/dist/tsconfig.build.tsbuildinfo +0 -1
- package/src/api/routes/index.ts +0 -60
- package/src/automations/steps/loop.js +0 -50
- package/src/integrations/redis.ts +0 -152
- package/src/integrations/tests/redis.spec.js +0 -60
- package/src/migrations/functions/developerQuota.ts +0 -15
- package/src/migrations/functions/publishedAppsQuota.ts +0 -13
- package/src/migrations/functions/usageQuotas/syncDevelopers.ts +0 -19
- package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +0 -21
- package/src/migrations/functions/usageQuotas/tests/syncApps.spec.ts +0 -34
- package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +0 -40
- package/tsconfig.build.json +0 -10
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { getTenantId } from "@budibase/backend-core/tenancy"
|
|
1
|
+
import { getGlobalDB, getTenantId } from "@budibase/backend-core/tenancy"
|
|
2
2
|
import { getAllApps } from "@budibase/backend-core/db"
|
|
3
|
-
import {
|
|
3
|
+
import { getUsageQuotaDoc } from "../../../utilities/usageQuota"
|
|
4
4
|
|
|
5
5
|
export const run = async () => {
|
|
6
|
+
const db = getGlobalDB()
|
|
6
7
|
// get app count
|
|
7
8
|
// @ts-ignore
|
|
8
9
|
const devApps = await getAllApps({ dev: true })
|
|
@@ -11,5 +12,7 @@ export const run = async () => {
|
|
|
11
12
|
// sync app count
|
|
12
13
|
const tenantId = getTenantId()
|
|
13
14
|
console.log(`[Tenant: ${tenantId}] Syncing app count: ${appCount}`)
|
|
14
|
-
await
|
|
15
|
+
const usageDoc = await getUsageQuotaDoc(db)
|
|
16
|
+
usageDoc.usageQuota.apps = appCount
|
|
17
|
+
await db.put(usageDoc)
|
|
15
18
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { getTenantId } from "@budibase/backend-core/tenancy"
|
|
1
|
+
import { getGlobalDB, getTenantId } from "@budibase/backend-core/tenancy"
|
|
2
2
|
import { getAllApps } from "@budibase/backend-core/db"
|
|
3
|
+
import { getUsageQuotaDoc } from "../../../utilities/usageQuota"
|
|
3
4
|
import { getUniqueRows } from "../../../utilities/usageQuota/rows"
|
|
4
|
-
import { quotas, QuotaUsageType, StaticQuotaName } from "@budibase/pro"
|
|
5
5
|
|
|
6
6
|
export const run = async () => {
|
|
7
|
+
const db = getGlobalDB()
|
|
7
8
|
// get all rows in all apps
|
|
8
9
|
// @ts-ignore
|
|
9
10
|
const allApps = await getAllApps({ all: true })
|
|
@@ -15,5 +16,7 @@ export const run = async () => {
|
|
|
15
16
|
// sync row count
|
|
16
17
|
const tenantId = getTenantId()
|
|
17
18
|
console.log(`[Tenant: ${tenantId}] Syncing row count: ${rowCount}`)
|
|
18
|
-
await
|
|
19
|
+
const usageDoc = await getUsageQuotaDoc(db)
|
|
20
|
+
usageDoc.usageQuota.rows = rowCount
|
|
21
|
+
await db.put(usageDoc)
|
|
19
22
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const { doInTenant, getGlobalDB } = require("@budibase/backend-core/tenancy")
|
|
2
|
+
const TestConfig = require("../../../../tests/utilities/TestConfiguration")
|
|
3
|
+
const { TENANT_ID } = require("../../../../tests/utilities/structures")
|
|
4
|
+
const { getUsageQuotaDoc, update, Properties } = require("../../../../utilities/usageQuota")
|
|
5
|
+
const syncApps = require("../syncApps")
|
|
6
|
+
const env = require("../../../../environment")
|
|
7
|
+
|
|
8
|
+
describe("syncApps", () => {
|
|
9
|
+
|
|
10
|
+
let config = new TestConfig(false)
|
|
11
|
+
|
|
12
|
+
beforeEach(async () => {
|
|
13
|
+
await config.init()
|
|
14
|
+
env._set("USE_QUOTAS", 1)
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
afterAll(config.end)
|
|
18
|
+
|
|
19
|
+
it("runs successfully", async () => {
|
|
20
|
+
await doInTenant(TENANT_ID, async () => {
|
|
21
|
+
const db = getGlobalDB()
|
|
22
|
+
// create the usage quota doc and mock usages
|
|
23
|
+
await getUsageQuotaDoc(db)
|
|
24
|
+
await update(Properties.APPS, 3)
|
|
25
|
+
|
|
26
|
+
let usageDoc = await getUsageQuotaDoc(db)
|
|
27
|
+
expect(usageDoc.usageQuota.apps).toEqual(3)
|
|
28
|
+
|
|
29
|
+
// create an extra app to test the migration
|
|
30
|
+
await config.createApp("quota-test")
|
|
31
|
+
|
|
32
|
+
// migrate
|
|
33
|
+
await syncApps.run()
|
|
34
|
+
|
|
35
|
+
// assert the migration worked
|
|
36
|
+
usageDoc = await getUsageQuotaDoc(db)
|
|
37
|
+
expect(usageDoc.usageQuota.apps).toEqual(2)
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
})
|
|
41
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const { doInTenant, getGlobalDB } = require("@budibase/backend-core/tenancy")
|
|
2
|
+
const TestConfig = require("../../../../tests/utilities/TestConfiguration")
|
|
3
|
+
const { TENANT_ID } = require("../../../../tests/utilities/structures")
|
|
4
|
+
const { getUsageQuotaDoc, update, Properties } = require("../../../../utilities/usageQuota")
|
|
5
|
+
const syncRows = require("../syncRows")
|
|
6
|
+
const env = require("../../../../environment")
|
|
7
|
+
|
|
8
|
+
describe("syncRows", () => {
|
|
9
|
+
let config = new TestConfig(false)
|
|
10
|
+
|
|
11
|
+
beforeEach(async () => {
|
|
12
|
+
await config.init()
|
|
13
|
+
env._set("USE_QUOTAS", 1)
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
afterAll(config.end)
|
|
17
|
+
|
|
18
|
+
it("runs successfully", async () => {
|
|
19
|
+
await doInTenant(TENANT_ID, async () => {
|
|
20
|
+
const db = getGlobalDB()
|
|
21
|
+
await getUsageQuotaDoc(db)
|
|
22
|
+
await update(Properties.ROW, 300)
|
|
23
|
+
|
|
24
|
+
let usageDoc = await getUsageQuotaDoc(db)
|
|
25
|
+
expect(usageDoc.usageQuota.rows).toEqual(300)
|
|
26
|
+
|
|
27
|
+
// app 1
|
|
28
|
+
await config.createTable()
|
|
29
|
+
await config.createRow()
|
|
30
|
+
// app 2
|
|
31
|
+
await config.createApp("second-app")
|
|
32
|
+
await config.createTable()
|
|
33
|
+
await config.createRow()
|
|
34
|
+
await config.createRow()
|
|
35
|
+
|
|
36
|
+
// migrate
|
|
37
|
+
await syncRows.run()
|
|
38
|
+
|
|
39
|
+
// assert the migration worked
|
|
40
|
+
usageDoc = await getUsageQuotaDoc(db)
|
|
41
|
+
expect(usageDoc.usageQuota.rows).toEqual(3)
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
})
|
|
45
|
+
|
package/src/migrations/index.ts
CHANGED
|
@@ -7,8 +7,6 @@ const {
|
|
|
7
7
|
import * as userEmailViewCasing from "./functions/userEmailViewCasing"
|
|
8
8
|
import * as quota1 from "./functions/quotas1"
|
|
9
9
|
import * as appUrls from "./functions/appUrls"
|
|
10
|
-
import * as developerQuota from "./functions/developerQuota"
|
|
11
|
-
import * as publishedAppsQuota from "./functions/publishedAppsQuota"
|
|
12
10
|
|
|
13
11
|
export interface Migration {
|
|
14
12
|
type: string
|
|
@@ -28,7 +26,7 @@ export interface Migration {
|
|
|
28
26
|
*/
|
|
29
27
|
export interface MigrationOptions {
|
|
30
28
|
tenantIds?: string[]
|
|
31
|
-
|
|
29
|
+
forced?: {
|
|
32
30
|
[type: string]: string[]
|
|
33
31
|
}
|
|
34
32
|
}
|
|
@@ -50,16 +48,6 @@ export const MIGRATIONS: Migration[] = [
|
|
|
50
48
|
opts: { all: true },
|
|
51
49
|
fn: appUrls.run,
|
|
52
50
|
},
|
|
53
|
-
{
|
|
54
|
-
type: MIGRATION_TYPES.GLOBAL,
|
|
55
|
-
name: "developer_quota",
|
|
56
|
-
fn: developerQuota.run,
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
type: MIGRATION_TYPES.GLOBAL,
|
|
60
|
-
name: "published_apps_quota",
|
|
61
|
-
fn: publishedAppsQuota.run,
|
|
62
|
-
},
|
|
63
51
|
]
|
|
64
52
|
|
|
65
53
|
export const migrate = async (options?: MigrationOptions) => {
|
|
@@ -8,14 +8,10 @@ const { DocumentTypes } = require("../db/utils")
|
|
|
8
8
|
const { doInTenant } = require("@budibase/backend-core/tenancy")
|
|
9
9
|
const { definitions: triggerDefs } = require("../automations/triggerInfo")
|
|
10
10
|
const { doInAppContext, getAppDB } = require("@budibase/backend-core/context")
|
|
11
|
-
const { AutomationErrors } = require("../constants")
|
|
12
|
-
const FILTER_STEP_ID = actions.ACTION_DEFINITIONS.FILTER.stepId
|
|
13
|
-
const LOOP_STEP_ID = actions.ACTION_DEFINITIONS.LOOP.stepId
|
|
14
11
|
|
|
12
|
+
const FILTER_STEP_ID = actions.ACTION_DEFINITIONS.FILTER.stepId
|
|
15
13
|
const CRON_STEP_ID = triggerDefs.CRON.stepId
|
|
16
14
|
const STOPPED_STATUS = { success: false, status: "STOPPED" }
|
|
17
|
-
const { cloneDeep } = require("lodash/fp")
|
|
18
|
-
const env = require("../environment")
|
|
19
15
|
|
|
20
16
|
/**
|
|
21
17
|
* The automation orchestrator is a class responsible for executing automations.
|
|
@@ -78,208 +74,50 @@ class Orchestrator {
|
|
|
78
74
|
this.executionOutput.steps.push(stepObj)
|
|
79
75
|
}
|
|
80
76
|
|
|
81
|
-
updateContextAndOutput(loopStepNumber, step, output, result) {
|
|
82
|
-
this.executionOutput.steps.splice(loopStepNumber, 0, {
|
|
83
|
-
id: step.id,
|
|
84
|
-
stepId: step.stepId,
|
|
85
|
-
outputs: {
|
|
86
|
-
...output,
|
|
87
|
-
success: result.success,
|
|
88
|
-
status: result.status,
|
|
89
|
-
},
|
|
90
|
-
inputs: step.inputs,
|
|
91
|
-
})
|
|
92
|
-
this._context.steps.splice(loopStepNumber, 0, {
|
|
93
|
-
...output,
|
|
94
|
-
success: result.success,
|
|
95
|
-
status: result.status,
|
|
96
|
-
})
|
|
97
|
-
}
|
|
98
|
-
|
|
99
77
|
async execute() {
|
|
100
78
|
let automation = this._automation
|
|
101
79
|
const app = await this.getApp()
|
|
102
80
|
let stopped = false
|
|
103
|
-
let loopStep
|
|
104
|
-
|
|
105
|
-
let stepCount = 0
|
|
106
|
-
let loopStepNumber
|
|
107
|
-
let loopSteps = []
|
|
108
81
|
for (let step of automation.definition.steps) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
loopStep = step
|
|
113
|
-
loopStepNumber = stepCount
|
|
82
|
+
// execution stopped, record state for that
|
|
83
|
+
if (stopped) {
|
|
84
|
+
this.updateExecutionOutput(step.id, step.stepId, {}, STOPPED_STATUS)
|
|
114
85
|
continue
|
|
115
86
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
cloneDeep(this._context)
|
|
132
|
-
)
|
|
133
|
-
newInput = automationUtils.cleanInputValues(
|
|
134
|
-
newInput,
|
|
135
|
-
loopStep.schema.inputs
|
|
136
|
-
)
|
|
137
|
-
this._context.steps[loopStepNumber] = {
|
|
138
|
-
currentItem: newInput.binding[index],
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
let tempOutput = { items: loopSteps, iterations: iterationCount }
|
|
142
|
-
if (
|
|
143
|
-
(loopStep.inputs.option === "Array" &&
|
|
144
|
-
!Array.isArray(newInput.binding)) ||
|
|
145
|
-
(loopStep.inputs.option === "String" &&
|
|
146
|
-
typeof newInput.binding !== "string")
|
|
147
|
-
) {
|
|
148
|
-
this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
|
|
149
|
-
status: AutomationErrors.INCORRECT_TYPE,
|
|
150
|
-
success: false,
|
|
151
|
-
})
|
|
152
|
-
loopSteps = null
|
|
153
|
-
loopStep = null
|
|
154
|
-
break
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// The "Loop" binding in the front end is "fake", so replace it here so the context can understand it
|
|
158
|
-
// Pretty hacky because we need to account for the row object
|
|
159
|
-
for (let [key, value] of Object.entries(originalStepInput)) {
|
|
160
|
-
if (typeof value === "object") {
|
|
161
|
-
for (let [innerKey, innerValue] of Object.entries(
|
|
162
|
-
originalStepInput[key]
|
|
163
|
-
)) {
|
|
164
|
-
if (typeof innerValue === "string") {
|
|
165
|
-
originalStepInput[key][innerKey] =
|
|
166
|
-
automationUtils.substituteLoopStep(
|
|
167
|
-
innerValue,
|
|
168
|
-
`steps.${loopStepNumber}`
|
|
169
|
-
)
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
} else {
|
|
173
|
-
if (typeof value === "string") {
|
|
174
|
-
originalStepInput[key] = automationUtils.substituteLoopStep(
|
|
175
|
-
value,
|
|
176
|
-
`steps.${loopStepNumber}`
|
|
177
|
-
)
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
if (
|
|
183
|
-
index === parseInt(env.AUTOMATION_MAX_ITERATIONS) ||
|
|
184
|
-
index === loopStep.inputs.iterations
|
|
185
|
-
) {
|
|
186
|
-
this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
|
|
187
|
-
status: AutomationErrors.MAX_ITERATIONS,
|
|
188
|
-
success: true,
|
|
189
|
-
})
|
|
190
|
-
loopSteps = null
|
|
191
|
-
loopStep = null
|
|
192
|
-
break
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
if (
|
|
196
|
-
this._context.steps[loopStepNumber]?.currentItem ===
|
|
197
|
-
loopStep.inputs.failure
|
|
198
|
-
) {
|
|
199
|
-
this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
|
|
200
|
-
status: AutomationErrors.FAILURE_CONDITION,
|
|
201
|
-
success: false,
|
|
202
|
-
})
|
|
203
|
-
loopSteps = null
|
|
204
|
-
loopStep = null
|
|
205
|
-
break
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// execution stopped, record state for that
|
|
210
|
-
if (stopped) {
|
|
211
|
-
this.updateExecutionOutput(step.id, step.stepId, {}, STOPPED_STATUS)
|
|
212
|
-
continue
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// If it's a loop step, we need to manually add the bindings to the context
|
|
216
|
-
let stepFn = await this.getStepFunctionality(step.stepId)
|
|
217
|
-
let inputs = await processObject(originalStepInput, this._context)
|
|
218
|
-
inputs = automationUtils.cleanInputValues(inputs, step.schema.inputs)
|
|
219
|
-
try {
|
|
220
|
-
// appId is always passed
|
|
221
|
-
let tenantId = app.tenantId || DEFAULT_TENANT_ID
|
|
222
|
-
const outputs = await doInTenant(tenantId, () => {
|
|
223
|
-
return stepFn({
|
|
224
|
-
inputs: inputs,
|
|
225
|
-
appId: this._appId,
|
|
226
|
-
emitter: this._emitter,
|
|
227
|
-
context: this._context,
|
|
228
|
-
})
|
|
87
|
+
let stepFn = await this.getStepFunctionality(step.stepId)
|
|
88
|
+
step.inputs = await processObject(step.inputs, this._context)
|
|
89
|
+
step.inputs = automationUtils.cleanInputValues(
|
|
90
|
+
step.inputs,
|
|
91
|
+
step.schema.inputs
|
|
92
|
+
)
|
|
93
|
+
// appId is always passed
|
|
94
|
+
try {
|
|
95
|
+
let tenantId = app.tenantId || DEFAULT_TENANT_ID
|
|
96
|
+
const outputs = await doInTenant(tenantId, () => {
|
|
97
|
+
return stepFn({
|
|
98
|
+
inputs: step.inputs,
|
|
99
|
+
appId: this._appId,
|
|
100
|
+
emitter: this._emitter,
|
|
101
|
+
context: this._context,
|
|
229
102
|
})
|
|
230
|
-
this._context.steps[stepCount] = outputs
|
|
231
|
-
// if filter causes us to stop execution don't break the loop, set a var
|
|
232
|
-
// so that we can finish iterating through the steps and record that it stopped
|
|
233
|
-
if (step.stepId === FILTER_STEP_ID && !outputs.success) {
|
|
234
|
-
stopped = true
|
|
235
|
-
this.updateExecutionOutput(step.id, step.stepId, step.inputs, {
|
|
236
|
-
...outputs,
|
|
237
|
-
...STOPPED_STATUS,
|
|
238
|
-
})
|
|
239
|
-
continue
|
|
240
|
-
}
|
|
241
|
-
if (loopStep && loopSteps) {
|
|
242
|
-
loopSteps.push(outputs)
|
|
243
|
-
} else {
|
|
244
|
-
this.updateExecutionOutput(
|
|
245
|
-
step.id,
|
|
246
|
-
step.stepId,
|
|
247
|
-
step.inputs,
|
|
248
|
-
outputs
|
|
249
|
-
)
|
|
250
|
-
}
|
|
251
|
-
} catch (err) {
|
|
252
|
-
console.error(`Automation error - ${step.stepId} - ${err}`)
|
|
253
|
-
return err
|
|
254
|
-
}
|
|
255
|
-
if (loopStep) {
|
|
256
|
-
iterationCount++
|
|
257
|
-
if (index === iterations - 1) {
|
|
258
|
-
loopStep = null
|
|
259
|
-
this._context.steps.splice(loopStepNumber, 1)
|
|
260
|
-
break
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
if (loopSteps && loopSteps.length) {
|
|
266
|
-
let tempOutput = {
|
|
267
|
-
success: true,
|
|
268
|
-
items: loopSteps,
|
|
269
|
-
iterations: iterationCount,
|
|
270
|
-
}
|
|
271
|
-
this.executionOutput.steps.splice(loopStepNumber + 1, 0, {
|
|
272
|
-
id: step.id,
|
|
273
|
-
stepId: step.stepId,
|
|
274
|
-
outputs: tempOutput,
|
|
275
|
-
inputs: step.inputs,
|
|
276
103
|
})
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
104
|
+
this._context.steps.push(outputs)
|
|
105
|
+
// if filter causes us to stop execution don't break the loop, set a var
|
|
106
|
+
// so that we can finish iterating through the steps and record that it stopped
|
|
107
|
+
if (step.stepId === FILTER_STEP_ID && !outputs.success) {
|
|
108
|
+
stopped = true
|
|
109
|
+
this.updateExecutionOutput(step.id, step.stepId, step.inputs, {
|
|
110
|
+
...outputs,
|
|
111
|
+
...STOPPED_STATUS,
|
|
112
|
+
})
|
|
113
|
+
continue
|
|
114
|
+
}
|
|
115
|
+
this.updateExecutionOutput(step.id, step.stepId, step.inputs, outputs)
|
|
116
|
+
} catch (err) {
|
|
117
|
+
console.error(`Automation error - ${step.stepId} - ${err}`)
|
|
118
|
+
return err
|
|
280
119
|
}
|
|
281
120
|
}
|
|
282
|
-
|
|
283
121
|
return this.executionOutput
|
|
284
122
|
}
|
|
285
123
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
const workerFarm = require("worker-farm")
|
|
2
|
+
const env = require("../environment")
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
const ThreadType = {
|
|
5
5
|
QUERY: "query",
|
|
6
6
|
AUTOMATION: "automation",
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
function typeToFile(type
|
|
9
|
+
function typeToFile(type) {
|
|
10
10
|
let filename = null
|
|
11
11
|
switch (type) {
|
|
12
12
|
case ThreadType.QUERY:
|
|
@@ -21,14 +21,8 @@ function typeToFile(type: any) {
|
|
|
21
21
|
return require.resolve(filename)
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
type:
|
|
26
|
-
count: any
|
|
27
|
-
disableThreading: any
|
|
28
|
-
workers: any
|
|
29
|
-
timeoutMs: any
|
|
30
|
-
|
|
31
|
-
constructor(type: any, opts: any = { timeoutMs: null, count: 1 }) {
|
|
24
|
+
class Thread {
|
|
25
|
+
constructor(type, opts = { timeoutMs: null, count: 1 }) {
|
|
32
26
|
this.type = type
|
|
33
27
|
this.count = opts.count ? opts.count : 1
|
|
34
28
|
this.disableThreading =
|
|
@@ -37,7 +31,7 @@ export class Thread {
|
|
|
37
31
|
this.count === 0 ||
|
|
38
32
|
env.isInThread()
|
|
39
33
|
if (!this.disableThreading) {
|
|
40
|
-
const workerOpts
|
|
34
|
+
const workerOpts = {
|
|
41
35
|
autoStart: true,
|
|
42
36
|
maxConcurrentWorkers: this.count,
|
|
43
37
|
}
|
|
@@ -49,7 +43,8 @@ export class Thread {
|
|
|
49
43
|
}
|
|
50
44
|
}
|
|
51
45
|
|
|
52
|
-
run(data
|
|
46
|
+
run(data) {
|
|
47
|
+
const timeoutMs = this.timeoutMs
|
|
53
48
|
return new Promise((resolve, reject) => {
|
|
54
49
|
let fncToCall
|
|
55
50
|
// if in test then don't use threading
|
|
@@ -58,12 +53,10 @@ export class Thread {
|
|
|
58
53
|
} else {
|
|
59
54
|
fncToCall = this.workers
|
|
60
55
|
}
|
|
61
|
-
fncToCall(data, (err
|
|
56
|
+
fncToCall(data, (err, response) => {
|
|
62
57
|
if (err && err.type === "TimeoutError") {
|
|
63
58
|
reject(
|
|
64
|
-
new Error(
|
|
65
|
-
`Query response time exceeded ${this.timeoutMs}ms timeout.`
|
|
66
|
-
)
|
|
59
|
+
new Error(`Query response time exceeded ${timeoutMs}ms timeout.`)
|
|
67
60
|
)
|
|
68
61
|
} else if (err) {
|
|
69
62
|
reject(err)
|
|
@@ -74,3 +67,6 @@ export class Thread {
|
|
|
74
67
|
})
|
|
75
68
|
}
|
|
76
69
|
}
|
|
70
|
+
|
|
71
|
+
module.exports.Thread = Thread
|
|
72
|
+
module.exports.ThreadType = ThreadType
|
package/src/threads/utils.js
CHANGED
|
@@ -66,8 +66,7 @@ class InMemoryQueue {
|
|
|
66
66
|
* @param {object} msg A message to be transported over the queue, this should be
|
|
67
67
|
* a JSON message as this is required by Bull.
|
|
68
68
|
*/
|
|
69
|
-
|
|
70
|
-
add(msg, repeat) {
|
|
69
|
+
add(msg) {
|
|
71
70
|
if (typeof msg !== "object") {
|
|
72
71
|
throw "Queue only supports carrying JSON."
|
|
73
72
|
}
|
|
@@ -91,11 +90,6 @@ class InMemoryQueue {
|
|
|
91
90
|
return []
|
|
92
91
|
}
|
|
93
92
|
|
|
94
|
-
// eslint-disable-next-line no-unused-vars
|
|
95
|
-
removeJobs(pattern) {
|
|
96
|
-
// no-op
|
|
97
|
-
}
|
|
98
|
-
|
|
99
93
|
/**
|
|
100
94
|
* Implemented for tests
|
|
101
95
|
*/
|
|
@@ -2,7 +2,7 @@ const linkRows = require("../../db/linkedRows")
|
|
|
2
2
|
const { cloneDeep } = require("lodash/fp")
|
|
3
3
|
const { FieldTypes, AutoFieldSubTypes } = require("../../constants")
|
|
4
4
|
const { attachmentsRelativeURL } = require("../index")
|
|
5
|
-
const { processFormulas } = require("./utils")
|
|
5
|
+
const { processFormulas, fixAutoColumnSubType } = require("./utils")
|
|
6
6
|
const { deleteFiles } = require("../../utilities/fileSystem/utilities")
|
|
7
7
|
const { ObjectStoreBuckets } = require("../../constants")
|
|
8
8
|
const {
|
|
@@ -11,6 +11,7 @@ const {
|
|
|
11
11
|
dbExists,
|
|
12
12
|
} = require("@budibase/backend-core/db")
|
|
13
13
|
const { getAppId } = require("@budibase/backend-core/context")
|
|
14
|
+
const { InternalTables } = require("../../db/utils")
|
|
14
15
|
|
|
15
16
|
const BASE_AUTO_ID = 1
|
|
16
17
|
|
|
@@ -137,21 +138,23 @@ function processAutoColumn(
|
|
|
137
138
|
opts = { reprocessing: false, noAutoRelationships: false }
|
|
138
139
|
) {
|
|
139
140
|
let noUser = !user || !user.userId
|
|
141
|
+
let isUserTable = table._id === InternalTables.USER_METADATA
|
|
140
142
|
let now = new Date().toISOString()
|
|
141
143
|
// if a row doesn't have a revision then it doesn't exist yet
|
|
142
144
|
const creating = !row._rev
|
|
145
|
+
// check its not user table, or whether any of the processing options have been disabled
|
|
146
|
+
const shouldUpdateUserFields =
|
|
147
|
+
!isUserTable && !opts.reprocessing && !opts.noAutoRelationships && !noUser
|
|
143
148
|
for (let [key, schema] of Object.entries(table.schema)) {
|
|
144
149
|
if (!schema.autocolumn) {
|
|
145
150
|
continue
|
|
146
151
|
}
|
|
152
|
+
if (!schema.subtype) {
|
|
153
|
+
schema = fixAutoColumnSubType(schema)
|
|
154
|
+
}
|
|
147
155
|
switch (schema.subtype) {
|
|
148
156
|
case AutoFieldSubTypes.CREATED_BY:
|
|
149
|
-
if (
|
|
150
|
-
creating &&
|
|
151
|
-
!opts.reprocessing &&
|
|
152
|
-
!opts.noAutoRelationships &&
|
|
153
|
-
!noUser
|
|
154
|
-
) {
|
|
157
|
+
if (creating && shouldUpdateUserFields) {
|
|
155
158
|
row[key] = [user.userId]
|
|
156
159
|
}
|
|
157
160
|
break
|
|
@@ -161,7 +164,7 @@ function processAutoColumn(
|
|
|
161
164
|
}
|
|
162
165
|
break
|
|
163
166
|
case AutoFieldSubTypes.UPDATED_BY:
|
|
164
|
-
if (
|
|
167
|
+
if (shouldUpdateUserFields) {
|
|
165
168
|
row[key] = [user.userId]
|
|
166
169
|
}
|
|
167
170
|
break
|
|
@@ -179,7 +182,7 @@ function processAutoColumn(
|
|
|
179
182
|
return { table, row }
|
|
180
183
|
}
|
|
181
184
|
exports.processAutoColumn = processAutoColumn
|
|
182
|
-
|
|
185
|
+
exports.fixAutoColumnSubType = fixAutoColumnSubType
|
|
183
186
|
exports.processFormulas = processFormulas
|
|
184
187
|
|
|
185
188
|
/**
|
|
@@ -1,6 +1,34 @@
|
|
|
1
|
-
const {
|
|
1
|
+
const {
|
|
2
|
+
FieldTypes,
|
|
3
|
+
FormulaTypes,
|
|
4
|
+
AutoFieldDefaultNames,
|
|
5
|
+
AutoFieldSubTypes,
|
|
6
|
+
} = require("../../constants")
|
|
2
7
|
const { processStringSync } = require("@budibase/string-templates")
|
|
3
8
|
|
|
9
|
+
/**
|
|
10
|
+
* If the subtype has been lost for any reason this works out what
|
|
11
|
+
* subtype the auto column should be.
|
|
12
|
+
*/
|
|
13
|
+
exports.fixAutoColumnSubType = column => {
|
|
14
|
+
if (!column.autocolumn || !column.name || column.subtype) {
|
|
15
|
+
return column
|
|
16
|
+
}
|
|
17
|
+
// the columns which get auto generated
|
|
18
|
+
if (column.name.endsWith(AutoFieldDefaultNames.CREATED_BY)) {
|
|
19
|
+
column.subtype = AutoFieldSubTypes.CREATED_BY
|
|
20
|
+
} else if (column.name.endsWith(AutoFieldDefaultNames.UPDATED_BY)) {
|
|
21
|
+
column.subtype = AutoFieldSubTypes.UPDATED_BY
|
|
22
|
+
} else if (column.name.endsWith(AutoFieldDefaultNames.CREATED_AT)) {
|
|
23
|
+
column.subtype = AutoFieldSubTypes.CREATED_AT
|
|
24
|
+
} else if (column.name.endsWith(AutoFieldDefaultNames.UPDATED_AT)) {
|
|
25
|
+
column.subtype = AutoFieldSubTypes.UPDATED_AT
|
|
26
|
+
} else if (column.name.endsWith(AutoFieldDefaultNames.AUTO_ID)) {
|
|
27
|
+
column.subtype = AutoFieldSubTypes.AUTO_ID
|
|
28
|
+
}
|
|
29
|
+
return column
|
|
30
|
+
}
|
|
31
|
+
|
|
4
32
|
/**
|
|
5
33
|
* Looks through the rows provided and finds formulas - which it then processes.
|
|
6
34
|
*/
|