455 lines
20 KiB
Plaintext
455 lines
20 KiB
Plaintext
<%@ language = "JavaScript" %>
|
|
<% /*
|
|
$Revision$
|
|
$Id$
|
|
|
|
File: zendesk.asp
|
|
|
|
Description: Conversie van xml naar json voor ZENdesk koppeling
|
|
Parameters:
|
|
Context:
|
|
|
|
Notes: Informatie m.b.t. Zendesk API : https://developer.zendesk.com/api-reference/
|
|
*/
|
|
DOCTYPE_Disable = true;
|
|
ANONYMOUS_Allowed = 1;
|
|
%>
|
|
<!-- #include file="../Shared/common.inc" -->
|
|
<!-- #include file="../Shared/save2db.inc" -->
|
|
<!-- #include file="../Shared/Shared.inc" -->
|
|
<!-- #include file="../Shared/xml_converter.inc" -->
|
|
<%
|
|
var ll = getQParamInt("logging", 0);
|
|
if (ll > 0)
|
|
__Logging = ll; // Voor de rest van dit bestand
|
|
|
|
var channel = getQParamSafe("channel", "");
|
|
var xkey = getQParamInt("xkey", -1);
|
|
|
|
function getRequestParams(p_method, p_action, params)
|
|
{
|
|
var errmsg = "";
|
|
var missing_id = false;
|
|
var req_conn = { auth: params.api_auth
|
|
, baseurl: params.base_url
|
|
, ext_url: ""
|
|
, contenttype: "application/json"
|
|
, methode: p_method
|
|
, actie: p_action
|
|
};
|
|
var doel = params.actions[p_action]; // Gebruik hier de parameter uit de aanroep.
|
|
// req_conn.actie wordt gewijzigd bij attachments als params.info.boundary bestaat.
|
|
switch (p_method)
|
|
{
|
|
case "GET": req_conn.ext_url = doel + (params.info.externid ? "/"+params.info.externid : "");
|
|
req_conn.methode = "GET";
|
|
req_conn.actie = p_action;
|
|
req_conn.content = "application/json";
|
|
break;
|
|
case "POST": req_conn.ext_url = doel;
|
|
req_conn.methode = "POST";
|
|
req_conn.actie = p_action;
|
|
req_conn.content = "application/json";
|
|
break;
|
|
case "PUT": missing_id = (params.info.externid ? false : true);
|
|
req_conn.ext_url = doel + "/" + params.info.externid;
|
|
req_conn.methode = "PUT";
|
|
req_conn.actie = p_action;
|
|
req_conn.content = "application/json";
|
|
break;
|
|
default: req_conn.methode = "";
|
|
}
|
|
|
|
if (req_conn.methode == "" || missing_id)
|
|
{
|
|
errmsg = (missing_id ? "unknown id in " : "No method found for executing ") + doel;
|
|
}
|
|
return { success: (errmsg == "")
|
|
, errmsg: errmsg
|
|
, req_conn: req_conn
|
|
}
|
|
}
|
|
|
|
function doRequest(req_conn, req_data)
|
|
{
|
|
var request_result = { success: false
|
|
, status: -1
|
|
, errmsg: ""
|
|
, data: {}
|
|
}
|
|
try
|
|
{
|
|
var http_request = Server.CreateObject("WinHTTP.WinHTTPRequest.5.1");
|
|
http_request.open(req_conn.methode, req_conn.baseurl + req_conn.ext_url, false); // Synchroon
|
|
switch (req_conn.methode)
|
|
{
|
|
case "POST": var body_data = req_data;
|
|
http_request.setRequestHeader("Authorization", req_conn.auth);
|
|
http_request.setRequestHeader("Accept", "application/json");
|
|
http_request.setRequestHeader("Content-Type", req_conn.content);
|
|
http_request.send(JSON.stringify(body_data));
|
|
break;
|
|
case "PUT": var body_data = req_data;
|
|
http_request.setRequestHeader("Authorization", req_conn.auth);
|
|
http_request.setRequestHeader("Accept", "application/json");
|
|
http_request.setRequestHeader("Content-Type", req_conn.content);
|
|
http_request.send(JSON.stringify(body_data));
|
|
break;
|
|
case "GET": http_request.setRequestHeader("Authorization", req_conn.auth);
|
|
http_request.setRequestHeader("Accept", "application/json");
|
|
http_request.send();
|
|
break;
|
|
}
|
|
//
|
|
request_result.status = http_request.status;
|
|
var status_ok = [200,201,204,206];
|
|
if (inArray(request_result.status, status_ok))
|
|
{ // Request is goed verlopen.
|
|
request_result.success = true;
|
|
request_result.data = (http_request.responseText ? JSON.parse( http_request.responseText) : {});
|
|
}
|
|
else
|
|
{ // De tekst van de foutstatus.
|
|
var response_error = (http_request.responseText ? JSON.parse( http_request.responseText) : {});
|
|
request_result.errmsg = http_request.statusText
|
|
+ ": " + response_error.error.title + " (" + response_error.error.message + ")";
|
|
}
|
|
}
|
|
catch (e)
|
|
{ // Het gaat al fout bij het maken van de request.
|
|
request_result.status = 602;
|
|
request_result.errmsg = "Request connection error: " + e.description;
|
|
}
|
|
return request_result;
|
|
}
|
|
|
|
function call_zendesk(coupler, data_to_sent)
|
|
{
|
|
var bevinding = {};
|
|
if (coupler.info.method != 'NONE')
|
|
{
|
|
var conn_params = getRequestParams(coupler.info.method, coupler.info.action, coupler);
|
|
if (conn_params.success)
|
|
{
|
|
if (debug)
|
|
{
|
|
__Log({"conn_params": conn_params});
|
|
__Log({"doRequest": {"req_conn": conn_params.req_conn, "data_to_sent": data_to_sent}});
|
|
bevinding = { result: { success: true
|
|
, status: 200
|
|
, message: ""
|
|
}
|
|
, data: {ticket: {custom_fields: {}, fields: {}, audit: {}}}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var conn_result = doRequest(conn_params.req_conn, data_to_sent);
|
|
if (conn_result.success)
|
|
{
|
|
bevinding = { result: { success: true
|
|
, status: conn_result.status
|
|
, message: conn_result.errmsg
|
|
}
|
|
, data: conn_result.data
|
|
};
|
|
}
|
|
else
|
|
{ // Een foutmelding van request of een algemene fout.
|
|
bevinding = { result: { success: false
|
|
, status: conn_result.status
|
|
, message: conn_result.errmsg
|
|
}};
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{ // Er is iets fout gegaan met het maken van de request parameters.
|
|
bevinding = { result: { success: false
|
|
, status: 601
|
|
, message: conn_params.errmsg
|
|
}};
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bevinding = { result: { success: true
|
|
, status: 200
|
|
, message: "er hoeft geen bericht verstuurd te worden"
|
|
}};
|
|
}
|
|
return bevinding;
|
|
}
|
|
|
|
function encryptAuth(api_user, api_key)
|
|
{
|
|
var oCrypto = new ActiveXObject("SLNKDWF.Crypto");
|
|
var encoded = "Basic " + oCrypto.base64(api_user + "/token:" + api_key);
|
|
return encoded;
|
|
}
|
|
|
|
function cloneObject(obj)
|
|
{
|
|
var cloned_obj = JSON.parse(JSON.stringify(obj));
|
|
return cloned_obj;
|
|
}
|
|
|
|
function load_headerdata()
|
|
{
|
|
__Log("load_headerdata");
|
|
// Lees de xml-data uit de html-header.
|
|
var xmlReq = Server.CreateObject("MSXML2.DOMDocument.6.0");
|
|
xmlReq.load(Request);
|
|
// Converteer de xml naar json-dataobject.
|
|
var objreq = xmlToJson(xmlReq);
|
|
return objreq.facilitor;
|
|
}
|
|
|
|
function test_loader()
|
|
{
|
|
__Log("TEST_LOADER");
|
|
function loadMSXML(x)
|
|
{
|
|
var fso = new ActiveXObject("Scripting.FileSystemObject");
|
|
var file_ext = x.file.slice(-4);
|
|
var ForReading = 1;
|
|
var f1 = fso.OpenTextFile(x.file, ForReading );
|
|
var text = f1.ReadAll();
|
|
f1.Close();
|
|
if ((text.substr(0,14) != "<?xml version=") && (file_ext == ".xml"))
|
|
{ // Bij ontbreken van encoding in de xml-file treedt de fout
|
|
// "An invalid character was found in the text content"
|
|
// op als er diakritische tekens in het xml-bestand staan.
|
|
// Voeg daarom encoding toe.
|
|
text = "<?xml version='1.0' encoding='windows-1250'?>" + "\n\r" + text;
|
|
}
|
|
|
|
x.doc = new ActiveXObject("MSXML2.DOMDocument.6.0");
|
|
x.doc.async = false;
|
|
x.doc.loadXML(text);
|
|
x.err_code = x.doc.parseError.errorCode;
|
|
x.err_msg = (x.doc.parseError.errorCode != 0 ? x.doc.parseError.reason : "");
|
|
return x;
|
|
}
|
|
|
|
var custpath = "../../CUST/WELK";
|
|
var loader = { success: false
|
|
, status: -1
|
|
, xml: { file: Server.MapPath(custpath + "/xsl/" + "puo_20250205-163742_00_make_xml.xml") }
|
|
, xsl: { file: Server.MapPath(custpath + "/xsl/" + "zendesk.xsl") }
|
|
};
|
|
loader.xml = loadMSXML(loader.xml);
|
|
loader.xsl = loadMSXML(loader.xsl);
|
|
loader.success = (loader.xml.err_code == 0 && loader.xsl.err_code == 0);
|
|
__Log( {"load_err": { "xml": {"path": loader.xml.file, "code":loader.xml.err_code, "msg":loader.xml.err_msg}
|
|
, "xsl": {"path": loader.xsl.file, "code":loader.xsl.err_code, "msg":loader.xsl.err_msg}
|
|
}
|
|
});
|
|
|
|
var result = { success: false
|
|
, status: (loader.xml.err_code != 0 ? loader.xml.err_code : loader.xsl.err_code)
|
|
, message: (loader.xml.err_code != 0 ? loader.xml.err_msg : loader.xsl.err_msg)
|
|
, data: {}
|
|
}
|
|
if (loader.success)
|
|
{
|
|
var transform = new ActiveXObject("MSXML2.DOMDocument.6.0");
|
|
transform.async = false;
|
|
transform.validateOnParse = true;
|
|
loader.xml.doc.transformNodeToObject(loader.xsl.doc, transform);
|
|
//__Log(transform.documentElement.xml);
|
|
result = { success: (transform.parseError.errorCode == 0)
|
|
, status: transform.parseError.errorCode
|
|
, message: (transform.parseError.errorCode != 0 ? transform.parseError.reason : "")
|
|
}
|
|
if (result.success)
|
|
{
|
|
var obj = xmlToJson(transform);
|
|
delete obj.xml;
|
|
result.data = obj;
|
|
}
|
|
}
|
|
//__Log(result);
|
|
return result.data.facilitor;
|
|
}
|
|
|
|
function getTypeOf(value)
|
|
{
|
|
if (typeof value === "string" || value instanceof String) return "isString";
|
|
if (typeof value === "number" && isFinite(value)) return "isNumber";
|
|
if (typeof value === "boolean") return "isBoolean";
|
|
if (typeof value === "symbol") return "isSymbol";
|
|
if (typeof value === "undefined") return "isUndefined";
|
|
if (typeof value === "function") return "isFunction";
|
|
if (value === null) return "isNull";
|
|
if (value && typeof value === "object" && value.constructor === Array) return "isArray";
|
|
if (value && typeof value === "object" && value.constructor === Object) return "isObject";
|
|
if (value && typeof value === "object" && value.constructor === RegExp) return "isRegExp";
|
|
if (value instanceof Error && typeof value.message !== "undefined") return "isError";
|
|
if (value instanceof Date) return "isDate";
|
|
return "isUnknown";
|
|
}
|
|
|
|
function fieldlist_to_array(p_fieldlist)
|
|
{
|
|
var v_field_arr = [];
|
|
for (var fld_name in p_fieldlist)
|
|
{
|
|
var v_field_obj = p_fieldlist[fld_name];
|
|
v_field_arr.push(v_field_obj);
|
|
}
|
|
return v_field_arr;
|
|
}
|
|
|
|
function getTicket(p_data)
|
|
{
|
|
var v_data = {};
|
|
v_data.ticket = cloneObject(p_data.opdracht);
|
|
// custom_fields moet een array worden.
|
|
v_data.ticket.custom_fields = fieldlist_to_array(v_data.ticket.custom_fields);
|
|
return v_data;
|
|
}
|
|
|
|
function getTicketComment(p_data, p_key, p_request)
|
|
{
|
|
var v_notities = cloneObject(p_data.notities);
|
|
var user_request = cloneObject(p_request);
|
|
user_request.info = { method: "POST"
|
|
, action: "upsert_user"
|
|
};
|
|
if (getTypeOf(v_notities) != "isArray")
|
|
v_notities = [v_notities];
|
|
var v_notitie = { result: { success: false
|
|
, status: 610
|
|
, message: "No comment found"
|
|
}
|
|
};
|
|
for (var i=0; i<v_notities.length; i++)
|
|
{
|
|
if (v_notities[i].key == p_key)
|
|
{
|
|
v_notitie.ticket = v_notities[i];
|
|
if (getTypeOf(v_notitie.ticket.comment.author_id.lookup.user.email) != "isString")
|
|
{ // Verwijderen email als deze leeg is.
|
|
delete v_notitie.ticket.comment.author_id.lookup.user.email;
|
|
}
|
|
delete v_notitie.ticket.key; // Deze heb je alleen nodig voor het vinden van de juiste notitie. Mag nu weg.
|
|
// user gegevens vervangen door user-id van Zendesk.
|
|
var user_data_to_sent = v_notitie.ticket.comment.author_id.lookup;
|
|
var user_result = call_zendesk(user_request, user_data_to_sent);
|
|
v_notitie.result = user_result.result;
|
|
if (user_result.result.success)
|
|
{ // De notitie kan nu verstuurd worden.
|
|
v_notitie.ticket.comment.author_id = user_result.data.user.id;
|
|
}
|
|
}
|
|
}
|
|
return v_notitie;
|
|
}
|
|
|
|
function update_mldopdr(methode, actie, ticket)
|
|
{
|
|
if (methode == "POST" && actie)
|
|
{
|
|
var sql = "UPDATE mld_opdr"
|
|
+ " SET mld_opdr_externnr = " + ticket.id
|
|
+ " WHERE mld_opdr_key = " + ticket.external_id;
|
|
Oracle.Execute(sql);
|
|
}
|
|
}
|
|
|
|
// *************************************************************************
|
|
// *************************************************************************
|
|
__Log("*> ZENdesk.api channel="+channel+" xkey="+xkey);
|
|
var actions = { "ticket": "/api/v2/tickets"
|
|
, "request": "/api/v2/requests"
|
|
, "brand": "/api/v2/brands"
|
|
, "organization": "/api/v2/organizations"
|
|
, "group": "/api/v2/groups"
|
|
, "upsert_user": "/api/v2/users/create_or_update"
|
|
// nieuwe ticket versturen
|
|
// POST /api/v2/tickets.json
|
|
// met data: {"ticket": {"subject": "My printer is on fire!", "comment": { "body": "The smoke is very colorful." }}}
|
|
//
|
|
// notities worden aan een ticket toegevoegd als comments in het ticket:
|
|
// PUT /api/v2/tickets/{id}.json
|
|
// met data: {"ticket": {"comment": {"body": "de notitie tekst", "author_id": 12345678}}}
|
|
//
|
|
// bijlagen
|
|
// POST /api/v2/uploads?filename=<bestandsnaam>&token=<optional_token>
|
|
}
|
|
|
|
var debug = false;
|
|
var facilitor = (debug ? test_loader() : load_headerdata());
|
|
__Log(facilitor);
|
|
var bevinding = {};
|
|
|
|
if (facilitor && facilitor.zendesk)
|
|
{
|
|
var v_data = facilitor.zendesk.data;
|
|
var v_request = facilitor.zendesk.request;
|
|
v_request.api_auth = encryptAuth(v_request.api_user, v_request.api_key);
|
|
v_request.actions = actions;
|
|
|
|
switch (channel)
|
|
{
|
|
case "ORD": var data_to_sent = getTicket(v_data);
|
|
bevinding = call_zendesk(v_request, data_to_sent);
|
|
if (bevinding.result.success)
|
|
{
|
|
var data_received = bevinding.data;
|
|
delete data_received.ticket.custom_fields; // bevat alleen lege velden
|
|
delete data_received.ticket.fields; // bevat alleen lege velden
|
|
delete data_received.audit; // nu niet nodig maar bevat misschien wel nuttige informatie
|
|
delete bevinding.data;
|
|
bevinding.ticket = data_received.ticket;
|
|
}
|
|
bevinding.attach = "";
|
|
|
|
update_mldopdr(v_request.info.method, v_request.info.action, bevinding.ticket);
|
|
break;
|
|
case "NOT": var bevinding = getTicketComment(v_data, xkey, v_request);
|
|
if (bevinding.result.success)
|
|
{
|
|
var data_to_sent = bevinding.ticket;
|
|
bevinding = call_zendesk(v_request, data_to_sent);
|
|
if (bevinding.result.success)
|
|
{
|
|
var data_received = bevinding.data;
|
|
delete data_received.ticket.custom_fields; // bevat alleen lege velden
|
|
delete data_received.ticket.fields; // bevat alleen lege velden
|
|
delete bevinding.data;
|
|
bevinding.comment = data_received.ticket;
|
|
}
|
|
bevinding.attach = "**"
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{ // Ongeldige json-data
|
|
bevinding = { result: { success: false
|
|
, status: 600
|
|
, message: "ongeldige invoer"
|
|
}};
|
|
}
|
|
|
|
if (bevinding.result.success)
|
|
{ // Afhandelen terug gekregen info
|
|
|
|
}
|
|
|
|
if (bevinding.result.message != "")
|
|
{ // Een serieuze fout nadrukkelijk in de logging zetten.
|
|
__DoLog( safe.html(bevinding.result.status + ": " + bevinding.result.message)
|
|
, (bevinding.result.success ? "" : "#ff0000")
|
|
);
|
|
}
|
|
|
|
__Log({"Bevinding:": bevinding});
|
|
__Log("*< ZENdesk.api");
|
|
Response.Write(JSON.stringify(bevinding));
|
|
Response.End;
|
|
%>
|
|
<% ASPPAGE_END(); %>
|