forked from tsai/budibase
17 changed files with 159 additions and 99 deletions
@ -0,0 +1,6 @@ |
|||
export interface IntegrationBase { |
|||
create?(query: any): Promise<[any]> |
|||
read?(query: any): Promise<[any]> |
|||
update?(query: any): Promise<[any]> |
|||
delete?(query: any): Promise<[any]> |
|||
} |
|||
@ -0,0 +1,31 @@ |
|||
const workerFarm = require("worker-farm") |
|||
const MAX_WORKER_TIME_MS = 10000 |
|||
const workers = workerFarm( |
|||
{ |
|||
autoStart: true, |
|||
maxConcurrentWorkers: 1, |
|||
maxCallTime: MAX_WORKER_TIME_MS, |
|||
}, |
|||
require.resolve("./runner") |
|||
) |
|||
|
|||
function runService(data) { |
|||
return new Promise((resolve, reject) => { |
|||
workers(data, (err, response) => { |
|||
if (err) { |
|||
reject(err) |
|||
} else { |
|||
resolve(response) |
|||
} |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
module.exports = async (datasource, queryVerb, query, transformer) => { |
|||
return runService({ |
|||
datasource, |
|||
queryVerb, |
|||
query, |
|||
transformer, |
|||
}) |
|||
} |
|||
@ -0,0 +1,63 @@ |
|||
const ScriptRunner = require("../scriptRunner") |
|||
const { integrations } = require("../../integrations") |
|||
|
|||
function formatResponse(resp) { |
|||
if (typeof resp === "string") { |
|||
try { |
|||
resp = JSON.parse(resp) |
|||
} catch (err) { |
|||
resp = { response: resp } |
|||
} |
|||
} |
|||
return resp |
|||
} |
|||
|
|||
async function runAndTransform(datasource, queryVerb, query, transformer) { |
|||
const Integration = integrations[datasource.source] |
|||
if (!Integration) { |
|||
throw "Integration type does not exist." |
|||
} |
|||
const integration = new Integration(datasource.config) |
|||
|
|||
let rows = formatResponse(await integration[queryVerb](query)) |
|||
|
|||
// transform as required
|
|||
if (transformer) { |
|||
const runner = new ScriptRunner(transformer, { data: rows }) |
|||
rows = runner.execute() |
|||
} |
|||
|
|||
// needs to an array for next step
|
|||
if (!Array.isArray(rows)) { |
|||
rows = [rows] |
|||
} |
|||
|
|||
// map into JSON if just raw primitive here
|
|||
if (rows.find(row => typeof row !== "object")) { |
|||
rows = rows.map(value => ({ value })) |
|||
} |
|||
|
|||
// get all the potential fields in the schema
|
|||
let keys = rows.flatMap(Object.keys) |
|||
|
|||
if (integration.end) { |
|||
integration.end() |
|||
} |
|||
|
|||
return { rows, keys } |
|||
} |
|||
|
|||
module.exports = (input, callback) => { |
|||
runAndTransform( |
|||
input.datasource, |
|||
input.queryVerb, |
|||
input.query, |
|||
input.transformer |
|||
) |
|||
.then(response => { |
|||
callback(null, response) |
|||
}) |
|||
.catch(err => { |
|||
callback(err) |
|||
}) |
|||
} |
|||
Loading…
Reference in new issue