Merge branch 'async-workflow-blocks' of github.com:Budibase/budibase into async-workflow-blocks

This commit is contained in:
Andrew Kingston 2020-09-23 12:31:01 +01:00
commit 3caac561b8
5 changed files with 125 additions and 16 deletions

View File

@ -3,18 +3,18 @@ const validateJs = require("validate.js")
const newid = require("../../db/newid") const newid = require("../../db/newid")
function emitEvent(eventType, ctx, record) { function emitEvent(eventType, ctx, record) {
let event = {
record,
instanceId: ctx.user.instanceId,
}
// add syntactic sugar for mustache later // add syntactic sugar for mustache later
if (record._id) { if (record._id) {
record.id = record._id event.id = record._id
} }
if (record._rev) { if (record._rev) {
record.revision = record._rev event.revision = record._rev
} }
ctx.eventEmitter && ctx.eventEmitter && ctx.eventEmitter.emit(eventType, event)
ctx.eventEmitter.emit(eventType, {
record,
instanceId: ctx.user.instanceId,
})
} }
validateJs.extend(validateJs.validators.datetime, { validateJs.extend(validateJs.validators.datetime, {

View File

@ -1,5 +1,6 @@
const sendEmail = require("./steps/sendEmail") const sendEmail = require("./steps/sendEmail")
const saveRecord = require("./steps/saveRecord") const saveRecord = require("./steps/saveRecord")
const updateRecord = require("./steps/updateRecord")
const deleteRecord = require("./steps/deleteRecord") const deleteRecord = require("./steps/deleteRecord")
const createUser = require("./steps/createUser") const createUser = require("./steps/createUser")
const environment = require("../environment") const environment = require("../environment")
@ -17,12 +18,14 @@ const AUTOMATION_MANIFEST = "manifest.json"
const BUILTIN_ACTIONS = { const BUILTIN_ACTIONS = {
SEND_EMAIL: sendEmail.run, SEND_EMAIL: sendEmail.run,
SAVE_RECORD: saveRecord.run, SAVE_RECORD: saveRecord.run,
UPDATE_RECORD: updateRecord.run,
DELETE_RECORD: deleteRecord.run, DELETE_RECORD: deleteRecord.run,
CREATE_USER: createUser.run, CREATE_USER: createUser.run,
} }
const BUILTIN_DEFINITIONS = { const BUILTIN_DEFINITIONS = {
SEND_EMAIL: sendEmail.definition, SEND_EMAIL: sendEmail.definition,
SAVE_RECORD: saveRecord.definition, SAVE_RECORD: saveRecord.definition,
UPDATE_RECORD: updateRecord.definition,
DELETE_RECORD: deleteRecord.definition, DELETE_RECORD: deleteRecord.definition,
CREATE_USER: createUser.definition, CREATE_USER: createUser.definition,
} }

View File

@ -0,0 +1,94 @@
const recordController = require("../../api/controllers/record")
module.exports.definition = {
name: "Update Record",
tagline: "Update a {{inputs.enriched.model.name}} record",
icon: "ri-refresh-fill",
description: "Update a record to your database",
type: "ACTION",
stepId: "UPDATE_RECORD",
inputs: {},
schema: {
inputs: {
properties: {
record: {
type: "object",
customType: "record",
title: "Record",
},
recordId: {
type: "string",
title: "Record ID",
},
},
required: ["record", "recordId"],
},
outputs: {
properties: {
record: {
type: "object",
customType: "record",
description: "The updated record",
},
response: {
type: "object",
description: "The response from the table",
},
success: {
type: "boolean",
description: "Whether the action was successful",
},
id: {
type: "string",
description: "The identifier of the updated record",
},
revision: {
type: "string",
description: "The revision of the updated record",
},
},
required: ["success", "id", "revision"],
},
},
}
module.exports.run = async function({ inputs, instanceId }) {
if (inputs.recordId == null || inputs.record == null) {
return
}
// clear any falsy properties so that they aren't updated
for (let propKey of Object.keys(inputs.record)) {
if (!inputs.record[propKey] || inputs.record[propKey] === "") {
delete inputs.record[propKey]
}
}
// have to clean up the record, remove the model from it
const ctx = {
params: {
id: inputs.recordId,
},
request: {
body: inputs.record,
},
user: { instanceId },
}
try {
await recordController.patch(ctx)
return {
record: ctx.body,
response: ctx.message,
id: ctx.body._id,
revision: ctx.body._rev,
success: ctx.status === 200,
}
} catch (err) {
console.error(err)
return {
success: false,
response: err,
}
}
}

View File

@ -109,14 +109,18 @@ class Orchestrator {
step.inputs = recurseMustache(step.inputs, this._context) step.inputs = recurseMustache(step.inputs, this._context)
step.inputs = cleanInputValue(step.inputs, step.schema.inputs) step.inputs = cleanInputValue(step.inputs, step.schema.inputs)
// instanceId is always passed // instanceId is always passed
const outputs = await stepFn({ try {
inputs: step.inputs, const outputs = await stepFn({
instanceId: this._instanceId, inputs: step.inputs,
}) instanceId: this._instanceId,
if (step.stepId === FILTER_STEP_ID && !outputs.success) { })
break if (step.stepId === FILTER_STEP_ID && !outputs.success) {
break
}
this._context.steps.push(outputs)
} catch (err) {
console.error(`Automation error - ${step.stepId} - ${err}`)
} }
this._context.steps.push(outputs)
} }
} }
} }

View File

@ -36,8 +36,16 @@ const BUILTIN_DEFINITIONS = {
customType: "record", customType: "record",
description: "The new record that was saved", description: "The new record that was saved",
}, },
id: {
type: "string",
description: "Record ID - can be used for updating",
},
revision: {
type: "string",
description: "Revision of record",
},
}, },
required: ["record"], required: ["record", "id"],
}, },
}, },
type: "TRIGGER", type: "TRIGGER",
@ -69,7 +77,7 @@ const BUILTIN_DEFINITIONS = {
description: "The record that was deleted", description: "The record that was deleted",
}, },
}, },
required: ["record"], required: ["record", "id"],
}, },
}, },
type: "TRIGGER", type: "TRIGGER",