Skip to content
Closed
6 changes: 3 additions & 3 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -94,17 +94,17 @@ class Framework {
}
}

async query({ controller, params, method = "POST" }) {
async query({ controller, params, body, method = "POST" }) {
const { serverUrl, client } = this;
const url = `${serverUrl}/Controllers/${controller}.ashx`;
let result;
if (method === "POST") {
if (typeof params?.toFormData === 'function') {
params = params.toFormData();
}
result = await client.post(url, { form: params });
result = await client.post(url, { form: params, body });
} else {
result = await client({ url, form: params, method });
result = await client({ url, form: params, method, body });
}
if (result.statusCode === 200) {
return result.headers["content-type"].match(/^application\/json/i) ? JSON.parse(result.body) : result.body;
Expand Down
6 changes: 3 additions & 3 deletions lib/sql.js
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ class Sql {
* @param {Object} - parameters
* @param {Object} - isStoredProcedure
*/
async execute({ query, parameters, where, orderBy, isStoredProcedure }) {
async execute({ query, parameters, where, orderBy, isStoredProcedure }) {
query = await this.getQuery(query);
isStoredProcedure = isStoredProcedure === true || !query.match(/SELECT |INSERT |UPDATE |DELETE |SET |DECLARE /i);
try {
Expand All @@ -178,7 +178,7 @@ class Sql {
const result = isStoredProcedure ? await request.execute(query) : await request.query(query);
return { success: true, data: result.recordset, ...result };
} catch (err) {
return { success: false, err, data: {} };
return { success: false, queryException: err, data: {} };
}
}

Expand All @@ -202,7 +202,7 @@ class Sql {
const result = await request.query(statement);
return { success: true, data: result.recordset };
} catch (err) {
return { success: false, err, data: {} };
return { success: false, queryException: err, data: {} };
}
}

Expand Down
99 changes: 98 additions & 1 deletion lib/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,27 @@ import stream from 'stream';
import fs from 'fs';
import prompt from 'prompt';

import FormData from 'form-data';
import { Buffer } from 'buffer';

const macRegex = /([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/

const pipeline = promisify(stream.pipeline);

const env = process.env;
const dataModes = {
json: 1,
formAsJson: "input",
formIndividualValues: 3,
formLegenidValues: 4,
asFile: "file"
};

const defaultTemplate = /\${((\w+)\.)?(\w+)}/gm;

export default {
macRegex,

dataModes,
dateFormat: 'M-D-Y',

dateTimeFormat: 'M-D-Y HH:mm:ss',
Expand Down Expand Up @@ -209,5 +221,90 @@ export default {
const container = g2 ? tags[g2] || {} : tags;
return container[g3] === undefined ? (keepMissingTags ? match : "") : container[g3];
});
},
request: async function ({ uploadUrl, formMode, filename = "file", data, contentType = 'application/json', tokenUrl = null, token = null, tokenParameters = null }) {
for (let trial = 0; trial < 2; trial++) {
if (token === null && tokenUrl) {
token = await this.getToken(tokenUrl, tokenParameters);
}
const headers = {};
if (token) {
headers.Authorization = token ? `Bearer ${this.token}` : "Basic " + Buffer.from(`${env.USER_NAME}:${env.PASSWORD}`).toString("base64");
//headers.ContentType = 'application/json';
headers.Accept = '*/*';
}
let body;
switch (formMode) {
case dataModes.formIndividualValues:
body = new FormData();
{
const keys = data.Legenid;
const values = data.Values[0];
for (const [index, key] of keys.entries()) {
body.append(key, values[index]);
}
}
break;
case dataModes.formAsJson:
body = new FormData();
body.append(dataModes.formAsJson, JSON.stringify(data));
break;
case dataModes.asFile:
body = new FormData();
{
const blob = data ? Buffer.from(JSON.stringify(data)) : fs.createReadStream(filename);
body.append(dataModes.asFile, blob, { filename: filename, contentType: contentType });
if (data) {
for (var key of Object.keys(data)) {
body.append(key, data[key]);
}
}
}
}
try {
const result = await got.post(uploadUrl, {
body,
json: body ? undefined : data,
headers
});

console.error({ status: result.statusCode, body: result.body });
return result;
} catch (error) {
if (error.response) {
if (error.response.statusCode === 403) {
console.error('Token expired.. will retry');
} else {
console.error({ status: error.response.statusCode, body: error.response.body });
break;
}
} else {
console.error(error);
break;
}
}
}
},
getToken: async function (tokenUrl, tokenParameters) {
try {
const result = await got.post(tokenUrl, {
form: tokenParameters
}).json();
return result.access_token;
} catch (error) {
console.error(error.response.body);
return null;
}
},
buildFormData: function (data, formData = new FormData(), parentKey) {
if (data && typeof data === 'object' && !(data instanceof Date) && !(data instanceof Buffer)) {
Object.keys(data).forEach(key => {
this.buildFormData(data[key], formData, parentKey ? `${parentKey}[${key}]` : key);
});
} else {
const value = data == null ? '' : data;
formData.append(parentKey, value);
}
return formData;
}
};