@babak2000ir/navbc-proxy
Version:
Helps connecting to Dynamics NAV / Business Central backend.
149 lines (135 loc) • 6.84 kB
JavaScript
const fetch = require('node-fetch');
const parser = require('xml2json');
const js2xmlparser = require("js2xmlparser");
const { escapeXML } = require('ejs');
const httpntlm = require('httpntlm');
const BaseError = require('@thenavpeople/base-app').BaseError();
const navbcParams = {
"webserviceBaseUrl": "",
"authorizationType": "Basic", //Basic, Ntlm
"username": "",
"password": "",
"domain": "",
"debugMode": false
}
function setParams(navbcParameters) {
navbcParams.webserviceBaseUrl = navbcParameters.webserviceBaseUrl;
navbcParams.authorizationType = 'basic' || navbcParameters.authorizationType;
navbcParams.username = navbcParameters.username;
navbcParams.password = navbcParameters.password;
navbcParams.domain = navbcParameters.domain;
navbcParams.debugMode = false || navbcParameters.debugMode;
}
function navFetch(requestBody, navbcCompany, navbcObject, navbcServiceName, navbcServiceFunction, ignoreSSL) {
return new Promise(function(resolve, reject) {
let url = navbcParams.webserviceBaseUrl + `/WS/${navbcCompany}/${navbcObject}/${navbcServiceName}`;
if (ignoreSSL) {
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
}
var requestHeaders = {
'Content-Type': 'application/xml; charset=utf-8',
'soapaction': `urn:microsoft-dynamics-schemas/${navbcObject}/${navbcServiceName}:${navbcServiceFunction}`
}
switch (navbcParams.authorizationType.toLowerCase()) {
case 'basic':
requestHeaders['authorization'] = 'Basic ' + Buffer.from(`${navbcParams.username}:${navbcParams.password}`).toString("base64");
fetch(url, {
method: 'POST', // *GET, POST, PUT, DELETE, etc.
mode: 'cors', // no-cors, *cors, same-origin
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
//credentials: 'same-origin', // include, *same-origin, omit
headers: requestHeaders,
redirect: 'follow', // manual, *follow, error
referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
body: requestBody
})
.then((response) => {
if (response.ok) {
response.text().then((data) => {
if (navbcParams.debugMode) console.log(`navbc-proxy: Backend Response: ${data}`);
isNavError(data).then(
navError => {
return reject(navError)
},
response => {
return resolve(response)
});
})
.catch((error) => {
return reject(new BaseError(`${error.name}: ${error.message}`, { logLevel: "error", displayType: "standard", severity: "normal" }));
});
} else {
response.text().then(error => {
isNavError(error).then(
navError => {
return reject(navError)
},
error => {
return reject(new BaseError(`${response.statusText}: ${error}`, { logLevel: "error", displayType: "standard", severity: "normal" }));
});
})
}
})
.catch(error => {
return reject(new BaseError(`${error.name}: ${error.message}`, { logLevel: "error", displayType: "standard", severity: "normal" }));
})
break;
case 'ntlm':
httpntlm.post({
url,
username: navbcParams.username,
password: navbcParams.password,
workstation: '',
domain: navbcParams.domain,
body: requestBody,
headers: requestHeaders
},
function(error, response) {
if (error || response.statusCode != 200) {
isNavError(error).then(
navError => {
return reject(navError)
},
error => {
return reject(new BaseError(`${response.statusText}: ${error}`, { logLevel: "error", displayType: "standard", severity: "normal" }));
});
}
isNavError(response.body).then(
navError => {
return reject(navError)
},
response => {
return resolve(response)
});
});
break;
}
});
}
function isNavError(data) {
return new Promise(function(resolve, reject) {
let json = '';
let soapMesage = '';
try {
json = parser.toJson(data, { object: true });
} catch {
return reject(data);
}
if (json['Soap:Envelope']) {
soapMesage = json['Soap:Envelope']['Soap:Body'];
} else if (json['s:Envelope']) {
soapMesage = json['s:Envelope']['s:Body'];
} else {
return reject(data);
}
if (soapMesage['s:Fault']) {
return resolve(new BaseError(`${soapMesage['s:Fault'].faultstring.$t}`, { logLevel: "error", displayType: "standard", severity: "normal" }))
} else if (soapMesage['Soap:Fault']) {
return resolve(new BaseError(`${soapMesage['Soap:Fault'].faultstring.$t}`, { logLevel: "error", displayType: "standard", severity: "normal" }))
} else {
return reject(data);
}
});
}
module.exports.setParams = setParams;
module.exports.navFetch = navFetch;