|
|
|
@ -86,12 +86,11 @@ export class DataProviderService implements OnModuleInit { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
// TODO: Change symbol in response to assetProfileIdentifier
|
|
|
|
public async getAssetProfiles(items: AssetProfileIdentifier[]): Promise<{ |
|
|
|
[symbol: string]: Partial<SymbolProfile>; |
|
|
|
[assetProfileIdentifier: string]: Partial<SymbolProfile>; |
|
|
|
}> { |
|
|
|
const response: { |
|
|
|
[symbol: string]: Partial<SymbolProfile>; |
|
|
|
[assetProfileIdentifier: string]: Partial<SymbolProfile>; |
|
|
|
} = {}; |
|
|
|
|
|
|
|
const itemsGroupedByDataSource = groupBy(items, ({ dataSource }) => { |
|
|
|
@ -117,7 +116,12 @@ export class DataProviderService implements OnModuleInit { |
|
|
|
promises.push( |
|
|
|
promise.then((assetProfile) => { |
|
|
|
if (isCurrency(assetProfile?.currency)) { |
|
|
|
response[symbol] = assetProfile; |
|
|
|
response[ |
|
|
|
getAssetProfileIdentifier({ |
|
|
|
symbol, |
|
|
|
dataSource: DataSource[dataSource] |
|
|
|
}) |
|
|
|
] = { ...assetProfile, symbol }; |
|
|
|
} |
|
|
|
}) |
|
|
|
); |
|
|
|
@ -335,17 +339,20 @@ export class DataProviderService implements OnModuleInit { |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
// TODO: Change symbol in response to assetProfileIdentifier
|
|
|
|
public async getHistorical( |
|
|
|
aItems: AssetProfileIdentifier[], |
|
|
|
aGranularity: Granularity = 'month', |
|
|
|
from: Date, |
|
|
|
to: Date |
|
|
|
): Promise<{ |
|
|
|
[symbol: string]: { [date: string]: DataProviderHistoricalResponse }; |
|
|
|
[assetProfileIdentifier: string]: { |
|
|
|
[date: string]: DataProviderHistoricalResponse; |
|
|
|
}; |
|
|
|
}> { |
|
|
|
let response: { |
|
|
|
[symbol: string]: { [date: string]: DataProviderHistoricalResponse }; |
|
|
|
[assetProfileIdentifier: string]: { |
|
|
|
[date: string]: DataProviderHistoricalResponse; |
|
|
|
}; |
|
|
|
} = {}; |
|
|
|
|
|
|
|
if (isEmpty(aItems) || !isValid(from) || !isValid(to)) { |
|
|
|
@ -385,13 +392,20 @@ export class DataProviderService implements OnModuleInit { |
|
|
|
ORDER BY date;`;
|
|
|
|
|
|
|
|
response = marketDataByGranularity.reduce((r, marketData) => { |
|
|
|
const { date, marketPrice, symbol } = marketData; |
|
|
|
const { dataSource, date, marketPrice, symbol } = marketData; |
|
|
|
|
|
|
|
if (!r[symbol]) { |
|
|
|
r[symbol] = {}; |
|
|
|
const assetProfileIdentifier = getAssetProfileIdentifier({ |
|
|
|
dataSource, |
|
|
|
symbol |
|
|
|
}); |
|
|
|
|
|
|
|
if (!r[assetProfileIdentifier]) { |
|
|
|
r[assetProfileIdentifier] = {}; |
|
|
|
} |
|
|
|
|
|
|
|
r[symbol][format(new Date(date), DATE_FORMAT)] = { marketPrice }; |
|
|
|
r[assetProfileIdentifier][format(new Date(date), DATE_FORMAT)] = { |
|
|
|
marketPrice |
|
|
|
}; |
|
|
|
|
|
|
|
return r; |
|
|
|
}, {}); |
|
|
|
@ -402,7 +416,6 @@ export class DataProviderService implements OnModuleInit { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// TODO: Change symbol in response to assetProfileIdentifier
|
|
|
|
public async getHistoricalRaw({ |
|
|
|
assetProfileIdentifiers, |
|
|
|
from, |
|
|
|
@ -412,7 +425,9 @@ export class DataProviderService implements OnModuleInit { |
|
|
|
from: Date; |
|
|
|
to: Date; |
|
|
|
}): Promise<{ |
|
|
|
[symbol: string]: { [date: string]: DataProviderHistoricalResponse }; |
|
|
|
[assetProfileIdentifier: string]: { |
|
|
|
[date: string]: DataProviderHistoricalResponse; |
|
|
|
}; |
|
|
|
}> { |
|
|
|
for (const { currency, rootCurrency } of DERIVED_CURRENCIES) { |
|
|
|
if ( |
|
|
|
@ -445,11 +460,14 @@ export class DataProviderService implements OnModuleInit { |
|
|
|
); |
|
|
|
|
|
|
|
const result: { |
|
|
|
[symbol: string]: { [date: string]: DataProviderHistoricalResponse }; |
|
|
|
[assetProfileIdentifier: string]: { |
|
|
|
[date: string]: DataProviderHistoricalResponse; |
|
|
|
}; |
|
|
|
} = {}; |
|
|
|
|
|
|
|
const promises: Promise<{ |
|
|
|
data: { [date: string]: DataProviderHistoricalResponse }; |
|
|
|
dataSource: DataSource; |
|
|
|
symbol: string; |
|
|
|
}>[] = []; |
|
|
|
for (const { dataSource, symbol } of assetProfileIdentifiers) { |
|
|
|
@ -467,6 +485,7 @@ export class DataProviderService implements OnModuleInit { |
|
|
|
promises.push( |
|
|
|
Promise.resolve({ |
|
|
|
data, |
|
|
|
dataSource, |
|
|
|
symbol |
|
|
|
}) |
|
|
|
); |
|
|
|
@ -480,7 +499,7 @@ export class DataProviderService implements OnModuleInit { |
|
|
|
requestTimeout: ms('30 seconds') |
|
|
|
}) |
|
|
|
.then((data) => { |
|
|
|
return { symbol, data: data?.[symbol] }; |
|
|
|
return { dataSource, symbol, data: data?.[symbol] }; |
|
|
|
}) |
|
|
|
); |
|
|
|
} |
|
|
|
@ -490,22 +509,26 @@ export class DataProviderService implements OnModuleInit { |
|
|
|
try { |
|
|
|
const allData = await Promise.all(promises); |
|
|
|
|
|
|
|
for (const { data, symbol } of allData) { |
|
|
|
for (const { data, dataSource, symbol } of allData) { |
|
|
|
const currency = DERIVED_CURRENCIES.find(({ rootCurrency }) => { |
|
|
|
return `${DEFAULT_CURRENCY}${rootCurrency}` === symbol; |
|
|
|
}); |
|
|
|
|
|
|
|
if (currency) { |
|
|
|
// Add derived currency
|
|
|
|
result[`${DEFAULT_CURRENCY}${currency.currency}`] = |
|
|
|
this.transformHistoricalData({ |
|
|
|
allData, |
|
|
|
currency: `${DEFAULT_CURRENCY}${currency.rootCurrency}`, |
|
|
|
factor: currency.factor |
|
|
|
}); |
|
|
|
result[ |
|
|
|
getAssetProfileIdentifier({ |
|
|
|
dataSource, |
|
|
|
symbol: `${DEFAULT_CURRENCY}${currency.currency}` |
|
|
|
}) |
|
|
|
] = this.transformHistoricalData({ |
|
|
|
allData, |
|
|
|
currency: `${DEFAULT_CURRENCY}${currency.rootCurrency}`, |
|
|
|
factor: currency.factor |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
result[symbol] = data; |
|
|
|
result[getAssetProfileIdentifier({ dataSource, symbol })] = data; |
|
|
|
} |
|
|
|
} catch (error) { |
|
|
|
this.logger.error(error); |
|
|
|
|