|
|
@ -14,6 +14,7 @@ import { DataSource, SymbolProfile } from '@prisma/client';
|
|
|
|
import Big from 'big.js';
|
|
|
|
import Big from 'big.js';
|
|
|
|
import { addDays, format, isSameDay } from 'date-fns';
|
|
|
|
import { addDays, format, isSameDay } from 'date-fns';
|
|
|
|
import yahooFinance from 'yahoo-finance2';
|
|
|
|
import yahooFinance from 'yahoo-finance2';
|
|
|
|
|
|
|
|
import { Quote } from 'yahoo-finance2/dist/esm/src/modules/quote';
|
|
|
|
|
|
|
|
|
|
|
|
@Injectable()
|
|
|
|
@Injectable()
|
|
|
|
export class YahooFinanceService implements DataProviderInterface {
|
|
|
|
export class YahooFinanceService implements DataProviderInterface {
|
|
|
@ -175,7 +176,23 @@ export class YahooFinanceService implements DataProviderInterface {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const response: { [symbol: string]: IDataProviderResponse } = {};
|
|
|
|
const response: { [symbol: string]: IDataProviderResponse } = {};
|
|
|
|
|
|
|
|
|
|
|
|
const quotes = await yahooFinance.quote(yahooFinanceSymbols);
|
|
|
|
let quotes: Pick<
|
|
|
|
|
|
|
|
Quote,
|
|
|
|
|
|
|
|
'currency' | 'marketState' | 'regularMarketPrice' | 'symbol'
|
|
|
|
|
|
|
|
>[] = [];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
quotes = await yahooFinance.quote(yahooFinanceSymbols);
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
|
|
Logger.error(error, 'YahooFinanceService');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Logger.warn(
|
|
|
|
|
|
|
|
'Fallback to yahooFinance.quoteSummary()',
|
|
|
|
|
|
|
|
'YahooFinanceService'
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
quotes = await this.getQuotesWithQuoteSummary(yahooFinanceSymbols);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (const quote of quotes) {
|
|
|
|
for (const quote of quotes) {
|
|
|
|
// Convert symbols back
|
|
|
|
// Convert symbols back
|
|
|
@ -358,4 +375,26 @@ export class YahooFinanceService implements DataProviderInterface {
|
|
|
|
|
|
|
|
|
|
|
|
return value;
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private async getQuotesWithQuoteSummary(aYahooFinanceSymbols: string[]) {
|
|
|
|
|
|
|
|
const quoteSummaryPromises = aYahooFinanceSymbols.map((symbol) => {
|
|
|
|
|
|
|
|
return yahooFinance.quoteSummary(symbol).catch(() => {
|
|
|
|
|
|
|
|
Logger.error(
|
|
|
|
|
|
|
|
`Could not get quote summary for ${symbol}`,
|
|
|
|
|
|
|
|
'YahooFinanceService'
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const quoteSummaryItems = await Promise.all(quoteSummaryPromises);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return quoteSummaryItems
|
|
|
|
|
|
|
|
.filter((item) => {
|
|
|
|
|
|
|
|
return item !== null;
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
.map(({ price }) => {
|
|
|
|
|
|
|
|
return price;
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|