@budibase/server 1.0.212-alpha.12 → 1.0.212-alpha.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__mocks__/node-fetch.ts +9 -0
- package/builder/assets/{index.969c2236.css → index.7786f497.css} +2 -2
- package/builder/assets/index.83448a6c.js +977 -0
- package/builder/assets/{vendor.9bf2fcb4.js → vendor.001dcf8c.js} +163 -163
- package/builder/index.html +3 -3
- package/coverage/clover.xml +636 -590
- package/coverage/coverage-final.json +20 -20
- package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
- package/coverage/lcov-report/api/controllers/automation.js.html +111 -12
- package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
- package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
- package/coverage/lcov-report/api/controllers/component.js.html +1 -1
- package/coverage/lcov-report/api/controllers/datasource.js.html +16 -16
- package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
- 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/migrations.js.html +1 -1
- package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
- package/coverage/lcov-report/api/controllers/query/index.html +1 -1
- package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/role.js.html +1 -1
- package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/index.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
- package/coverage/lcov-report/api/controllers/script.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
- package/coverage/lcov-report/api/controllers/user.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
- package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
- package/coverage/lcov-report/api/index.html +15 -15
- package/coverage/lcov-report/api/index.js.html +22 -13
- package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
- package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/routes/auth.js.html +1 -1
- package/coverage/lcov-report/api/routes/automation.js.html +32 -2
- package/coverage/lcov-report/api/routes/backup.js.html +1 -1
- package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
- package/coverage/lcov-report/api/routes/component.js.html +1 -1
- package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
- package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
- package/coverage/lcov-report/api/routes/dev.js.html +1 -1
- package/coverage/lcov-report/api/routes/index.html +1 -1
- package/coverage/lcov-report/api/routes/integration.js.html +1 -1
- package/coverage/lcov-report/api/routes/layout.js.html +1 -1
- package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
- package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
- package/coverage/lcov-report/api/routes/permission.js.html +1 -1
- package/coverage/lcov-report/api/routes/query.js.html +1 -1
- package/coverage/lcov-report/api/routes/role.js.html +1 -1
- package/coverage/lcov-report/api/routes/routing.js.html +1 -1
- package/coverage/lcov-report/api/routes/screen.js.html +1 -1
- package/coverage/lcov-report/api/routes/script.js.html +1 -1
- package/coverage/lcov-report/api/routes/table.js.html +1 -1
- package/coverage/lcov-report/api/routes/templates.js.html +1 -1
- package/coverage/lcov-report/api/routes/user.js.html +1 -1
- package/coverage/lcov-report/api/routes/utils/index.html +1 -1
- package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
- package/coverage/lcov-report/api/routes/view.js.html +1 -1
- package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/actions.js.html +1 -1
- package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
- package/coverage/lcov-report/automations/bullboard.js.html +1 -1
- package/coverage/lcov-report/automations/index.html +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/delay.js.html +1 -1
- package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
- package/coverage/lcov-report/automations/steps/filter.js.html +58 -34
- package/coverage/lcov-report/automations/steps/index.html +11 -11
- package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
- package/coverage/lcov-report/automations/steps/loop.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/constants/index.html +1 -1
- package/coverage/lcov-report/constants/index.js.html +1 -1
- package/coverage/lcov-report/constants/layouts.js.html +1 -1
- package/coverage/lcov-report/constants/screens.js.html +1 -1
- package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
- package/coverage/lcov-report/db/index.html +14 -14
- 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 +13 -13
- package/coverage/lcov-report/db/linkedRows/index.js.html +10 -7
- 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 +25 -52
- 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 +57 -57
- 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/builder.js.html +12 -12
- package/coverage/lcov-report/middleware/currentapp.js.html +33 -33
- package/coverage/lcov-report/middleware/index.html +1 -1
- package/coverage/lcov-report/middleware/joi-validator.js.html +10 -10
- package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
- 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/utils.js.html +2 -2
- package/coverage/lcov-report/threads/automation.js.html +17 -8
- package/coverage/lcov-report/threads/index.html +25 -25
- package/coverage/lcov-report/threads/query.js.html +280 -76
- package/coverage/lcov-report/threads/utils.js.html +4 -4
- package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
- package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
- package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
- package/coverage/lcov-report/utilities/global.js.html +14 -14
- package/coverage/lcov-report/utilities/index.html +1 -1
- package/coverage/lcov-report/utilities/index.js.html +9 -9
- 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 +1 -1
- 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 +2 -2
- package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
- package/coverage/lcov-report/utilities/users.js.html +1 -1
- package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
- package/coverage/lcov.info +1131 -1049
- package/dist/api/controllers/application.js +2 -1
- package/dist/api/controllers/automation.js +28 -2
- package/dist/api/controllers/query/index.js +25 -0
- package/dist/api/index.js +4 -1
- package/dist/api/routes/automation.js +2 -0
- package/dist/automations/logging/index.js +70 -0
- package/dist/automations/steps/filter.js +38 -29
- package/dist/db/linkedRows/index.js +1 -0
- package/dist/db/utils.js +3 -31
- package/dist/environment.js +1 -0
- package/dist/integrations/queries/sql.js +3 -0
- package/dist/integrations/rest.js +1 -1
- package/dist/package.json +6 -6
- package/dist/tests/utilities/TestConfiguration.js +19 -6
- package/dist/threads/automation.js +5 -2
- package/dist/threads/index.js +15 -1
- package/dist/threads/query.js +53 -8
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/src/api/controllers/application.ts +2 -1
- package/src/api/controllers/automation.js +35 -2
- package/src/api/controllers/query/index.ts +29 -1
- package/src/api/index.js +4 -1
- package/src/api/routes/automation.js +10 -0
- package/src/api/routes/tests/query.spec.js +166 -0
- package/src/automations/logging/index.ts +35 -0
- package/src/automations/steps/filter.js +36 -28
- package/src/automations/tests/filter.spec.js +2 -1
- package/src/db/linkedRows/index.js +1 -0
- package/src/db/utils.js +4 -13
- package/src/environment.js +1 -0
- package/src/integrations/queries/sql.ts +3 -1
- package/src/integrations/rest.ts +1 -1
- package/src/integrations/tests/rest.spec.js +16 -1
- package/src/migrations/tests/index.spec.ts +18 -2
- package/src/module.d.ts +2 -0
- package/src/tests/utilities/TestConfiguration.js +22 -3
- package/src/threads/automation.js +5 -2
- package/src/threads/index.ts +5 -1
- package/src/threads/query.js +78 -10
- package/builder/assets/index.a895b27f.js +0 -978
|
@@ -28,6 +28,8 @@ const { encrypt } = require("@budibase/backend-core/encryption")
|
|
|
28
28
|
|
|
29
29
|
const GLOBAL_USER_ID = "us_uuid1"
|
|
30
30
|
const EMAIL = "babs@babs.com"
|
|
31
|
+
const FIRSTNAME = "Barbara"
|
|
32
|
+
const LASTNAME = "Barbington"
|
|
31
33
|
const CSRF_TOKEN = "e3727778-7af0-4226-b5eb-f43cbe60a306"
|
|
32
34
|
|
|
33
35
|
class TestConfiguration {
|
|
@@ -59,6 +61,15 @@ class TestConfiguration {
|
|
|
59
61
|
return this.prodAppId
|
|
60
62
|
}
|
|
61
63
|
|
|
64
|
+
getUserDetails() {
|
|
65
|
+
return {
|
|
66
|
+
globalId: GLOBAL_USER_ID,
|
|
67
|
+
email: EMAIL,
|
|
68
|
+
firstName: FIRSTNAME,
|
|
69
|
+
lastName: LASTNAME,
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
62
73
|
async doInContext(appId, task) {
|
|
63
74
|
if (!appId) {
|
|
64
75
|
appId = this.appId
|
|
@@ -118,6 +129,8 @@ class TestConfiguration {
|
|
|
118
129
|
// USER / AUTH
|
|
119
130
|
async globalUser({
|
|
120
131
|
id = GLOBAL_USER_ID,
|
|
132
|
+
firstName = FIRSTNAME,
|
|
133
|
+
lastName = LASTNAME,
|
|
121
134
|
builder = true,
|
|
122
135
|
admin = false,
|
|
123
136
|
email = EMAIL,
|
|
@@ -135,6 +148,8 @@ class TestConfiguration {
|
|
|
135
148
|
...existing,
|
|
136
149
|
roles: roles || {},
|
|
137
150
|
tenantId: TENANT_ID,
|
|
151
|
+
firstName,
|
|
152
|
+
lastName,
|
|
138
153
|
}
|
|
139
154
|
await createASession(id, {
|
|
140
155
|
sessionId: "sessionid",
|
|
@@ -161,6 +176,8 @@ class TestConfiguration {
|
|
|
161
176
|
|
|
162
177
|
async createUser(
|
|
163
178
|
id = null,
|
|
179
|
+
firstName = FIRSTNAME,
|
|
180
|
+
lastName = LASTNAME,
|
|
164
181
|
email = EMAIL,
|
|
165
182
|
builder = true,
|
|
166
183
|
admin = false,
|
|
@@ -169,6 +186,8 @@ class TestConfiguration {
|
|
|
169
186
|
const globalId = !id ? `us_${Math.random()}` : `us_${id}`
|
|
170
187
|
const resp = await this.globalUser({
|
|
171
188
|
id: globalId,
|
|
189
|
+
firstName,
|
|
190
|
+
lastName,
|
|
172
191
|
email,
|
|
173
192
|
builder,
|
|
174
193
|
admin,
|
|
@@ -520,14 +539,14 @@ class TestConfiguration {
|
|
|
520
539
|
|
|
521
540
|
// QUERY
|
|
522
541
|
|
|
523
|
-
async previewQuery(request, config, datasource, fields) {
|
|
542
|
+
async previewQuery(request, config, datasource, fields, params, verb) {
|
|
524
543
|
return request
|
|
525
544
|
.post(`/api/queries/preview`)
|
|
526
545
|
.send({
|
|
527
546
|
datasourceId: datasource._id,
|
|
528
|
-
parameters: {},
|
|
547
|
+
parameters: params || {},
|
|
529
548
|
fields,
|
|
530
|
-
queryVerb: "read",
|
|
549
|
+
queryVerb: verb || "read",
|
|
531
550
|
name: datasource.name,
|
|
532
551
|
})
|
|
533
552
|
.set(config.defaultHeaders())
|
|
@@ -9,11 +9,12 @@ 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
11
|
const { AutomationErrors, LoopStepTypes } = require("../constants")
|
|
12
|
+
const { storeLog } = require("../automations/logging")
|
|
12
13
|
const FILTER_STEP_ID = actions.ACTION_DEFINITIONS.FILTER.stepId
|
|
13
14
|
const LOOP_STEP_ID = actions.ACTION_DEFINITIONS.LOOP.stepId
|
|
14
15
|
|
|
15
16
|
const CRON_STEP_ID = triggerDefs.CRON.stepId
|
|
16
|
-
const STOPPED_STATUS = { success:
|
|
17
|
+
const STOPPED_STATUS = { success: true, status: "STOPPED" }
|
|
17
18
|
const { cloneDeep } = require("lodash/fp")
|
|
18
19
|
const env = require("../environment")
|
|
19
20
|
|
|
@@ -275,7 +276,7 @@ class Orchestrator {
|
|
|
275
276
|
this._context.steps[stepCount] = outputs
|
|
276
277
|
// if filter causes us to stop execution don't break the loop, set a var
|
|
277
278
|
// so that we can finish iterating through the steps and record that it stopped
|
|
278
|
-
if (step.stepId === FILTER_STEP_ID && !outputs.
|
|
279
|
+
if (step.stepId === FILTER_STEP_ID && !outputs.result) {
|
|
279
280
|
stopped = true
|
|
280
281
|
this.updateExecutionOutput(step.id, step.stepId, step.inputs, {
|
|
281
282
|
...outputs,
|
|
@@ -325,6 +326,8 @@ class Orchestrator {
|
|
|
325
326
|
}
|
|
326
327
|
}
|
|
327
328
|
|
|
329
|
+
// store the logs for the automation run
|
|
330
|
+
await storeLog(this._automation, this.executionOutput)
|
|
328
331
|
return this.executionOutput
|
|
329
332
|
}
|
|
330
333
|
}
|
package/src/threads/index.ts
CHANGED
|
@@ -77,7 +77,7 @@ export class Thread {
|
|
|
77
77
|
})
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
static
|
|
80
|
+
static stopThreads() {
|
|
81
81
|
return new Promise<void>(resolve => {
|
|
82
82
|
if (Thread.workerRefs.length === 0) {
|
|
83
83
|
resolve()
|
|
@@ -95,4 +95,8 @@ export class Thread {
|
|
|
95
95
|
Thread.workerRefs = []
|
|
96
96
|
})
|
|
97
97
|
}
|
|
98
|
+
|
|
99
|
+
static async shutdown() {
|
|
100
|
+
await Thread.stopThreads()
|
|
101
|
+
}
|
|
98
102
|
}
|
package/src/threads/query.js
CHANGED
|
@@ -4,6 +4,12 @@ const ScriptRunner = require("../utilities/scriptRunner")
|
|
|
4
4
|
const { integrations } = require("../integrations")
|
|
5
5
|
const { processStringSync } = require("@budibase/string-templates")
|
|
6
6
|
const { doInAppContext, getAppDB } = require("@budibase/backend-core/context")
|
|
7
|
+
const {
|
|
8
|
+
refreshOAuthToken,
|
|
9
|
+
updateUserOAuth,
|
|
10
|
+
} = require("@budibase/backend-core/auth")
|
|
11
|
+
const { getGlobalIDFromUserMetadataID } = require("../db/utils")
|
|
12
|
+
|
|
7
13
|
const { isSQL } = require("../integrations/utils")
|
|
8
14
|
const {
|
|
9
15
|
enrichQueryFields,
|
|
@@ -21,29 +27,56 @@ class QueryRunner {
|
|
|
21
27
|
this.queryId = input.queryId
|
|
22
28
|
this.noRecursiveQuery = flags.noRecursiveQuery
|
|
23
29
|
this.cachedVariables = []
|
|
30
|
+
// Additional context items for enrichment
|
|
31
|
+
this.ctx = input.ctx
|
|
24
32
|
// allows the response from a query to be stored throughout this
|
|
25
33
|
// execution so that if it needs to be re-used for another variable
|
|
26
34
|
// it can be
|
|
27
35
|
this.queryResponse = {}
|
|
28
36
|
this.hasRerun = false
|
|
37
|
+
this.hasRefreshedOAuth = false
|
|
29
38
|
}
|
|
30
39
|
|
|
31
40
|
async execute() {
|
|
32
41
|
let { datasource, fields, queryVerb, transformer } = this
|
|
42
|
+
|
|
33
43
|
const Integration = integrations[datasource.source]
|
|
34
44
|
if (!Integration) {
|
|
35
45
|
throw "Integration type does not exist."
|
|
36
46
|
}
|
|
47
|
+
|
|
48
|
+
if (datasource.config.authConfigs) {
|
|
49
|
+
datasource.config.authConfigs = datasource.config.authConfigs.map(
|
|
50
|
+
config => {
|
|
51
|
+
return enrichQueryFields(config, this.ctx)
|
|
52
|
+
}
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
|
|
37
56
|
const integration = new Integration(datasource.config)
|
|
38
57
|
|
|
39
58
|
// pre-query, make sure datasource variables are added to parameters
|
|
40
59
|
const parameters = await this.addDatasourceVariables()
|
|
60
|
+
|
|
61
|
+
// Enrich the parameters with the addition context items.
|
|
62
|
+
// 'user' is now a reserved variable key in mapping parameters
|
|
63
|
+
const enrichedParameters = enrichQueryFields(parameters, this.ctx)
|
|
64
|
+
const enrichedContext = { ...enrichedParameters, ...this.ctx }
|
|
65
|
+
|
|
66
|
+
// Parse global headers
|
|
67
|
+
if (datasource.config.defaultHeaders) {
|
|
68
|
+
datasource.config.defaultHeaders = enrichQueryFields(
|
|
69
|
+
datasource.config.defaultHeaders,
|
|
70
|
+
enrichedContext
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
|
|
41
74
|
let query
|
|
42
75
|
// handle SQL injections by interpolating the variables
|
|
43
76
|
if (isSQL(datasource)) {
|
|
44
|
-
query = interpolateSQL(fields,
|
|
77
|
+
query = interpolateSQL(fields, enrichedParameters, integration)
|
|
45
78
|
} else {
|
|
46
|
-
query = enrichQueryFields(fields,
|
|
79
|
+
query = enrichQueryFields(fields, enrichedContext)
|
|
47
80
|
}
|
|
48
81
|
|
|
49
82
|
// Add pagination values for REST queries
|
|
@@ -67,20 +100,30 @@ class QueryRunner {
|
|
|
67
100
|
if (transformer) {
|
|
68
101
|
const runner = new ScriptRunner(transformer, {
|
|
69
102
|
data: rows,
|
|
70
|
-
params:
|
|
103
|
+
params: enrichedParameters,
|
|
71
104
|
})
|
|
72
105
|
rows = runner.execute()
|
|
73
106
|
}
|
|
74
107
|
|
|
75
108
|
// if the request fails we retry once, invalidating the cached value
|
|
76
|
-
if (
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
109
|
+
if (info && info.code >= 400 && !this.hasRerun) {
|
|
110
|
+
if (
|
|
111
|
+
this.ctx.user?.provider &&
|
|
112
|
+
info.code === 401 &&
|
|
113
|
+
!this.hasRefreshedOAuth
|
|
114
|
+
) {
|
|
115
|
+
// Attempt to refresh the access token from the provider
|
|
116
|
+
this.hasRefreshedOAuth = true
|
|
117
|
+
const authResponse = await this.refreshOAuth2(this.ctx)
|
|
118
|
+
|
|
119
|
+
if (!authResponse || authResponse.err) {
|
|
120
|
+
// In this event the user may have oAuth issues that
|
|
121
|
+
// could require re-authenticating with their provider.
|
|
122
|
+
throw new Error("OAuth2 access token could not be refreshed")
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
82
126
|
this.hasRerun = true
|
|
83
|
-
// invalidate the cache value
|
|
84
127
|
await threadUtils.invalidateDynamicVariables(this.cachedVariables)
|
|
85
128
|
return this.execute()
|
|
86
129
|
}
|
|
@@ -126,6 +169,31 @@ class QueryRunner {
|
|
|
126
169
|
).execute()
|
|
127
170
|
}
|
|
128
171
|
|
|
172
|
+
async refreshOAuth2(ctx) {
|
|
173
|
+
const { oauth2, providerType, _id } = ctx.user
|
|
174
|
+
const { configId } = ctx.auth
|
|
175
|
+
|
|
176
|
+
if (!providerType || !oauth2?.refreshToken) {
|
|
177
|
+
console.error("No refresh token found for authenticated user")
|
|
178
|
+
return
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const resp = await refreshOAuthToken(
|
|
182
|
+
oauth2.refreshToken,
|
|
183
|
+
providerType,
|
|
184
|
+
configId
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
// Refresh session flow. Should be in same location as refreshOAuthToken
|
|
188
|
+
// There are several other properties available in 'resp'
|
|
189
|
+
if (!resp.error) {
|
|
190
|
+
const globalUserId = getGlobalIDFromUserMetadataID(_id)
|
|
191
|
+
await updateUserOAuth(globalUserId, resp)
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return resp
|
|
195
|
+
}
|
|
196
|
+
|
|
129
197
|
async getDynamicVariable(variable) {
|
|
130
198
|
let { parameters } = this
|
|
131
199
|
const queryId = variable.queryId,
|