@budibase/server 1.0.27-alpha.10 → 1.0.27-alpha.14
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.0dce895b.css → index.39e01193.css} +1 -1
- package/builder/assets/{index.39751e34.js → index.411e6960.js} +239 -239
- package/builder/index.html +2 -2
- package/coverage/clover.xml +909 -890
- package/coverage/coverage-final.json +68 -68
- package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
- package/coverage/lcov-report/api/controllers/apikeys.js.html +3 -3
- package/coverage/lcov-report/api/controllers/application.js.html +71 -62
- package/coverage/lcov-report/api/controllers/auth.js.html +2 -2
- 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 +13 -4
- package/coverage/lcov-report/api/controllers/component.js.html +1 -1
- package/coverage/lcov-report/api/controllers/datasource.js.html +138 -36
- package/coverage/lcov-report/api/controllers/dev.js.html +3 -3
- package/coverage/lcov-report/api/controllers/hosting.js.html +3 -3
- package/coverage/lcov-report/api/controllers/index.html +19 -19
- package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
- 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/permission.js.html +3 -3
- package/coverage/lcov-report/api/controllers/query/index.html +21 -21
- package/coverage/lcov-report/api/controllers/query/index.js.html +51 -48
- package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/role.js.html +2 -2
- package/coverage/lcov-report/api/controllers/routing.js.html +2 -2
- package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/index.html +1 -1
- package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +2 -2
- package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/screen.js.html +2 -2
- package/coverage/lcov-report/api/controllers/script.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 +14 -5
- 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 +2 -2
- package/coverage/lcov-report/api/index.html +1 -1
- package/coverage/lcov-report/api/index.js.html +6 -6
- package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
- package/coverage/lcov-report/api/routes/apikeys.js.html +2 -2
- package/coverage/lcov-report/api/routes/application.js.html +2 -2
- package/coverage/lcov-report/api/routes/auth.js.html +1 -1
- package/coverage/lcov-report/api/routes/automation.js.html +2 -2
- package/coverage/lcov-report/api/routes/backup.js.html +2 -2
- package/coverage/lcov-report/api/routes/cloud.js.html +2 -2
- package/coverage/lcov-report/api/routes/component.js.html +2 -2
- package/coverage/lcov-report/api/routes/datasource.js.html +2 -2
- package/coverage/lcov-report/api/routes/deploy.js.html +2 -2
- package/coverage/lcov-report/api/routes/dev.js.html +2 -2
- package/coverage/lcov-report/api/routes/hosting.js.html +2 -2
- 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 +2 -2
- package/coverage/lcov-report/api/routes/layout.js.html +2 -2
- package/coverage/lcov-report/api/routes/metadata.js.html +2 -2
- package/coverage/lcov-report/api/routes/permission.js.html +12 -3
- package/coverage/lcov-report/api/routes/query.js.html +2 -2
- package/coverage/lcov-report/api/routes/role.js.html +2 -2
- package/coverage/lcov-report/api/routes/routing.js.html +2 -2
- package/coverage/lcov-report/api/routes/row.js.html +2 -2
- package/coverage/lcov-report/api/routes/screen.js.html +2 -2
- package/coverage/lcov-report/api/routes/script.js.html +2 -2
- package/coverage/lcov-report/api/routes/static.js.html +2 -2
- package/coverage/lcov-report/api/routes/table.js.html +2 -2
- package/coverage/lcov-report/api/routes/templates.js.html +2 -2
- package/coverage/lcov-report/api/routes/user.js.html +2 -2
- package/coverage/lcov-report/api/routes/view.js.html +2 -2
- package/coverage/lcov-report/api/routes/webhook.js.html +2 -2
- 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 +2 -2
- package/coverage/lcov-report/automations/index.html +1 -1
- 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 +2 -2
- 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 +6 -6
- package/coverage/lcov-report/constants/index.html +1 -1
- package/coverage/lcov-report/constants/index.js.html +4 -4
- package/coverage/lcov-report/constants/layouts.js.html +1 -1
- package/coverage/lcov-report/constants/screens.js.html +2 -2
- package/coverage/lcov-report/db/client.js.html +2 -2
- 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 +1 -1
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
- package/coverage/lcov-report/db/newid.js.html +2 -2
- package/coverage/lcov-report/db/utils.js.html +19 -19
- 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 +38 -38
- 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 +11 -11
- package/coverage/lcov-report/middleware/builder.js.html +10 -10
- package/coverage/lcov-report/middleware/currentapp.js.html +48 -36
- package/coverage/lcov-report/middleware/index.html +1 -1
- package/coverage/lcov-report/middleware/joi-validator.js.html +9 -9
- package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/usageQuota.js.html +2 -2
- package/coverage/lcov-report/middleware/utils.js.html +2 -2
- package/coverage/lcov-report/threads/automation.js.html +3 -3
- package/coverage/lcov-report/threads/index.html +28 -28
- package/coverage/lcov-report/threads/index.js.html +12 -12
- package/coverage/lcov-report/threads/query.js.html +253 -85
- package/coverage/lcov-report/threads/utils.js.html +31 -181
- package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
- package/coverage/lcov-report/utilities/budibaseDir.js.html +2 -2
- 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 +27 -18
- package/coverage/lcov-report/utilities/index.html +4 -4
- package/coverage/lcov-report/utilities/index.js.html +13 -13
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
- 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 +15 -3
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
- package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
- package/coverage/lcov-report/utilities/security.js.html +13 -4
- package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
- package/coverage/lcov-report/utilities/users.js.html +1 -1
- package/coverage/lcov-report/utilities/workerRequests.js.html +22 -22
- package/coverage/lcov.info +1566 -1528
- package/dist/api/controllers/apikeys.js +2 -2
- package/dist/api/controllers/application.js +4 -4
- package/dist/api/controllers/auth.js +1 -1
- package/dist/api/controllers/cloud.js +2 -2
- package/dist/api/controllers/datasource.js +29 -0
- package/dist/api/controllers/deploy/index.js +2 -2
- package/dist/api/controllers/dev.js +2 -2
- package/dist/api/controllers/hosting.js +2 -2
- package/dist/api/controllers/permission.js +2 -2
- package/dist/api/controllers/query/index.js +3 -2
- package/dist/api/controllers/role.js +1 -1
- package/dist/api/controllers/routing.js +1 -1
- package/dist/api/controllers/row/internalSearch.js +1 -1
- package/dist/api/controllers/screen.js +1 -1
- package/dist/api/controllers/user.js +3 -3
- package/dist/api/controllers/webhook.js +1 -1
- package/dist/api/index.js +1 -1
- package/dist/api/routes/apikeys.js +1 -1
- package/dist/api/routes/application.js +1 -1
- package/dist/api/routes/automation.js +1 -1
- package/dist/api/routes/backup.js +1 -1
- package/dist/api/routes/cloud.js +1 -1
- package/dist/api/routes/component.js +1 -1
- package/dist/api/routes/datasource.js +1 -1
- package/dist/api/routes/deploy.js +1 -1
- package/dist/api/routes/dev.js +1 -1
- package/dist/api/routes/hosting.js +1 -1
- package/dist/api/routes/integration.js +1 -1
- package/dist/api/routes/layout.js +1 -1
- package/dist/api/routes/metadata.js +1 -1
- package/dist/api/routes/permission.js +1 -1
- package/dist/api/routes/query.js +1 -1
- package/dist/api/routes/role.js +1 -1
- package/dist/api/routes/routing.js +1 -1
- package/dist/api/routes/row.js +1 -1
- package/dist/api/routes/screen.js +1 -1
- package/dist/api/routes/script.js +1 -1
- package/dist/api/routes/static.js +1 -1
- package/dist/api/routes/table.js +1 -1
- package/dist/api/routes/templates.js +1 -1
- package/dist/api/routes/tests/utilities/TestFunctions.js +1 -1
- package/dist/api/routes/user.js +1 -1
- package/dist/api/routes/view.js +1 -1
- package/dist/api/routes/webhook.js +1 -1
- package/dist/app.js +1 -1
- package/dist/automations/bullboard.js +1 -1
- package/dist/automations/steps/executeQuery.js +1 -1
- package/dist/automations/utils.js +1 -1
- package/dist/constants/index.js +3 -3
- package/dist/constants/screens.js +1 -1
- package/dist/db/client.js +1 -1
- package/dist/db/utils.js +1 -1
- package/dist/environment.js +1 -0
- package/dist/integrations/dynamodb.js +19 -0
- package/dist/integrations/rest.js +68 -19
- package/dist/integrations/s3.js +17 -8
- package/dist/middleware/authorized.js +2 -2
- package/dist/middleware/builder.js +2 -2
- package/dist/middleware/currentapp.js +6 -6
- package/dist/middleware/usageQuota.js +1 -1
- package/dist/package.json +4 -4
- package/dist/tests/utilities/TestConfiguration.js +48 -8
- package/dist/tests/utilities/structures.js +2 -2
- package/dist/threads/automation.js +2 -2
- package/dist/threads/query.js +52 -3
- package/dist/threads/utils.js +3 -47
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utilities/budibaseDir.js +1 -1
- package/dist/utilities/fileSystem/utilities.js +1 -1
- package/dist/utilities/global.js +5 -5
- package/dist/utilities/index.js +2 -2
- package/dist/utilities/redis.js +1 -1
- package/dist/utilities/rowProcessor/index.js +1 -1
- package/dist/utilities/security.js +2 -2
- package/dist/utilities/usageQuota.js +2 -2
- package/dist/utilities/workerRequests.js +3 -3
- package/package.json +5 -5
- package/scripts/replicateApp.js +1 -1
- package/src/api/controllers/apikeys.js +2 -2
- package/src/api/controllers/application.js +7 -4
- package/src/api/controllers/auth.js +1 -1
- package/src/api/controllers/cloud.js +5 -2
- package/src/api/controllers/datasource.js +34 -0
- package/src/api/controllers/deploy/index.js +2 -2
- package/src/api/controllers/dev.js +2 -2
- package/src/api/controllers/hosting.js +2 -2
- package/src/api/controllers/permission.js +2 -2
- package/src/api/controllers/query/index.js +3 -2
- package/src/api/controllers/role.js +1 -1
- package/src/api/controllers/routing.js +1 -1
- package/src/api/controllers/row/internalSearch.js +1 -1
- package/src/api/controllers/screen.js +1 -1
- package/src/api/controllers/user.js +6 -3
- package/src/api/controllers/webhook.js +1 -1
- package/src/api/index.js +1 -1
- package/src/api/routes/apikeys.js +1 -1
- package/src/api/routes/application.js +1 -1
- package/src/api/routes/automation.js +1 -1
- package/src/api/routes/backup.js +1 -1
- package/src/api/routes/cloud.js +1 -1
- package/src/api/routes/component.js +1 -1
- package/src/api/routes/datasource.js +1 -1
- package/src/api/routes/deploy.js +1 -1
- package/src/api/routes/dev.js +1 -1
- package/src/api/routes/hosting.js +1 -1
- package/src/api/routes/integration.js +1 -1
- package/src/api/routes/layout.js +1 -1
- package/src/api/routes/metadata.js +1 -1
- package/src/api/routes/permission.js +4 -1
- package/src/api/routes/query.js +1 -1
- package/src/api/routes/role.js +1 -1
- package/src/api/routes/routing.js +1 -1
- package/src/api/routes/row.js +1 -1
- package/src/api/routes/screen.js +1 -1
- package/src/api/routes/script.js +1 -1
- package/src/api/routes/static.js +1 -1
- package/src/api/routes/table.js +1 -1
- package/src/api/routes/templates.js +1 -1
- package/src/api/routes/tests/datasource.spec.js +45 -0
- package/src/api/routes/tests/permissions.spec.js +1 -1
- package/src/api/routes/tests/query.spec.js +25 -44
- package/src/api/routes/tests/role.spec.js +2 -2
- package/src/api/routes/tests/routing.spec.js +1 -1
- package/src/api/routes/tests/user.spec.js +1 -1
- package/src/api/routes/tests/utilities/TestFunctions.js +1 -1
- package/src/api/routes/user.js +1 -1
- package/src/api/routes/view.js +1 -1
- package/src/api/routes/webhook.js +1 -1
- package/src/app.ts +1 -1
- package/src/automations/bullboard.js +1 -1
- package/src/automations/steps/executeQuery.js +1 -1
- package/src/automations/utils.js +1 -1
- package/src/constants/index.js +3 -3
- package/src/constants/screens.js +1 -1
- package/src/db/client.js +1 -1
- package/src/db/utils.js +1 -1
- package/src/definitions/datasource.ts +15 -0
- package/src/environment.js +1 -0
- package/src/integrations/dynamodb.ts +18 -0
- package/src/integrations/rest.ts +78 -17
- package/src/integrations/s3.ts +18 -7
- package/src/integrations/tests/rest.spec.js +287 -24
- package/src/middleware/authorized.js +2 -2
- package/src/middleware/builder.js +2 -2
- package/src/middleware/currentapp.js +11 -7
- package/src/middleware/tests/authorized.spec.js +2 -2
- package/src/middleware/tests/currentapp.spec.js +35 -41
- package/src/middleware/tests/usageQuota.spec.js +1 -1
- package/src/middleware/usageQuota.js +1 -1
- package/src/tests/utilities/TestConfiguration.js +55 -8
- package/src/tests/utilities/structures.js +2 -2
- package/src/threads/automation.js +2 -2
- package/src/threads/query.js +59 -3
- package/src/threads/utils.js +3 -53
- package/src/utilities/budibaseDir.js +1 -1
- package/src/utilities/fileSystem/utilities.js +1 -1
- package/src/utilities/global.js +8 -5
- package/src/utilities/index.js +2 -2
- package/src/utilities/redis.js +1 -1
- package/src/utilities/rowProcessor/index.js +5 -1
- package/src/utilities/security.js +5 -2
- package/src/utilities/usageQuota.js +2 -2
- package/src/utilities/workerRequests.js +3 -3
package/src/api/routes/script.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const Router = require("@koa/router")
|
|
2
2
|
const controller = require("../controllers/script")
|
|
3
3
|
const authorized = require("../../middleware/authorized")
|
|
4
|
-
const { BUILDER } = require("@budibase/
|
|
4
|
+
const { BUILDER } = require("@budibase/backend-core/permissions")
|
|
5
5
|
|
|
6
6
|
const router = Router()
|
|
7
7
|
|
package/src/api/routes/static.js
CHANGED
|
@@ -6,7 +6,7 @@ const {
|
|
|
6
6
|
BUILDER,
|
|
7
7
|
PermissionTypes,
|
|
8
8
|
PermissionLevels,
|
|
9
|
-
} = require("@budibase/
|
|
9
|
+
} = require("@budibase/backend-core/permissions")
|
|
10
10
|
const env = require("../../environment")
|
|
11
11
|
const { paramResource } = require("../../middleware/resourceId")
|
|
12
12
|
|
package/src/api/routes/table.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const Router = require("@koa/router")
|
|
2
2
|
const controller = require("../controllers/templates")
|
|
3
3
|
const authorized = require("../../middleware/authorized")
|
|
4
|
-
const { BUILDER } = require("@budibase/
|
|
4
|
+
const { BUILDER } = require("@budibase/backend-core/permissions")
|
|
5
5
|
|
|
6
6
|
const router = Router()
|
|
7
7
|
|
|
@@ -4,6 +4,7 @@ let setup = require("./utilities")
|
|
|
4
4
|
let { basicDatasource } = setup.structures
|
|
5
5
|
let { checkBuilderEndpoint } = require("./utilities/TestFunctions")
|
|
6
6
|
const pg = require("pg")
|
|
7
|
+
const { checkCacheForDynamicVariable } = require("../../../threads/utils")
|
|
7
8
|
|
|
8
9
|
describe("/datasources", () => {
|
|
9
10
|
let request = setup.getRequest()
|
|
@@ -31,6 +32,50 @@ describe("/datasources", () => {
|
|
|
31
32
|
})
|
|
32
33
|
})
|
|
33
34
|
|
|
35
|
+
describe("update", () => {
|
|
36
|
+
it("should update an existing datasource", async () => {
|
|
37
|
+
datasource.name = "Updated Test"
|
|
38
|
+
const res = await request
|
|
39
|
+
.put(`/api/datasources/${datasource._id}`)
|
|
40
|
+
.send(datasource)
|
|
41
|
+
.set(config.defaultHeaders())
|
|
42
|
+
.expect('Content-Type', /json/)
|
|
43
|
+
.expect(200)
|
|
44
|
+
|
|
45
|
+
expect(res.body.datasource.name).toEqual("Updated Test")
|
|
46
|
+
expect(res.body.errors).toBeUndefined()
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
describe("dynamic variables", () => {
|
|
50
|
+
async function preview(datasource, fields) {
|
|
51
|
+
return config.previewQuery(request, config, datasource, fields)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
it("should invalidate changed or removed variables", async () => {
|
|
55
|
+
const { datasource, query } = await config.dynamicVariableDatasource()
|
|
56
|
+
// preview once to cache variables
|
|
57
|
+
await preview(datasource, { path: "www.test.com", queryString: "test={{ variable3 }}" })
|
|
58
|
+
// check variables in cache
|
|
59
|
+
let contents = await checkCacheForDynamicVariable(query._id, "variable3")
|
|
60
|
+
expect(contents.rows.length).toEqual(1)
|
|
61
|
+
|
|
62
|
+
// update the datasource to remove the variables
|
|
63
|
+
datasource.config.dynamicVariables = []
|
|
64
|
+
const res = await request
|
|
65
|
+
.put(`/api/datasources/${datasource._id}`)
|
|
66
|
+
.send(datasource)
|
|
67
|
+
.set(config.defaultHeaders())
|
|
68
|
+
.expect('Content-Type', /json/)
|
|
69
|
+
.expect(200)
|
|
70
|
+
expect(res.body.errors).toBeUndefined()
|
|
71
|
+
|
|
72
|
+
// check variables no longer in cache
|
|
73
|
+
contents = await checkCacheForDynamicVariable(query._id, "variable3")
|
|
74
|
+
expect(contents).toBe(null)
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
})
|
|
78
|
+
|
|
34
79
|
describe("fetch", () => {
|
|
35
80
|
it("returns all the datasources from the server", async () => {
|
|
36
81
|
const res = await request
|
|
@@ -4,7 +4,7 @@ jest.mock("node-fetch")
|
|
|
4
4
|
|
|
5
5
|
// Mock isProdAppID to we can later mock the implementation and pretend we are
|
|
6
6
|
// using prod app IDs
|
|
7
|
-
const authDb = require("@budibase/
|
|
7
|
+
const authDb = require("@budibase/backend-core/db")
|
|
8
8
|
const { isProdAppID } = authDb
|
|
9
9
|
const mockIsProdAppID = jest.fn(isProdAppID)
|
|
10
10
|
authDb.isProdAppID = mockIsProdAppID
|
|
@@ -229,52 +229,14 @@ describe("/queries", () => {
|
|
|
229
229
|
})
|
|
230
230
|
})
|
|
231
231
|
|
|
232
|
-
describe("
|
|
233
|
-
async function restDatasource(cfg) {
|
|
234
|
-
return await config.createDatasource({
|
|
235
|
-
datasource: {
|
|
236
|
-
...basicDatasource().datasource,
|
|
237
|
-
source: "REST",
|
|
238
|
-
config: cfg || {},
|
|
239
|
-
},
|
|
240
|
-
})
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
async function dynamicVariableDatasource() {
|
|
244
|
-
const datasource = await restDatasource()
|
|
245
|
-
const basedOnQuery = await config.createQuery({
|
|
246
|
-
...basicQuery(datasource._id),
|
|
247
|
-
fields: {
|
|
248
|
-
path: "www.google.com",
|
|
249
|
-
},
|
|
250
|
-
})
|
|
251
|
-
await config.updateDatasource({
|
|
252
|
-
...datasource,
|
|
253
|
-
config: {
|
|
254
|
-
dynamicVariables: [
|
|
255
|
-
{ queryId: basedOnQuery._id, name: "variable3", value: "{{ data.0.[value] }}" }
|
|
256
|
-
]
|
|
257
|
-
}
|
|
258
|
-
})
|
|
259
|
-
return { datasource, query: basedOnQuery }
|
|
260
|
-
}
|
|
232
|
+
describe("variables", () => {
|
|
261
233
|
|
|
262
234
|
async function preview(datasource, fields) {
|
|
263
|
-
return
|
|
264
|
-
.post(`/api/queries/preview`)
|
|
265
|
-
.send({
|
|
266
|
-
datasourceId: datasource._id,
|
|
267
|
-
parameters: {},
|
|
268
|
-
fields,
|
|
269
|
-
queryVerb: "read",
|
|
270
|
-
})
|
|
271
|
-
.set(config.defaultHeaders())
|
|
272
|
-
.expect("Content-Type", /json/)
|
|
273
|
-
.expect(200)
|
|
235
|
+
return config.previewQuery(request, config, datasource, fields)
|
|
274
236
|
}
|
|
275
237
|
|
|
276
238
|
it("should work with static variables", async () => {
|
|
277
|
-
const datasource = await restDatasource({
|
|
239
|
+
const datasource = await config.restDatasource({
|
|
278
240
|
staticVariables: {
|
|
279
241
|
variable: "google",
|
|
280
242
|
variable2: "1",
|
|
@@ -290,7 +252,7 @@ describe("/queries", () => {
|
|
|
290
252
|
})
|
|
291
253
|
|
|
292
254
|
it("should work with dynamic variables", async () => {
|
|
293
|
-
const { datasource } = await dynamicVariableDatasource()
|
|
255
|
+
const { datasource } = await config.dynamicVariableDatasource()
|
|
294
256
|
const res = await preview(datasource, {
|
|
295
257
|
path: "www.google.com",
|
|
296
258
|
queryString: "test={{ variable3 }}",
|
|
@@ -300,7 +262,7 @@ describe("/queries", () => {
|
|
|
300
262
|
})
|
|
301
263
|
|
|
302
264
|
it("check that it automatically retries on fail with cached dynamics", async () => {
|
|
303
|
-
const { datasource, query: base } = await dynamicVariableDatasource()
|
|
265
|
+
const { datasource, query: base } = await config.dynamicVariableDatasource()
|
|
304
266
|
// preview once to cache
|
|
305
267
|
await preview(datasource, { path: "www.google.com", queryString: "test={{ variable3 }}" })
|
|
306
268
|
// check its in cache
|
|
@@ -313,5 +275,24 @@ describe("/queries", () => {
|
|
|
313
275
|
expect(res.body.schemaFields).toEqual(["fails", "url", "opts"])
|
|
314
276
|
expect(res.body.rows[0].fails).toEqual(1)
|
|
315
277
|
})
|
|
278
|
+
|
|
279
|
+
it("deletes variables when linked query is deleted", async () => {
|
|
280
|
+
const { datasource, query: base } = await config.dynamicVariableDatasource()
|
|
281
|
+
// preview once to cache
|
|
282
|
+
await preview(datasource, { path: "www.google.com", queryString: "test={{ variable3 }}" })
|
|
283
|
+
// check its in cache
|
|
284
|
+
let contents = await checkCacheForDynamicVariable(base._id, "variable3")
|
|
285
|
+
expect(contents.rows.length).toEqual(1)
|
|
286
|
+
|
|
287
|
+
// delete the query
|
|
288
|
+
await request
|
|
289
|
+
.delete(`/api/queries/${base._id}/${base._rev}`)
|
|
290
|
+
.set(config.defaultHeaders())
|
|
291
|
+
.expect(200)
|
|
292
|
+
|
|
293
|
+
// check variables no longer in cache
|
|
294
|
+
contents = await checkCacheForDynamicVariable(base._id, "variable3")
|
|
295
|
+
expect(contents).toBe(null)
|
|
296
|
+
})
|
|
316
297
|
})
|
|
317
298
|
})
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const { BUILTIN_ROLE_IDS } = require("@budibase/
|
|
1
|
+
const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
|
|
2
2
|
const {
|
|
3
3
|
BUILTIN_PERMISSION_IDS,
|
|
4
|
-
} = require("@budibase/
|
|
4
|
+
} = require("@budibase/backend-core/permissions")
|
|
5
5
|
const setup = require("./utilities")
|
|
6
6
|
const { basicRole } = setup.structures
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const setup = require("./utilities")
|
|
2
2
|
const { basicScreen } = setup.structures
|
|
3
3
|
const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
|
|
4
|
-
const { BUILTIN_ROLE_IDS } = require("@budibase/
|
|
4
|
+
const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
|
|
5
5
|
|
|
6
6
|
const route = "/test"
|
|
7
7
|
|
|
@@ -2,7 +2,7 @@ const rowController = require("../../../controllers/row")
|
|
|
2
2
|
const appController = require("../../../controllers/application")
|
|
3
3
|
const CouchDB = require("../../../../db")
|
|
4
4
|
const { AppStatus } = require("../../../../db/utils")
|
|
5
|
-
const { BUILTIN_ROLE_IDS } = require("@budibase/
|
|
5
|
+
const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
|
|
6
6
|
const { TENANT_ID } = require("../../../../tests/utilities/structures")
|
|
7
7
|
|
|
8
8
|
function Request(appId, params) {
|
package/src/api/routes/user.js
CHANGED
package/src/api/routes/view.js
CHANGED
|
@@ -2,7 +2,7 @@ const Router = require("@koa/router")
|
|
|
2
2
|
const controller = require("../controllers/webhook")
|
|
3
3
|
const authorized = require("../../middleware/authorized")
|
|
4
4
|
const joiValidator = require("../../middleware/joi-validator")
|
|
5
|
-
const { BUILDER } = require("@budibase/
|
|
5
|
+
const { BUILDER } = require("@budibase/backend-core/permissions")
|
|
6
6
|
const Joi = require("joi")
|
|
7
7
|
|
|
8
8
|
const router = Router()
|
package/src/app.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { ExtendableContext } from "koa"
|
|
|
3
3
|
|
|
4
4
|
const env = require("./environment")
|
|
5
5
|
const CouchDB = require("./db")
|
|
6
|
-
require("@budibase/
|
|
6
|
+
require("@budibase/backend-core").init(CouchDB)
|
|
7
7
|
const Koa = require("koa")
|
|
8
8
|
const destroyable = require("server-destroy")
|
|
9
9
|
const koaBody = require("koa-body")
|
|
@@ -6,7 +6,7 @@ const Queue = env.isTest()
|
|
|
6
6
|
? require("../utilities/queue/inMemoryQueue")
|
|
7
7
|
: require("bull")
|
|
8
8
|
const { JobQueues } = require("../constants")
|
|
9
|
-
const { utils } = require("@budibase/
|
|
9
|
+
const { utils } = require("@budibase/backend-core/redis")
|
|
10
10
|
const { opts, redisProtocolUrl } = utils.getRedisOptions()
|
|
11
11
|
|
|
12
12
|
const CLEANUP_PERIOD_MS = 60 * 1000
|
package/src/automations/utils.js
CHANGED
|
@@ -6,7 +6,7 @@ const { queue } = require("./bullboard")
|
|
|
6
6
|
const newid = require("../db/newid")
|
|
7
7
|
const { updateEntityMetadata } = require("../utilities")
|
|
8
8
|
const { MetadataTypes } = require("../constants")
|
|
9
|
-
const { getDeployedAppID } = require("@budibase/
|
|
9
|
+
const { getDeployedAppID } = require("@budibase/backend-core/db")
|
|
10
10
|
const { cloneDeep } = require("lodash/fp")
|
|
11
11
|
|
|
12
12
|
const WH_STEP_ID = definitions.WEBHOOK.stepId
|
package/src/constants/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const { BUILTIN_ROLE_IDS } = require("@budibase/
|
|
2
|
-
const { UserStatus } = require("@budibase/
|
|
3
|
-
const { ObjectStoreBuckets } = require("@budibase/
|
|
1
|
+
const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
|
|
2
|
+
const { UserStatus } = require("@budibase/backend-core/constants")
|
|
3
|
+
const { ObjectStoreBuckets } = require("@budibase/backend-core/objectStore")
|
|
4
4
|
|
|
5
5
|
exports.JobQueues = {
|
|
6
6
|
AUTOMATIONS: "automationQueue",
|
package/src/constants/screens.js
CHANGED
package/src/db/client.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const PouchDB = require("pouchdb")
|
|
2
|
-
const { getCouchUrl } = require("@budibase/
|
|
2
|
+
const { getCouchUrl } = require("@budibase/backend-core/db")
|
|
3
3
|
const replicationStream = require("pouchdb-replication-stream")
|
|
4
4
|
const allDbs = require("pouchdb-all-dbs")
|
|
5
5
|
const find = require("pouchdb-find")
|
package/src/db/utils.js
CHANGED
|
@@ -232,6 +232,8 @@ export interface RestQueryFields {
|
|
|
232
232
|
json: object
|
|
233
233
|
method: string
|
|
234
234
|
authConfigId: string
|
|
235
|
+
pagination: PaginationConfig | null
|
|
236
|
+
paginationValues: PaginationValues | null
|
|
235
237
|
}
|
|
236
238
|
|
|
237
239
|
export interface RestConfig {
|
|
@@ -252,6 +254,19 @@ export interface RestConfig {
|
|
|
252
254
|
]
|
|
253
255
|
}
|
|
254
256
|
|
|
257
|
+
export interface PaginationConfig {
|
|
258
|
+
type: string
|
|
259
|
+
location: string
|
|
260
|
+
pageParam: string
|
|
261
|
+
sizeParam: string | null
|
|
262
|
+
responseParam: string | null
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export interface PaginationValues {
|
|
266
|
+
page: string | number | null
|
|
267
|
+
limit: number | null
|
|
268
|
+
}
|
|
269
|
+
|
|
255
270
|
export interface Query {
|
|
256
271
|
_id?: string
|
|
257
272
|
datasourceId: string
|
package/src/environment.js
CHANGED
|
@@ -65,6 +65,7 @@ module.exports = {
|
|
|
65
65
|
DEPLOYMENT_CREDENTIALS_URL: process.env.DEPLOYMENT_CREDENTIALS_URL,
|
|
66
66
|
ALLOW_DEV_AUTOMATIONS: process.env.ALLOW_DEV_AUTOMATIONS,
|
|
67
67
|
DISABLE_THREADING: process.env.DISABLE_THREADING,
|
|
68
|
+
QUERY_THREAD_TIMEOUT: process.env.QUERY_THREAD_TIMEOUT,
|
|
68
69
|
_set(key, value) {
|
|
69
70
|
process.env[key] = value
|
|
70
71
|
module.exports[key] = value
|
|
@@ -80,6 +80,17 @@ module DynamoModule {
|
|
|
80
80
|
},
|
|
81
81
|
},
|
|
82
82
|
},
|
|
83
|
+
describe: {
|
|
84
|
+
type: QueryTypes.FIELDS,
|
|
85
|
+
customisable: true,
|
|
86
|
+
readable: true,
|
|
87
|
+
fields: {
|
|
88
|
+
table: {
|
|
89
|
+
type: DatasourceFieldTypes.STRING,
|
|
90
|
+
required: true,
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
83
94
|
get: {
|
|
84
95
|
type: QueryTypes.FIELDS,
|
|
85
96
|
customisable: true,
|
|
@@ -180,6 +191,13 @@ module DynamoModule {
|
|
|
180
191
|
return response
|
|
181
192
|
}
|
|
182
193
|
|
|
194
|
+
async describe(query: { table: string }) {
|
|
195
|
+
const params = {
|
|
196
|
+
TableName: query.table,
|
|
197
|
+
}
|
|
198
|
+
return new AWS.DynamoDB().describeTable(params).promise()
|
|
199
|
+
}
|
|
200
|
+
|
|
183
201
|
async get(query: { table: string; json: object }) {
|
|
184
202
|
const params = {
|
|
185
203
|
TableName: query.table,
|
package/src/integrations/rest.ts
CHANGED
|
@@ -4,9 +4,11 @@ import {
|
|
|
4
4
|
QueryTypes,
|
|
5
5
|
RestConfig,
|
|
6
6
|
RestQueryFields as RestQuery,
|
|
7
|
+
PaginationConfig,
|
|
7
8
|
AuthType,
|
|
8
9
|
BasicAuthConfig,
|
|
9
10
|
BearerAuthConfig,
|
|
11
|
+
PaginationValues,
|
|
10
12
|
} from "../definitions/datasource"
|
|
11
13
|
import { IntegrationBase } from "./base/IntegrationBase"
|
|
12
14
|
|
|
@@ -40,6 +42,9 @@ const coreFields = {
|
|
|
40
42
|
type: DatasourceFieldTypes.STRING,
|
|
41
43
|
enum: Object.values(BodyTypes),
|
|
42
44
|
},
|
|
45
|
+
pagination: {
|
|
46
|
+
type: DatasourceFieldTypes.OBJECT
|
|
47
|
+
}
|
|
43
48
|
}
|
|
44
49
|
|
|
45
50
|
module RestModule {
|
|
@@ -115,7 +120,7 @@ module RestModule {
|
|
|
115
120
|
this.config = config
|
|
116
121
|
}
|
|
117
122
|
|
|
118
|
-
async parseResponse(response: any) {
|
|
123
|
+
async parseResponse(response: any, pagination: PaginationConfig | null) {
|
|
119
124
|
let data, raw, headers
|
|
120
125
|
const contentType = response.headers.get("content-type") || ""
|
|
121
126
|
try {
|
|
@@ -154,6 +159,13 @@ module RestModule {
|
|
|
154
159
|
for (let [key, value] of Object.entries(headers)) {
|
|
155
160
|
headers[key] = Array.isArray(value) ? value[0] : value
|
|
156
161
|
}
|
|
162
|
+
|
|
163
|
+
// Check if a pagination cursor exists in the response
|
|
164
|
+
let nextCursor = null
|
|
165
|
+
if (pagination?.responseParam) {
|
|
166
|
+
nextCursor = data?.[pagination.responseParam]
|
|
167
|
+
}
|
|
168
|
+
|
|
157
169
|
return {
|
|
158
170
|
data,
|
|
159
171
|
info: {
|
|
@@ -165,10 +177,35 @@ module RestModule {
|
|
|
165
177
|
raw,
|
|
166
178
|
headers,
|
|
167
179
|
},
|
|
180
|
+
pagination: {
|
|
181
|
+
cursor: nextCursor
|
|
182
|
+
}
|
|
168
183
|
}
|
|
169
184
|
}
|
|
170
185
|
|
|
171
|
-
getUrl(path: string, queryString: string): string {
|
|
186
|
+
getUrl(path: string, queryString: string, pagination: PaginationConfig | null, paginationValues: PaginationValues | null): string {
|
|
187
|
+
// Add pagination params to query string if required
|
|
188
|
+
if (pagination?.location === "query" && paginationValues) {
|
|
189
|
+
const { pageParam, sizeParam } = pagination
|
|
190
|
+
const params = new URLSearchParams()
|
|
191
|
+
|
|
192
|
+
// Append page number or cursor param if configured
|
|
193
|
+
if (pageParam && paginationValues.page != null) {
|
|
194
|
+
params.append(pageParam, paginationValues.page)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Append page size param if configured
|
|
198
|
+
if (sizeParam && paginationValues.limit != null) {
|
|
199
|
+
params.append(sizeParam, paginationValues.limit)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Prepend query string with pagination params
|
|
203
|
+
let paginationString = params.toString()
|
|
204
|
+
if (paginationString) {
|
|
205
|
+
queryString = `${paginationString}&${queryString}`
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
172
209
|
const main = `${path}?${queryString}`
|
|
173
210
|
let complete = main
|
|
174
211
|
if (this.config.url && !main.startsWith("http")) {
|
|
@@ -180,20 +217,36 @@ module RestModule {
|
|
|
180
217
|
return complete
|
|
181
218
|
}
|
|
182
219
|
|
|
183
|
-
addBody(bodyType: string, body: string | any, input: any) {
|
|
184
|
-
|
|
220
|
+
addBody(bodyType: string, body: string | any, input: any, pagination: PaginationConfig | null, paginationValues: PaginationValues | null) {
|
|
221
|
+
if (!input.headers) {
|
|
222
|
+
input.headers = {}
|
|
223
|
+
}
|
|
224
|
+
if (bodyType === BodyTypes.NONE) {
|
|
225
|
+
return input
|
|
226
|
+
}
|
|
227
|
+
let error, object: any = {}, string = ""
|
|
185
228
|
try {
|
|
186
|
-
|
|
187
|
-
|
|
229
|
+
if (body) {
|
|
230
|
+
string = typeof body !== "string" ? JSON.stringify(body) : body
|
|
231
|
+
object = typeof body === "object" ? body : JSON.parse(body)
|
|
232
|
+
}
|
|
188
233
|
} catch (err) {
|
|
189
234
|
error = err
|
|
190
235
|
}
|
|
191
|
-
|
|
192
|
-
|
|
236
|
+
|
|
237
|
+
// Util to add pagination values to a certain body type
|
|
238
|
+
const addPaginationToBody = (insertFn: Function) => {
|
|
239
|
+
if (pagination?.location === "body") {
|
|
240
|
+
if (pagination?.pageParam && paginationValues?.page != null) {
|
|
241
|
+
insertFn(pagination.pageParam, paginationValues.page)
|
|
242
|
+
}
|
|
243
|
+
if (pagination?.sizeParam && paginationValues?.limit != null) {
|
|
244
|
+
insertFn(pagination.sizeParam, paginationValues.limit)
|
|
245
|
+
}
|
|
246
|
+
}
|
|
193
247
|
}
|
|
248
|
+
|
|
194
249
|
switch (bodyType) {
|
|
195
|
-
case BodyTypes.NONE:
|
|
196
|
-
break
|
|
197
250
|
case BodyTypes.TEXT:
|
|
198
251
|
// content type defaults to plaintext
|
|
199
252
|
input.body = string
|
|
@@ -203,6 +256,9 @@ module RestModule {
|
|
|
203
256
|
for (let [key, value] of Object.entries(object)) {
|
|
204
257
|
params.append(key, value)
|
|
205
258
|
}
|
|
259
|
+
addPaginationToBody((key: string, value: any) => {
|
|
260
|
+
params.append(key, value)
|
|
261
|
+
})
|
|
206
262
|
input.body = params
|
|
207
263
|
break
|
|
208
264
|
case BodyTypes.FORM_DATA:
|
|
@@ -210,6 +266,9 @@ module RestModule {
|
|
|
210
266
|
for (let [key, value] of Object.entries(object)) {
|
|
211
267
|
form.append(key, value)
|
|
212
268
|
}
|
|
269
|
+
addPaginationToBody((key: string, value: any) => {
|
|
270
|
+
form.append(key, value)
|
|
271
|
+
})
|
|
213
272
|
input.body = form
|
|
214
273
|
break
|
|
215
274
|
case BodyTypes.XML:
|
|
@@ -219,13 +278,15 @@ module RestModule {
|
|
|
219
278
|
input.body = string
|
|
220
279
|
input.headers["Content-Type"] = "application/xml"
|
|
221
280
|
break
|
|
222
|
-
default:
|
|
223
281
|
case BodyTypes.JSON:
|
|
224
282
|
// if JSON error, throw it
|
|
225
283
|
if (error) {
|
|
226
284
|
throw "Invalid JSON for request body"
|
|
227
285
|
}
|
|
228
|
-
|
|
286
|
+
addPaginationToBody((key: string, value: any) => {
|
|
287
|
+
object[key] = value
|
|
288
|
+
})
|
|
289
|
+
input.body = JSON.stringify(object)
|
|
229
290
|
input.headers["Content-Type"] = "application/json"
|
|
230
291
|
break
|
|
231
292
|
}
|
|
@@ -271,6 +332,8 @@ module RestModule {
|
|
|
271
332
|
bodyType,
|
|
272
333
|
requestBody,
|
|
273
334
|
authConfigId,
|
|
335
|
+
pagination,
|
|
336
|
+
paginationValues
|
|
274
337
|
} = query
|
|
275
338
|
const authHeaders = this.getAuthHeaders(authConfigId)
|
|
276
339
|
|
|
@@ -289,14 +352,12 @@ module RestModule {
|
|
|
289
352
|
}
|
|
290
353
|
|
|
291
354
|
let input: any = { method, headers: this.headers }
|
|
292
|
-
|
|
293
|
-
input = this.addBody(bodyType, requestBody, input)
|
|
294
|
-
}
|
|
355
|
+
input = this.addBody(bodyType, requestBody, input, pagination, paginationValues)
|
|
295
356
|
|
|
296
357
|
this.startTimeMs = performance.now()
|
|
297
|
-
const url = this.getUrl(path, queryString)
|
|
358
|
+
const url = this.getUrl(path, queryString, pagination, paginationValues)
|
|
298
359
|
const response = await fetch(url, input)
|
|
299
|
-
return await this.parseResponse(response)
|
|
360
|
+
return await this.parseResponse(response, pagination)
|
|
300
361
|
}
|
|
301
362
|
|
|
302
363
|
async create(opts: RestQuery) {
|