Delete and invalidate linked dynamic variables when a query is deleted

This commit is contained in:
Rory Powell 2022-01-05 11:54:59 -05:00
parent e115a561c2
commit 8210ed7ee4
3 changed files with 24 additions and 2 deletions

View File

@ -66,7 +66,7 @@ export class OpenAPI2 extends OpenAPISource {
getInfo = async (): Promise<ImportInfo> => { getInfo = async (): Promise<ImportInfo> => {
const name = this.document.info.title || "Swagger Import" const name = this.document.info.title || "Swagger Import"
return { return {
name name,
} }
} }

View File

@ -8,6 +8,7 @@ const { BaseQueryVerbs } = require("../../../constants")
const { Thread, ThreadType } = require("../../../threads") const { Thread, ThreadType } = require("../../../threads")
const { save: saveDatasource } = require("../datasource") const { save: saveDatasource } = require("../datasource")
const { RestImporter } = require("./import") const { RestImporter } = require("./import")
const { invalidateDynamicVariables } = require("../../../threads/utils")
const Runner = new Thread(ThreadType.QUERY, { timeoutMs: 10000 }) const Runner = new Thread(ThreadType.QUERY, { timeoutMs: 10000 })
@ -166,8 +167,28 @@ exports.executeV2 = async function (ctx) {
return execute(ctx, { rowsOnly: false }) return execute(ctx, { rowsOnly: false })
} }
const removeDynamicVariables = async (db, queryId) => {
const query = await db.get(queryId)
const datasource = await db.get(query.datasourceId)
const dynamicVariables = datasource.config.dynamicVariables
if (dynamicVariables) {
// invalidate the deleted variables
const variablesToDelete = dynamicVariables.filter(
dv => dv.queryId === queryId
)
await invalidateDynamicVariables(variablesToDelete)
// delete dynamic variables from the datasource
const newVariables = dynamicVariables.filter(dv => dv.queryId !== queryId)
datasource.config.dynamicVariables = newVariables
await db.put(datasource)
}
}
exports.destroy = async function (ctx) { exports.destroy = async function (ctx) {
const db = new CouchDB(ctx.appId) const db = new CouchDB(ctx.appId)
await removeDynamicVariables(db, ctx.params.queryId)
await db.remove(ctx.params.queryId, ctx.params.revId) await db.remove(ctx.params.queryId, ctx.params.revId)
ctx.message = `Query deleted.` ctx.message = `Query deleted.`
ctx.status = 200 ctx.status = 200

View File

@ -42,10 +42,11 @@ exports.checkCacheForDynamicVariable = async (queryId, variable) => {
} }
exports.invalidateDynamicVariables = async cachedVars => { exports.invalidateDynamicVariables = async cachedVars => {
const cache = await getClient()
let promises = [] let promises = []
for (let variable of cachedVars) { for (let variable of cachedVars) {
promises.push( promises.push(
client.delete(makeVariableKey(variable.queryId, variable.name)) cache.delete(makeVariableKey(variable.queryId, variable.name))
) )
} }
await Promise.all(promises) await Promise.all(promises)