@sambruca/xe-client
Version:
Node client for interactive with XE API
66 lines • 2.34 kB
JavaScript
import axios from "axios";
import { InvalidCCYError, XERequestError, } from "./types";
import { isValidCCY } from "./currencyCode";
export const xeClient = (xeApiId, xeApiKey) => {
const options = {
auth: {
username: xeApiId,
password: xeApiKey,
},
baseURL: "https://xecdapi.xe.com/v1/",
};
const getRateForDate = async (fromCurrency, toCurrencies, currencyDate) => {
if (!isValidCCY(fromCurrency)) {
return Promise.reject(new InvalidCCYError(fromCurrency));
}
const invalidCCYs = toCurrencies.filter((ccy) => !isValidCCY(ccy));
if (invalidCCYs.length > 0) {
return Promise.reject(new InvalidCCYError(invalidCCYs.join(",")));
}
const path = "historic_rate";
const toParam = toCurrencies.join(",");
const query = {
from: fromCurrency,
to: toParam,
amount: 1,
};
query.date = currencyDate.toISOString().split("T")[0];
try {
const response = await handleXERequest(path, query);
let requestsRemaining = 0;
if (response.headers) {
requestsRemaining = response.headers["x-raterequest-remaining"];
}
const rates = response.data.to.map((t) => {
return {
from: response.data.from,
to: t.quotecurrency,
timestamp: response.data.timestamp,
rate: t.mid,
};
});
return {
rates,
requestsRemaining,
};
}
catch (e) {
console.error(e);
throw new XERequestError(query, path, e);
}
};
const handleXERequest = async (path, query) => {
console.debug(`Performing request to XE ${path} endpoint with query params: ${JSON.stringify(query)}`);
const response = await axios.get(path, {
params: query,
...options,
});
console.debug(`Request complete with status: ${response.status}|${response.statusText}`);
console.debug(`Response data: ${JSON.stringify(response.data)}`);
return response;
};
return {
getRateForDate,
};
};
//# sourceMappingURL=client.js.map