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 ) => {
const fxRate = result . availableCountries [ 1 ]. corridors . find (
2024-10-13 13:45:44 +02:00
( corridors ) => {
return corridors . countryDisplayName == "Nigeria"
}
2024-05-28 02:13:04 +02:00
);
2024-10-13 13:45:44 +02:00
2024-05-28 02:13:04 +02:00
return {
rate : fxRate [ "fxRate" ],
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-14 16:30:19 +01:00
});
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
};