-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpostNewPaymentExternalAPI.js
More file actions
105 lines (76 loc) · 3.54 KB
/
postNewPaymentExternalAPI.js
File metadata and controls
105 lines (76 loc) · 3.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//@ts-check
const parameters = require('./parameters');
const axios = require('axios').default;
const readArkomXMLResponse = require('./readArkomXMLResponse');
const { orderXMLArray, extractXMLValueAndFormatForRequest, formatAsXMLSOAPBody, formatAsXMLField, mapArrayOfFieldsToXML, getAxiosConfig } = require('./utils');
const { apiPayloadDetails, needsToProvideCVVAndIsraeliID } = parameters;
const { staticParameters, dynamicParameters, emptyFields } = apiPayloadDetails;
const TransactionIDsAndTeudaNums = require('./TransactionIDsAndTeudaNums');
const isDevelopment = process.env.NODE_ENV === 'development';
module.exports = async ({ Payments, CreditTerms, Addendum1, PAN, CVV2, Expiry, ID, TransSum, Addendum1Settl }) => {
let TransactionID = '';
try {
const response = await getNewTransactionID();
TransactionID = await readArkomXMLResponse(response, 'transactionID');
if (!TransactionID) throw new Error('failed to get new transaction ID');
TransactionIDsAndTeudaNums.add({ Addendum1, TransactionID });
} catch (error) {
throw new Error('failed to get new transaction ID');
}
const input = prepareInputObject({ Addendum1, Addendum1Settl, PAN, Expiry, TransSum, Payments, CreditTerms, CVV2, ID, TransactionID });
const allFieldsMapped = getArrayOfMappedFieldsToValues(input);
const allFieldsMappedAndSorted = orderXMLArray(allFieldsMapped);
const allFieldsFormattedToXML = extractXMLValueAndFormatForRequest(allFieldsMappedAndSorted);
const body = formatAsXMLSOAPBody(allFieldsFormattedToXML);
const axiosConfig = getAxiosConfig(body);
const res = await axios(axiosConfig);
if (res.status !== 200) throw new Error('response not ok' + res.statusText);
// if (isDevelopment){
// throw new Error(parameters.axiosErrorMessages.timeout);
// }
return res.data;
};
async function getNewTransactionID() {
const arrayOfFieldsToXML = [
{ xml: formatAsXMLField('TerminalNum', staticParameters.TerminalNUM) },
{ xml: formatAsXMLField('Password', staticParameters.Password) },
{ xml: formatAsXMLField('TransactionID') },
];
const allFieldsFormattedToXML = extractXMLValueAndFormatForRequest(arrayOfFieldsToXML);
const body = formatAsXMLSOAPBody(allFieldsFormattedToXML, 'MTS_GetTransactionID');
const axiosConfig = getAxiosConfig(body);
const res = await axios.request(axiosConfig);
if (res.status !== 200) throw new Error('response not ok' + res.statusText);
return res.data;
}
function prepareInputObject({ Addendum1, Addendum1Settl, PAN, Expiry, TransSum, Payments, CreditTerms, CVV2, ID, TransactionID }) {
if (!Addendum1) {
throw new Error('illegal body, missing Addendum');
}
const input = {
Addendum1,
Addendum1Settl,
PAN,
Expiry,
TransactionID,
TransSum,
Payments: Payments ?? dynamicParameters.Payments,
CreditTerms: CreditTerms ?? dynamicParameters.CreditTerms,
CVV2: CVV2 ?? dynamicParameters.CVV2,
ID: ID ?? dynamicParameters.ID,
};
if (needsToProvideCVVAndIsraeliID) {
if (!CVV2 || !ID) {
throw new Error('illegal body, missing CVV2 or ID');
}
input.CVV2 = CVV2;
input.ID = ID;
}
return input;
}
function getArrayOfMappedFieldsToValues(input) {
const emptyFieldsFormatted = mapArrayOfFieldsToXML({ fields: emptyFields, objectKeys: false, store: {} });
const staticParametersFormatted = mapArrayOfFieldsToXML({ fields: Object.keys(staticParameters), objectKeys: true, store: staticParameters });
const inputFieldsFormatted = mapArrayOfFieldsToXML({ fields: Object.keys(input), objectKeys: true, store: input });
return [...inputFieldsFormatted, ...staticParametersFormatted, ...emptyFieldsFormatted];
}