2021-08-14 16:55:40 +02:00
|
|
|
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
|
2021-07-01 23:11:41 +02:00
|
|
|
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service';
|
2021-11-28 19:46:34 +01:00
|
|
|
import { MarketDataService } from '@ghostfolio/api/services/market-data.service';
|
2021-07-09 21:35:54 +02:00
|
|
|
import { resetHours } from '@ghostfolio/common/helper';
|
2021-07-03 16:37:33 +02:00
|
|
|
import { Injectable } from '@nestjs/common';
|
2021-07-27 21:54:17 +02:00
|
|
|
import { isBefore, isToday } from 'date-fns';
|
2021-07-28 15:15:31 +02:00
|
|
|
import { flatten } from 'lodash';
|
2021-07-01 23:11:41 +02:00
|
|
|
|
2021-08-14 16:55:40 +02:00
|
|
|
import { GetValueObject } from './interfaces/get-value-object.interface';
|
|
|
|
import { GetValuesParams } from './interfaces/get-values-params.interface';
|
2021-07-01 23:11:41 +02:00
|
|
|
|
2021-07-03 16:37:33 +02:00
|
|
|
@Injectable()
|
|
|
|
export class CurrentRateService {
|
2021-07-01 23:11:41 +02:00
|
|
|
public constructor(
|
2021-07-08 22:42:19 +02:00
|
|
|
private readonly dataProviderService: DataProviderService,
|
2021-07-01 23:11:41 +02:00
|
|
|
private readonly exchangeRateDataService: ExchangeRateDataService,
|
2021-07-03 16:37:33 +02:00
|
|
|
private readonly marketDataService: MarketDataService
|
2021-07-01 23:11:41 +02:00
|
|
|
) {}
|
|
|
|
|
2021-07-09 21:35:54 +02:00
|
|
|
public async getValues({
|
2021-07-20 20:42:56 +02:00
|
|
|
currencies,
|
2021-09-18 19:32:22 +02:00
|
|
|
dataGatheringItems,
|
2021-07-26 22:13:09 +02:00
|
|
|
dateQuery,
|
2021-07-09 21:35:54 +02:00
|
|
|
userCurrency
|
|
|
|
}: GetValuesParams): Promise<GetValueObject[]> {
|
2021-07-27 21:54:17 +02:00
|
|
|
const includeToday =
|
|
|
|
(!dateQuery.lt || isBefore(new Date(), dateQuery.lt)) &&
|
|
|
|
(!dateQuery.gte || isBefore(dateQuery.gte, new Date())) &&
|
|
|
|
(!dateQuery.in || this.containsToday(dateQuery.in));
|
|
|
|
|
|
|
|
const promises: Promise<
|
|
|
|
{
|
|
|
|
date: Date;
|
|
|
|
marketPrice: number;
|
2021-07-28 15:27:53 +02:00
|
|
|
symbol: string;
|
2021-07-27 21:54:17 +02:00
|
|
|
}[]
|
|
|
|
>[] = [];
|
|
|
|
|
|
|
|
if (includeToday) {
|
|
|
|
const today = resetHours(new Date());
|
|
|
|
promises.push(
|
2021-09-18 19:32:22 +02:00
|
|
|
this.dataProviderService
|
2022-02-27 17:03:00 +01:00
|
|
|
.getQuotes(dataGatheringItems)
|
2021-09-18 19:32:22 +02:00
|
|
|
.then((dataResultProvider) => {
|
|
|
|
const result = [];
|
|
|
|
for (const dataGatheringItem of dataGatheringItems) {
|
|
|
|
result.push({
|
|
|
|
date: today,
|
|
|
|
marketPrice: this.exchangeRateDataService.toCurrency(
|
|
|
|
dataResultProvider?.[dataGatheringItem.symbol]?.marketPrice ??
|
|
|
|
0,
|
|
|
|
dataResultProvider?.[dataGatheringItem.symbol]?.currency,
|
|
|
|
userCurrency
|
|
|
|
),
|
|
|
|
symbol: dataGatheringItem.symbol
|
|
|
|
});
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
})
|
2021-07-27 21:54:17 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2021-09-18 19:32:22 +02:00
|
|
|
const symbols = dataGatheringItems.map((dataGatheringItem) => {
|
|
|
|
return dataGatheringItem.symbol;
|
|
|
|
});
|
|
|
|
|
2021-07-27 21:54:17 +02:00
|
|
|
promises.push(
|
2021-07-27 22:59:24 +02:00
|
|
|
this.marketDataService
|
|
|
|
.getRange({
|
|
|
|
dateQuery,
|
|
|
|
symbols
|
|
|
|
})
|
|
|
|
.then((data) => {
|
|
|
|
return data.map((marketDataItem) => {
|
|
|
|
return {
|
|
|
|
date: marketDataItem.date,
|
|
|
|
marketPrice: this.exchangeRateDataService.toCurrency(
|
|
|
|
marketDataItem.marketPrice,
|
|
|
|
currencies[marketDataItem.symbol],
|
|
|
|
userCurrency
|
2021-07-28 15:27:53 +02:00
|
|
|
),
|
|
|
|
symbol: marketDataItem.symbol
|
2021-07-27 22:59:24 +02:00
|
|
|
};
|
|
|
|
});
|
|
|
|
})
|
2021-07-27 21:54:17 +02:00
|
|
|
);
|
|
|
|
|
2021-07-27 22:59:24 +02:00
|
|
|
return flatten(await Promise.all(promises));
|
2021-07-01 23:11:41 +02:00
|
|
|
}
|
|
|
|
|
2021-07-27 21:54:17 +02:00
|
|
|
private containsToday(dates: Date[]): boolean {
|
|
|
|
for (const date of dates) {
|
|
|
|
if (isToday(date)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|