117 lines
2.7 KiB
JavaScript
117 lines
2.7 KiB
JavaScript
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"],
|
|
},
|
|
},
|
|
}
|
|
|
|
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 =
|
|
typeof requestBody === "string"
|
|
? requestBody
|
|
: JSON.stringify(requestBody)
|
|
request.headers = {
|
|
"Content-Type": "application/json",
|
|
}
|
|
}
|
|
|
|
try {
|
|
// do a quick JSON parse if there is a body, to generate an error if its invalid
|
|
if (request.body) {
|
|
JSON.parse(request.body)
|
|
}
|
|
const response = await fetch(url, request)
|
|
const contentType = response.headers.get("content-type")
|
|
const success = response.status === 200
|
|
let resp
|
|
if (!success) {
|
|
resp = response.statusText
|
|
} else if (contentType && contentType.indexOf("application/json") !== -1) {
|
|
resp = await response.json()
|
|
} else {
|
|
resp = await response.text()
|
|
}
|
|
return {
|
|
response: resp,
|
|
success: success,
|
|
}
|
|
} catch (err) {
|
|
/* istanbul ignore next */
|
|
return {
|
|
success: false,
|
|
response: err,
|
|
}
|
|
}
|
|
}
|