actions/trigger-incident/trigger-incident.mjs
import constants from "../../common/constants.mjs"; import utils from "../../common/utils.mjs"; import pagerduty from "../../pagerduty.app.mjs"; const { reduceProperties, emptyStrToUndefined, commaSeparatedListToArray, } = utils; export default { key: "pagerduty-trigger-incident", name: "Trigger Incident", description: "Trigger an incident. [See the docs here](https://developer.pagerduty.com/api-reference/b3A6Mjc0ODE0MA-create-an-incident)", type: "action", version: "0.0.4", annotations: { destructiveHint: false, openWorldHint: true, readOnlyHint: false, }, props: { pagerduty, title: { propDefinition: [ pagerduty, "incidentTitle", ], }, serviceId: { propDefinition: [ pagerduty, "serviceId", ], }, urgency: { propDefinition: [ pagerduty, "incidentUrgency", ], }, bodyDetails: { propDefinition: [ pagerduty, "incidentBodyDetails", ], }, incidentKey: { propDefinition: [ pagerduty, "incidentKey", ], }, escalationPolicyId: { propDefinition: [ pagerduty, "escalationPolicyId", ], }, assigneeIds: { type: "string[]", label: "Assignee IDs", description: "The IDs of the users to assign to the incident. Use a comma-separated list when structured mode is `off` specifying the ids as values. (e.g. `P97DSQO,PWLDHXC,P1M4QLY`)", optional: true, propDefinition: [ pagerduty, "userId", ], }, conferenceBridgeNumber: { propDefinition: [ pagerduty, "incidentConferenceBridgeNumber", ], }, conferenceBridgeUrl: { propDefinition: [ pagerduty, "incidentConferenceBridgeUrl", ], }, }, async run({ $ }) { const { title, serviceId, } = this; const conferenceBridgeNumber = emptyStrToUndefined(this.conferenceBridgeNumber); const conferenceBridgeUrl = emptyStrToUndefined(this.conferenceBridgeUrl); const escalationPolicyId = emptyStrToUndefined(this.escalationPolicyId); const bodyDetails = emptyStrToUndefined(this.bodyDetails); const urgency = emptyStrToUndefined(this.urgency); const incidentKey = emptyStrToUndefined(this.incidentKey); const assigneeIds = commaSeparatedListToArray(this.assigneeIds); const initialProps = { type: constants.INCIDENT_TYPE, title, service: { id: serviceId, type: constants.REFERENCE.SERVICE, }, }; const additionalProps = { urgency, incident_key: incidentKey, body: [ { type: constants.INCIDENT_BODY_TYPE, details: bodyDetails, }, bodyDetails, ], assignments: [ assigneeIds?.map((id) => ({ assignee: { id, type: constants.REFERENCE.USER, }, })), assigneeIds?.length && !escalationPolicyId, ], escalation_policy: [ { id: escalationPolicyId, type: constants.REFERENCE.ESCALATION_POLICY, }, escalationPolicyId, ], conference_bridge: [ { conference_number: conferenceBridgeNumber, conference_url: conferenceBridgeUrl, }, conferenceBridgeNumber || conferenceBridgeUrl, ], }; const toCreate = reduceProperties({ initialProps, additionalProps, }); const { incident } = await this.pagerduty.createIncident({ $, data: { incident: toCreate, }, }); $.export("$summary", `Incident ${incident.summary} has been ${incident.status}`); return incident; }, };