72 lines
1.9 KiB
TypeScript
72 lines
1.9 KiB
TypeScript
|
import { Injectable } from '@nestjs/common';
|
||
|
import { Currency } from '@prisma/client';
|
||
|
import { format } from 'date-fns';
|
||
|
import { getYesterday } from 'libs/helper/src';
|
||
|
|
||
|
import { DataProviderService } from './data-provider.service';
|
||
|
|
||
|
@Injectable()
|
||
|
export class ExchangeRateDataService {
|
||
|
private currencies = {};
|
||
|
private pairs: string[] = [];
|
||
|
|
||
|
public constructor(private dataProviderService: DataProviderService) {
|
||
|
this.initialize();
|
||
|
}
|
||
|
|
||
|
public async initialize() {
|
||
|
this.addPairs(Currency.CHF, Currency.EUR);
|
||
|
this.addPairs(Currency.CHF, Currency.GBP);
|
||
|
this.addPairs(Currency.CHF, Currency.USD);
|
||
|
this.addPairs(Currency.EUR, Currency.GBP);
|
||
|
this.addPairs(Currency.EUR, Currency.USD);
|
||
|
this.addPairs(Currency.GBP, Currency.USD);
|
||
|
|
||
|
await this.loadCurrencies();
|
||
|
}
|
||
|
|
||
|
private addPairs(aCurrency1: Currency, aCurrency2: Currency) {
|
||
|
this.pairs.push(`${aCurrency1}${aCurrency2}`);
|
||
|
this.pairs.push(`${aCurrency2}${aCurrency1}`);
|
||
|
}
|
||
|
|
||
|
public async loadCurrencies() {
|
||
|
const result = await this.dataProviderService.getHistorical(
|
||
|
this.pairs,
|
||
|
'day',
|
||
|
getYesterday(),
|
||
|
getYesterday()
|
||
|
);
|
||
|
|
||
|
this.pairs.forEach((pair) => {
|
||
|
this.currencies[pair] =
|
||
|
result[pair]?.[format(getYesterday(), 'yyyy-MM-dd')]?.marketPrice || 1;
|
||
|
|
||
|
if (this.currencies[pair] === 1) {
|
||
|
// Calculate the other direction
|
||
|
const [currency1, currency2] = pair.match(/.{1,3}/g);
|
||
|
|
||
|
this.currencies[pair] =
|
||
|
1 /
|
||
|
result[`${currency2}${currency1}`]?.[
|
||
|
format(getYesterday(), 'yyyy-MM-dd')
|
||
|
]?.marketPrice;
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public toCurrency(
|
||
|
aValue: number,
|
||
|
aFromCurrency: Currency,
|
||
|
aToCurrency: Currency
|
||
|
) {
|
||
|
let factor = 1;
|
||
|
|
||
|
if (aFromCurrency !== aToCurrency) {
|
||
|
factor = this.currencies[`${aFromCurrency}${aToCurrency}`];
|
||
|
}
|
||
|
|
||
|
return factor * aValue;
|
||
|
}
|
||
|
}
|