(2024.1) Process Incoming Slack API Calls
This Custom API script was written to process incoming API calls from Slack (a team chat program we use internally at PCR).
<?php
/**
* Type: Custom Logic
* Identifier: helpdesk
*/
// The incoming payload from Slack is JSON encoded
// so we need to decode it...
$payload = json_decode($request["payload"], true);
$user = $payload["user"]["name"];
$callbackId = explode("-",$payload["callback_id"]);
$iconUrl = "https://www.iconexperience.com/_img/v_collection_png/24x24/plain/";
$icon = "error.png";
// find the Contact for this User - using the query function is best with
// bound parameters instead of placing them directly into the query string.
// This protects the database against injection threats
$contacts = $this->query(
"SELECT RECID FROM CONTACTS C
LEFT JOIN V_UDF UDF ON UDF.VALUE_TABLE_NAME = 'CONTACTS' AND C.RECID = VALUE_TABLE_RECID
WHERE UDF.VALUE = :slack_user",
[":slack_user" => "@".$user]
);
if(!empty($contacts)){
// the query function always returns an array
// of rows so we need to look at the first index
$contact = $contacts[0];
$incidents = $this->query(
"SELECT SD.*, D.CODE, L.VALUE AS STATUS
FROM SERVICE_DESK SD
LEFT JOIN DEPT_HIERARCHY D ON SD.D_OWNER_DEPT_HIERARCHY_RECID = D.RECID
LEFT JOIN LISTS L ON SD.SD_STATUS_LISTS_RECID = L.RECID
WHERE SD_NUMBER = :incident",
[":incident" => $callbackId[0]]
);
if(!empty($incidents)){
$incident = $incidents[0];
$workflow = $this->query(
"SELECT SDWF.*, CONCAT(C.LAST_NAME,', ',C.FIRST_NAME) AS WORKER, L.CODE AS STATUS
FROM SERVICE_DESK_WORKFLOW SDWF
LEFT JOIN CONTACTS C ON C.RECID = SDWF.WORKER_CONTACTS_RECID
LEFT JOIN LISTS L ON SDWF.SD_WF_STATUS_LISTS_RECID = L.RECID
WHERE SERVICE_DESK_RECID = :sd_recid AND SDWF.RECID = :recid",
[
":sd_recid" => $incident["RECID"],
":recid" => $callbackId[2]
]
);
if(!empty($workflow)){
$wf = $workflow[0];
if(empty($wf["WORKER"])){
if($wf["STATUS"] == "PENDING"){
if(Core_Model_Api_Servicedesk::assignWorkflow(
$wf["RECID"], $contact["RECID"]
)){
$assigned = "Assigned to @{$user}";
$icon = "checkbox.png";
} else {
$assigned = "Error: Failed to Assign Workflow...";
}
} else {
$assigned = "Error: WF is not Pending...";
}
} else {
$assigned = "WF Already Assigned to {$wf["WORKER"]}";
$icon = "information.png";
}
} else {
$assigned = "Error: Cannot find Workflow {$callbackId[1]} on {$callbackId[0]}...";
}
} else {
$assigned = "Error: Cannot find Incident [{$callbackId[0]}]...";
}
} else {
$assigned = "Error: Cannot find User [{$payload["user"]["name"]}]...";
}
$orig = $payload["original_message"];
// the response array is the data that is returned to the original API request
$response = [
"text" => $orig["text"],
"attachments" => [[
"title" => $orig["attachments"][0]["title"],
"title_link" => $orig["attachments"][0]["title_link"],
"text" => $orig["attachments"][0]["text"],
"footer" => $assigned,
"footer_icon" => $iconUrl.$icon,
"ts" => time(),
]]
];