1
0
Fork 0
mirror of synced 2024-09-21 20:01:32 +12:00
budibase/packages/server/src/automations/steps/outgoingWebhook.js

97 lines
2.2 KiB
JavaScript
Raw Normal View History

const fetch = require("node-fetch")
const RequestType = {
POST: "POST",
GET: "GET",
PUT: "PUT",
DELETE: "DELETE",
PATCH: "PATCH",
}
const BODY_REQUESTS = [RequestType.POST, RequestType.PUT, RequestType.PATCH]
/**
* Note, there is some functionality in this that is not currently exposed as it
* is complex and maybe better to be opinionated here.
* GET/DELETE requests cannot handle body elements so they will not be sent if configured.
*/
module.exports.definition = {
name: "Outgoing webhook",
tagline: "Send a {{inputs.requestMethod}} request",
icon: "ri-send-plane-line",
description: "Send a request of specified method to a URL",
type: "ACTION",
stepId: "OUTGOING_WEBHOOK",
inputs: {
requestMethod: "POST",
url: "http://",
requestBody: "{}",
},
schema: {
inputs: {
properties: {
requestMethod: {
type: "string",
enum: Object.values(RequestType),
title: "Request method",
},
url: {
type: "string",
title: "URL",
},
requestBody: {
type: "string",
title: "JSON Body",
customType: "wide",
},
},
required: ["requestMethod", "url"],
},
outputs: {
properties: {
response: {
type: "object",
description: "The response from the webhook",
},
success: {
type: "boolean",
description: "Whether the action was successful",
},
},
required: ["response", "success"],
},
},
}
2021-05-03 19:31:09 +12:00
module.exports.run = async function ({ inputs }) {
let { requestMethod, url, requestBody } = inputs
if (!url.startsWith("http")) {
url = `http://${url}`
}
const request = {
method: requestMethod,
}
if (
requestBody &&
requestBody.length !== 0 &&
BODY_REQUESTS.indexOf(requestMethod) !== -1
) {
request.body = JSON.parse(requestBody)
}
try {
const response = await fetch(url, request)
return {
response: await response.json(),
success: response.status === 200,
}
} catch (err) {
/* istanbul ignore next */
return {
success: false,
response: err,
}
}
}