diff --git a/lib/index.js b/lib/index.js index 98da228..80cfe44 100644 --- a/lib/index.js +++ b/lib/index.js @@ -94,7 +94,7 @@ 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; @@ -102,9 +102,9 @@ class Framework { 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; diff --git a/lib/sql.js b/lib/sql.js index a3a4690..5efa3e9 100644 --- a/lib/sql.js +++ b/lib/sql.js @@ -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 { @@ -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: {} }; } } @@ -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: {} }; } } diff --git a/lib/util.js b/lib/util.js index efd28e9..dd5ddc9 100644 --- a/lib/util.js +++ b/lib/util.js @@ -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', @@ -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; } }; \ No newline at end of file