|
|
|
@ -64,11 +64,12 @@ export class ExchangeRateDataService {
|
|
|
|
|
} = {};
|
|
|
|
|
|
|
|
|
|
for (let currency of currencies) {
|
|
|
|
|
exchangeRatesByCurrency[currency] = await this.getExchangeRates({
|
|
|
|
|
startDate,
|
|
|
|
|
currencyFrom: currency,
|
|
|
|
|
currencyTo: targetCurrency
|
|
|
|
|
});
|
|
|
|
|
exchangeRatesByCurrency[`${currency}${targetCurrency}`] =
|
|
|
|
|
await this.getExchangeRates({
|
|
|
|
|
startDate,
|
|
|
|
|
currencyFrom: currency,
|
|
|
|
|
currencyTo: targetCurrency
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
let previousExchangeRate = 1;
|
|
|
|
|
|
|
|
|
@ -82,17 +83,25 @@ export class ExchangeRateDataService {
|
|
|
|
|
let dateString = format(date, DATE_FORMAT);
|
|
|
|
|
|
|
|
|
|
// Check if the exchange rate for the current date is missing
|
|
|
|
|
if (isNaN(exchangeRatesByCurrency[currency][dateString])) {
|
|
|
|
|
if (
|
|
|
|
|
isNaN(
|
|
|
|
|
exchangeRatesByCurrency[`${currency}${targetCurrency}`][dateString]
|
|
|
|
|
)
|
|
|
|
|
) {
|
|
|
|
|
// If missing, fill with the previous exchange rate
|
|
|
|
|
exchangeRatesByCurrency[currency][dateString] = previousExchangeRate;
|
|
|
|
|
exchangeRatesByCurrency[`${currency}${targetCurrency}`][dateString] =
|
|
|
|
|
previousExchangeRate;
|
|
|
|
|
|
|
|
|
|
Logger.error(
|
|
|
|
|
`No exchange rate has been found for ${DEFAULT_CURRENCY}${currency} at ${dateString}`,
|
|
|
|
|
'ExchangeRateDataService'
|
|
|
|
|
);
|
|
|
|
|
if (currency === DEFAULT_CURRENCY) {
|
|
|
|
|
Logger.error(
|
|
|
|
|
`No exchange rate has been found for ${currency}${targetCurrency} at ${dateString}`,
|
|
|
|
|
'ExchangeRateDataService'
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// If available, update the previous exchange rate
|
|
|
|
|
previousExchangeRate = exchangeRatesByCurrency[currency][dateString];
|
|
|
|
|
previousExchangeRate =
|
|
|
|
|
exchangeRatesByCurrency[`${currency}${targetCurrency}`][dateString];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -136,24 +145,20 @@ export class ExchangeRateDataService {
|
|
|
|
|
getYesterday()
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (Object.keys(result).length !== this.currencyPairs.length) {
|
|
|
|
|
// Load currencies directly from data provider as a fallback
|
|
|
|
|
// if historical data is not fully available
|
|
|
|
|
const quotes = await this.dataProviderService.getQuotes({
|
|
|
|
|
items: this.currencyPairs.map(({ dataSource, symbol }) => {
|
|
|
|
|
return { dataSource, symbol };
|
|
|
|
|
}),
|
|
|
|
|
requestTimeout: ms('30 seconds')
|
|
|
|
|
});
|
|
|
|
|
const quotes = await this.dataProviderService.getQuotes({
|
|
|
|
|
items: this.currencyPairs.map(({ dataSource, symbol }) => {
|
|
|
|
|
return { dataSource, symbol };
|
|
|
|
|
}),
|
|
|
|
|
requestTimeout: ms('30 seconds')
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
for (const symbol of Object.keys(quotes)) {
|
|
|
|
|
if (isNumber(quotes[symbol].marketPrice)) {
|
|
|
|
|
result[symbol] = {
|
|
|
|
|
[format(getYesterday(), DATE_FORMAT)]: {
|
|
|
|
|
marketPrice: quotes[symbol].marketPrice
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
for (const symbol of Object.keys(quotes)) {
|
|
|
|
|
if (isNumber(quotes[symbol].marketPrice)) {
|
|
|
|
|
result[symbol] = {
|
|
|
|
|
[format(getYesterday(), DATE_FORMAT)]: {
|
|
|
|
|
marketPrice: quotes[symbol].marketPrice
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -253,6 +258,7 @@ export class ExchangeRateDataService {
|
|
|
|
|
`No exchange rate has been found for ${aFromCurrency}${aToCurrency}`,
|
|
|
|
|
'ExchangeRateDataService'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return aValue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|