Files
personal-site/pages/api/v1/rates.js
T

292 lines
11 KiB
JavaScript
Raw Normal View History

2023-12-14 11:48:37 +01:00
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
2024-05-28 02:13:04 +02:00
const { exec } = require("child_process");
2024-01-17 12:32:46 +01:00
2023-12-14 11:48:37 +01:00
export default async (req, res) => {
2024-05-28 02:13:04 +02:00
let rates = [];
2023-12-14 11:48:37 +01:00
2024-05-28 02:13:04 +02:00
var myHeaders = new Headers();
myHeaders.append("authority", "api.taptapsend.com");
myHeaders.append("accept", "*/*");
myHeaders.append("accept-language", "en-GB,en-US;q=0.9,en;q=0.8");
myHeaders.append("appian-version", "web/2022-05-03.0");
myHeaders.append("origin", "https://www.taptapsend.com");
myHeaders.append("referer", "https://www.taptapsend.com/");
myHeaders.append(
"sec-ch-ua",
'"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"'
);
myHeaders.append("sec-ch-ua-mobile", "?0");
myHeaders.append("sec-ch-ua-platform", '"macOS"');
myHeaders.append("sec-fetch-dest", "empty");
myHeaders.append("sec-fetch-mode", "cors");
myHeaders.append("sec-fetch-site", "same-site");
myHeaders.append(
"user-agent",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
);
myHeaders.append("x-device-id", "web");
myHeaders.append("x-device-model", "web");
2024-10-13 13:45:44 +02:00
myHeaders.append("Cookie", "SESSION=NTI4ZGZmOGEtZGZkNS00ZGUwLWE2MmYtMDA4OWNjZGZlZjkx");
2023-12-14 11:48:37 +01:00
2024-10-13 13:45:44 +02:00
var taptapRequestOptions = {
2024-05-28 02:13:04 +02:00
method: "GET",
headers: myHeaders,
redirect: "follow",
};
2023-12-14 11:48:37 +01:00
2024-05-28 02:13:04 +02:00
const tap_call = fetch(
"https://api.taptapsend.com/api/fxRates",
2024-10-13 13:45:44 +02:00
taptapRequestOptions
2024-05-28 02:04:32 +02:00
)
2024-05-28 02:13:04 +02:00
.then((response) => response.json())
.then((result) => {
2024-12-21 19:04:35 +01:00
const nlRates = result.availableCountries.find((availableCountry) => {
return availableCountry.isoCountryCode == "NL"
}
2024-05-28 02:13:04 +02:00
);
2024-12-21 19:04:35 +01:00
let fxRate = 0
if (nlRates) {
for (let corrridor of nlRates.corridors) {
if (corrridor["isoCountryCode"] === "NG") {
fxRate = corrridor["fxRate"]
break
};
}
}
2024-10-13 13:45:44 +02:00
2024-05-28 02:13:04 +02:00
return {
2024-12-21 19:04:35 +01:00
rate: fxRate,
2024-05-28 02:13:04 +02:00
provider: "TapTap",
bestRate: false,
href: "https://www.taptapsend.com/",
};
})
2024-10-13 13:45:44 +02:00
.catch((error) => {
return {
rate: 0,
provider: "TapTap",
bestRate: false,
href: "https://www.taptapsend.com/",
}
});
2024-05-28 02:13:04 +02:00
var myHeaders = new Headers();
myHeaders.append("authority", "sendgateway.myflutterwave.com");
myHeaders.append("accept", "application/json, text/plain, */*");
myHeaders.append("accept-language", "en-GB,en-US;q=0.9,en;q=0.8");
myHeaders.append("origin", "https://send.flutterwave.com");
myHeaders.append("referer", "https://send.flutterwave.com/");
myHeaders.append(
"sec-ch-ua",
'"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"'
);
myHeaders.append("sec-ch-ua-mobile", "?0");
myHeaders.append("sec-ch-ua-platform", '"macOS"');
myHeaders.append("sec-fetch-dest", "empty");
myHeaders.append("sec-fetch-mode", "cors");
myHeaders.append("sec-fetch-site", "cross-site");
myHeaders.append(
"user-agent",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
);
var requestOptions = {
method: "GET",
headers: myHeaders,
redirect: "follow",
};
const send_call = fetch(
"https://sendgateway.myflutterwave.com/api/v1/config/getcurrencyrate?fromCurrency=EUR&toCurrency=NGN",
requestOptions
)
.then((response) => response.json())
.then((response) => {
return {
rate: parseFloat(response.data[0].baseRate).toFixed(2),
provider: "Send",
bestRate: false,
href: "https://send.flutterwave.com/",
};
})
.catch((error) => console.log("error", error));
2024-08-11 08:11:50 +02:00
const curlCommand = `curl -v 'https://acemoneytransfer.com/make-request' \
2024-07-17 19:27:51 +02:00
-H 'authority: acemoneytransfer.com' \
-H 'accept: */*' \
-H 'accept-language: en-GB,en-US;q=0.9,en;q=0.8' \
-H 'content-type: application/x-www-form-urlencoded; charset=UTF-8' \
-H 'origin: https://acemoneytransfer.com' \
-H 'referer: https://acemoneytransfer.com/Nigeria/Send-Money-to-Nigeria' \
-H 'sec-ch-ua: "Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "macOS"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: same-origin' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' \
-H 'x-requested-with: XMLHttpRequest' \
--data-raw 'uri=rate%2Fcalculator&type=POST&data%5Bsrc_amount%5D=100&data%5Bdest_amount%5D=&data%5Buser_currency%5D=EUR&data%5Bcalculation_mode%5D=S&data%5Bdest_iso_numeric_code%5D=566&data%5Bsrc_iso_numeric_code%5D=528'
2024-05-28 02:13:04 +02:00
`;
const ace_call = new Promise((resolve, reject) => {
exec(curlCommand, (error, stdout, stderr) => {
if (error) {
reject(`Error: ${error.message}`);
}
2024-08-11 08:11:50 +02:00
exec("curl --version", (error, stdout, stderr) => console.log(`Curl Version ${stdout}`))
2024-05-28 02:13:04 +02:00
try {
const parsed_rate = JSON.parse(stdout);
resolve({
rate: parseFloat(parsed_rate.data.exchange_rate).toFixed(2),
provider: "Ace Transfer",
bestRate: false,
});
} catch (parseError) {
reject(parseError.message);
}
});
})
.then((result) => {
return {
rate: parseFloat(result.rate).toFixed(2),
provider: "Ace Transfer",
bestRate: false,
href: "https://acemoneytransfer.com/referral-link/3056004",
};
})
2024-08-11 08:11:50 +02:00
.catch((error) => {
console.error("Error Calling Ace>>>", error);
2024-05-28 02:13:04 +02:00
return {
rate: 0.0,
provider: "Ace Transfer",
bestRate: false,
href: "https://acemoneytransfer.com/referral-link/3056004",
};
});
const remitly_call = new Promise((resolve, reject) => {
2024-10-13 13:45:44 +02:00
fetch("https://api.remitly.io/v5/pricing/estimates?amount=1%20EUR&anchor=SEND&conduit=NLD%3AEUR-NGA%3ANGN&purpose=OTHER", {
2024-07-18 06:58:26 +02:00
"headers": {
"accept": "application/json",
},
"referrerPolicy": "no-referrer",
"body": null,
"method": "GET",
"mode": "cors",
"credentials": "omit"
}).then(result => resolve(result.json())).catch(error => reject(error));
2024-05-28 02:13:04 +02:00
})
.then((result) => {
2024-08-11 08:11:50 +02:00
// console.log("Remitly<<<<<<<", result)
2024-05-28 02:13:04 +02:00
return {
2024-10-04 09:59:27 +02:00
rate: parseFloat(result[0].exchange_rate_info.base_rate).toFixed(2),
2024-05-28 02:13:04 +02:00
provider: "Remitly",
bestRate: false,
href: "https://remit.ly/94fqcne9",
};
})
.catch((error) => {
2024-08-11 08:11:50 +02:00
console.error("Error Calling Remitly>>>", error);
2024-05-28 02:13:04 +02:00
return {
rate: 0.0,
provider: "Ace Transfer",
bestRate: false,
href: "https://remit.ly/94fqcne9",
};
});
2024-07-17 19:27:51 +02:00
const nalaHeaders = new Headers();
2024-10-13 13:45:44 +02:00
nalaHeaders.append("accept", "*/*");
nalaHeaders.append("accept-language", "en-GB,en;q=0.9,nl-NL;q=0.8,nl;q=0.7,en-US;q=0.6");
nalaHeaders.append("origin", "https://www.nala.com");
nalaHeaders.append("priority", "u=1, i");
nalaHeaders.append("referer", "https://www.nala.com/");
nalaHeaders.append("sec-ch-ua", "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"");
nalaHeaders.append("sec-ch-ua-mobile", "?0");
nalaHeaders.append("sec-ch-ua-platform", "\"macOS\"");
nalaHeaders.append("sec-fetch-dest", "empty");
nalaHeaders.append("sec-fetch-mode", "cors");
nalaHeaders.append("sec-fetch-site", "cross-site");
nalaHeaders.append("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36");
2024-05-28 02:13:04 +02:00
2024-07-17 19:27:51 +02:00
const nalaCall = new Promise((resolve, reject) => {
2024-07-18 06:58:26 +02:00
fetch("https://partners-api.prod.nala-api.com/v1/fx/rates", {
method: "GET",
headers: nalaHeaders,
redirect: "follow"
})
.then((response) => resolve(response.json()))
2024-07-17 19:27:51 +02:00
.catch((error) => reject(error));
2024-05-28 02:13:04 +02:00
})
.then((result) => {
2024-11-10 05:32:27 +01:00
const nalaRates = result.data.find(
(data) => {
2024-11-25 09:58:58 +01:00
return data.source_currency === "EUR" && data.destination_currency === "NGN" && data.provider_name === "nala"
2024-11-10 05:32:27 +01:00
}
)
// console.log("NALA<<<<<<<", nalaRates)
2024-05-28 02:13:04 +02:00
return {
2024-11-10 05:32:27 +01:00
rate: parseFloat(nalaRates.rate).toFixed(2),
2024-07-17 19:27:51 +02:00
provider: "Nala",
2024-05-28 02:13:04 +02:00
bestRate: false,
2024-07-17 19:27:51 +02:00
href: "https://join.iwantnala.com/JESSE-715106",
2024-05-28 02:13:04 +02:00
};
})
.catch((error) => {
2024-07-17 19:27:51 +02:00
console.error("Error Calling Nala>>>", error);
2024-05-28 02:13:04 +02:00
return {
rate: 0.0,
2024-07-17 19:27:51 +02:00
provider: "Nala",
2024-05-28 02:13:04 +02:00
bestRate: false,
2024-07-17 19:27:51 +02:00
href: "https://join.iwantnala.com/JESSE-715106",
2024-05-28 02:13:04 +02:00
};
});
await Promise.all([
ace_call,
send_call,
tap_call,
remitly_call,
2024-07-17 19:27:51 +02:00
nalaCall,
2024-05-28 02:13:04 +02:00
])
.then(
([
ace_reponse,
send_response,
tap_response,
remitly_response,
2024-07-17 19:27:51 +02:00
nala_response,
2024-05-28 02:13:04 +02:00
]) => {
rates = [
ace_reponse,
send_response,
tap_response,
remitly_response,
2024-07-17 19:27:51 +02:00
nala_response,
2024-05-28 02:13:04 +02:00
];
}
)
.catch((error) => {
console.error(error);
});
const maxRateIndex = rates.reduce(
(maxIndex, currentObject, currentIndex, array) => {
const currentRate = parseFloat(currentObject.rate);
const maxRate = parseFloat(array[maxIndex].rate);
return currentRate > maxRate ? currentIndex : maxIndex;
},
0
);
rates.forEach((object, index) => {
object.bestRate = index === maxRateIndex;
});
2024-01-13 14:52:01 +01:00
2024-08-11 08:11:50 +02:00
rates = rates.filter(rate => rate.rate > 0)
2024-05-28 02:13:04 +02:00
return res.status(200).json(rates);
2023-12-14 11:48:37 +01:00
};