forked from tsai/budibase
10 changed files with 119 additions and 8 deletions
@ -0,0 +1,96 @@ |
|||||
|
const axios = require("axios") |
||||
|
|
||||
|
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"], |
||||
|
}, |
||||
|
}, |
||||
|
} |
||||
|
|
||||
|
module.exports.run = async function({ inputs }) { |
||||
|
let { requestMethod, url, requestBody } = inputs |
||||
|
if (!url.startsWith("http")) { |
||||
|
url = `http://${url}` |
||||
|
} |
||||
|
const request = { |
||||
|
method: requestMethod, |
||||
|
url, |
||||
|
} |
||||
|
if ( |
||||
|
requestBody && |
||||
|
requestBody.length !== 0 && |
||||
|
BODY_REQUESTS.indexOf(requestMethod) !== -1 |
||||
|
) { |
||||
|
request.data = JSON.parse(requestBody) |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
const response = await axios(request) |
||||
|
return { |
||||
|
response: response.data, |
||||
|
success: response.status === 200, |
||||
|
} |
||||
|
} catch (err) { |
||||
|
return { |
||||
|
success: false, |
||||
|
response: err, |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue