Browse Source

Refactoring

pull/2891/head
Thomas Kaul 2 years ago
parent
commit
5066f61c15
  1. 202
      apps/api/src/services/data-provider/data-provider.service.ts
  2. 19
      apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts
  3. 19
      libs/common/src/lib/config.ts

202
apps/api/src/services/data-provider/data-provider.service.ts

@ -11,6 +11,7 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service';
import { import {
DEFAULT_CURRENCY, DEFAULT_CURRENCY,
DERIVED_CURRENCIES,
PROPERTY_DATA_SOURCE_MAPPING PROPERTY_DATA_SOURCE_MAPPING
} from '@ghostfolio/common/config'; } from '@ghostfolio/common/config';
import { DATE_FORMAT, getStartOfUtcDate } from '@ghostfolio/common/helper'; import { DATE_FORMAT, getStartOfUtcDate } from '@ghostfolio/common/helper';
@ -211,40 +212,23 @@ export class DataProviderService {
}> { }> {
let dataGatheringItems = aDataGatheringItems; let dataGatheringItems = aDataGatheringItems;
if ( for (const { currency, rootCurrency } of DERIVED_CURRENCIES) {
this.hasCurrency({ if (
dataGatheringItems, this.hasCurrency({
currency: `${DEFAULT_CURRENCY}GBp` dataGatheringItems,
}) currency: `${DEFAULT_CURRENCY}${currency}`
) { })
dataGatheringItems.push({ ) {
dataSource: this.getDataSourceForExchangeRates(), // Skip derived currency
symbol: `${DEFAULT_CURRENCY}GBP` dataGatheringItems = dataGatheringItems.filter(({ symbol }) => {
}); return symbol !== `${DEFAULT_CURRENCY}${currency}`;
} });
// Add root currency
if ( dataGatheringItems.push({
this.hasCurrency({ dataSource: this.getDataSourceForExchangeRates(),
dataGatheringItems, symbol: `${DEFAULT_CURRENCY}${rootCurrency}`
currency: `${DEFAULT_CURRENCY}ILA` });
}) }
) {
dataGatheringItems.push({
dataSource: this.getDataSourceForExchangeRates(),
symbol: `${DEFAULT_CURRENCY}ILS`
});
}
if (
this.hasCurrency({
dataGatheringItems,
currency: `${DEFAULT_CURRENCY}ZAc`
})
) {
dataGatheringItems.push({
dataSource: this.getDataSourceForExchangeRates(),
symbol: `${DEFAULT_CURRENCY}ZAR`
});
} }
dataGatheringItems = uniqWith(dataGatheringItems, (obj1, obj2) => { dataGatheringItems = uniqWith(dataGatheringItems, (obj1, obj2) => {
@ -296,39 +280,28 @@ export class DataProviderService {
try { try {
const allData = await Promise.all(promises); const allData = await Promise.all(promises);
for (const { data, symbol } of allData) { for (const { data, symbol } of allData) {
if (symbol === `${DEFAULT_CURRENCY}GBp`) { const currency = DERIVED_CURRENCIES.find(({ rootCurrency }) => {
result[symbol] = this.transformHistoricalData({ return `${DEFAULT_CURRENCY}${rootCurrency}` === symbol;
allData, });
symbol,
currency: `${DEFAULT_CURRENCY}GBP`, if (currency) {
factor: 100 // Add derived currency
}); result[`${DEFAULT_CURRENCY}${currency.currency}`] =
} else if (symbol === `${DEFAULT_CURRENCY}ILA`) { this.transformHistoricalData({
result[symbol] = this.transformHistoricalData({ allData,
allData, currency: `${DEFAULT_CURRENCY}${currency.rootCurrency}`,
symbol, factor: currency.factor
currency: `${DEFAULT_CURRENCY}ILS`, });
factor: 100
});
} else if (symbol === `${DEFAULT_CURRENCY}ZAc`) {
result[symbol] = this.transformHistoricalData({
allData,
symbol,
currency: `${DEFAULT_CURRENCY}ZAR`,
factor: 100
});
} else {
result[symbol] = data;
} }
result[symbol] = data;
} }
} catch (error) { } catch (error) {
Logger.error(error, 'DataProviderService'); Logger.error(error, 'DataProviderService');
} }
// TODO
console.log(JSON.stringify(result, null, ' '));
return result; return result;
} }
@ -433,10 +406,10 @@ export class DataProviderService {
for (let [symbol, dataProviderResponse] of Object.entries(result)) { for (let [symbol, dataProviderResponse] of Object.entries(result)) {
if ( if (
[ [
`${DEFAULT_CURRENCY}GBp`, ...DERIVED_CURRENCIES.map(({ currency }) => {
`${DEFAULT_CURRENCY}ILA`, return `${DEFAULT_CURRENCY}${currency}`;
`${DEFAULT_CURRENCY}USX`, }),
`${DEFAULT_CURRENCY}ZAc` `${DEFAULT_CURRENCY}USX`
].includes(symbol) ].includes(symbol)
) { ) {
continue; continue;
@ -453,72 +426,35 @@ export class DataProviderService {
this.configurationService.get('CACHE_QUOTES_TTL') this.configurationService.get('CACHE_QUOTES_TTL')
); );
if (symbol === `${DEFAULT_CURRENCY}GBP`) { for (const {
response[`${DEFAULT_CURRENCY}GBp`] = { currency,
...dataProviderResponse, factor,
currency: 'GBp', rootCurrency
marketPrice: new Big( } of DERIVED_CURRENCIES) {
result[`${DEFAULT_CURRENCY}GBP`].marketPrice if (symbol === `${DEFAULT_CURRENCY}${rootCurrency}`) {
) response[`${DEFAULT_CURRENCY}${currency}`] = {
.mul(100) ...dataProviderResponse,
.toNumber(), currency,
marketState: 'open' marketPrice: new Big(
}; result[`${DEFAULT_CURRENCY}${rootCurrency}`].marketPrice
)
this.redisCacheService.set( .mul(factor)
this.redisCacheService.getQuoteKey({ .toNumber(),
dataSource: DataSource[dataSource], marketState: 'open'
symbol: `${DEFAULT_CURRENCY}GBp` };
}),
JSON.stringify(response[`${DEFAULT_CURRENCY}GBp`]), this.redisCacheService.set(
this.configurationService.get('CACHE_QUOTES_TTL') this.redisCacheService.getQuoteKey({
); dataSource: DataSource[dataSource],
} else if (symbol === `${DEFAULT_CURRENCY}ILS`) { symbol: `${DEFAULT_CURRENCY}${currency}`
response[`${DEFAULT_CURRENCY}ILA`] = { }),
...dataProviderResponse, JSON.stringify(response[`${DEFAULT_CURRENCY}${currency}`]),
currency: 'ILA', this.configurationService.get('CACHE_QUOTES_TTL')
marketPrice: new Big( );
result[`${DEFAULT_CURRENCY}ILS`].marketPrice }
)
.mul(100)
.toNumber(),
marketState: 'open'
};
this.redisCacheService.set(
this.redisCacheService.getQuoteKey({
dataSource: DataSource[dataSource],
symbol: `${DEFAULT_CURRENCY}ILA`
}),
JSON.stringify(response[`${DEFAULT_CURRENCY}ILA`]),
this.configurationService.get('CACHE_QUOTES_TTL')
);
} else if (symbol === `${DEFAULT_CURRENCY}ZAR`) {
response[`${DEFAULT_CURRENCY}ZAc`] = {
...dataProviderResponse,
currency: 'ZAc',
marketPrice: new Big(
result[`${DEFAULT_CURRENCY}ZAR`].marketPrice
)
.mul(100)
.toNumber(),
marketState: 'open'
};
this.redisCacheService.set(
this.redisCacheService.getQuoteKey({
dataSource: DataSource[dataSource],
symbol: `${DEFAULT_CURRENCY}ZAc`
}),
JSON.stringify(response[`${DEFAULT_CURRENCY}ZAc`]),
this.configurationService.get('CACHE_QUOTES_TTL')
);
} }
} }
// TODO
console.log({ response });
Logger.debug( Logger.debug(
`Fetched ${symbolsChunk.length} quote${ `Fetched ${symbolsChunk.length} quote${
symbolsChunk.length > 1 ? 's' : '' symbolsChunk.length > 1 ? 's' : ''
@ -676,8 +612,7 @@ export class DataProviderService {
private transformHistoricalData({ private transformHistoricalData({
allData, allData,
currency, currency,
factor, factor
symbol
}: { }: {
allData: { allData: {
data: { data: {
@ -687,9 +622,8 @@ export class DataProviderService {
}[]; }[];
currency: string; currency: string;
factor: number; factor: number;
symbol: string;
}) { }) {
const parentData = allData.find(({ symbol }) => { const rootData = allData.find(({ symbol }) => {
return symbol === currency; return symbol === currency;
})?.data; })?.data;
@ -697,11 +631,9 @@ export class DataProviderService {
[date: string]: IDataProviderHistoricalResponse; [date: string]: IDataProviderHistoricalResponse;
} = {}; } = {};
for (const date in parentData) { for (const date in rootData) {
data[date] = { data[date] = {
marketPrice: new Big(factor) marketPrice: new Big(factor).mul(rootData[date].marketPrice).toNumber()
.mul(parentData[date].marketPrice)
.toNumber()
}; };
} }

19
apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts

@ -5,6 +5,7 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service';
import { import {
DEFAULT_CURRENCY, DEFAULT_CURRENCY,
DERIVED_CURRENCIES,
PROPERTY_CURRENCIES PROPERTY_CURRENCIES
} from '@ghostfolio/common/config'; } from '@ghostfolio/common/config';
import { import {
@ -487,19 +488,11 @@ export class ExchangeRateDataService {
// Add derived currencies // Add derived currencies
currencies.push('USX'); currencies.push('USX');
if (currencies.includes('GBP') || currencies.includes('GBp')) { for (const { currency, rootCurrency } of DERIVED_CURRENCIES) {
currencies.push('GBP'); if (currencies.includes(currency) || currencies.includes(rootCurrency)) {
currencies.push('GBp'); currencies.push(currency);
} currencies.push(rootCurrency);
}
if (currencies.includes('ILS') || currencies.includes('ILA')) {
currencies.push('ILS');
currencies.push('ILA');
}
if (currencies.includes('ZAR') || currencies.includes('ZAc')) {
currencies.push('ZAR');
currencies.push('ZAc');
} }
return uniq(currencies).filter(Boolean).sort(); return uniq(currencies).filter(Boolean).sort();

19
libs/common/src/lib/config.ts

@ -41,6 +41,25 @@ export const DEFAULT_LANGUAGE_CODE = 'en';
export const DEFAULT_PAGE_SIZE = 50; export const DEFAULT_PAGE_SIZE = 50;
export const DEFAULT_ROOT_URL = 'http://localhost:4200'; export const DEFAULT_ROOT_URL = 'http://localhost:4200';
// USX is handled separately
export const DERIVED_CURRENCIES = [
{
currency: 'GBp',
factor: 100,
rootCurrency: 'GBP'
},
{
currency: 'ILA',
factor: 100,
rootCurrency: 'ILS'
},
{
currency: 'ZAc',
factor: 100,
rootCurrency: 'ZAR'
}
];
export const EMERGENCY_FUND_TAG_ID = '4452656d-9fa4-4bd0-ba38-70492e31d180'; export const EMERGENCY_FUND_TAG_ID = '4452656d-9fa4-4bd0-ba38-70492e31d180';
export const GATHER_ASSET_PROFILE_PROCESS = 'GATHER_ASSET_PROFILE'; export const GATHER_ASSET_PROFILE_PROCESS = 'GATHER_ASSET_PROFILE';

Loading…
Cancel
Save