Browse Source

Submit the changes requested on the pull requests #1736

pull/1736/head
Mirio 3 years ago
parent
commit
7ed59ff2ff
  1. 2
      apps/api/src/services/configuration.service.ts
  2. 42
      apps/api/src/services/data-provider/coingecko/coingecko.service.ts
  3. 10
      apps/api/src/services/data-provider/data-provider.module.ts

2
apps/api/src/services/configuration.service.ts

@ -19,7 +19,7 @@ export class ConfigurationService {
CACHE_TTL: num({ default: 1 }), CACHE_TTL: num({ default: 1 }),
DATA_SOURCE_PRIMARY: str({ default: DataSource.YAHOO }), DATA_SOURCE_PRIMARY: str({ default: DataSource.YAHOO }),
DATA_SOURCES: json({ DATA_SOURCES: json({
default: [DataSource.MANUAL, DataSource.YAHOO, DataSource.COINGECKO] default: [DataSource.MANUAL, DataSource.YAHOO]
}), }),
ENABLE_FEATURE_BLOG: bool({ default: false }), ENABLE_FEATURE_BLOG: bool({ default: false }),
ENABLE_FEATURE_CUSTOM_SYMBOLS: bool({ default: false }), ENABLE_FEATURE_CUSTOM_SYMBOLS: bool({ default: false }),

42
apps/api/src/services/data-provider/coingecko/coingecko-data.service.ts → apps/api/src/services/data-provider/coingecko/coingecko.service.ts

@ -18,16 +18,16 @@ import bent from 'bent';
import { format, differenceInDays, addDays, subDays } from 'date-fns'; import { format, differenceInDays, addDays, subDays } from 'date-fns';
@Injectable() @Injectable()
export class CoinGeckoDataService implements DataProviderInterface { export class CoinGeckoService implements DataProviderInterface {
private readonly URL = 'https://api.coingecko.com/api/v3'; private readonly URL = 'https://api.coingecko.com/api/v3';
private COINLIST = []; private COINLIST = [];
private DEFAULT_CURRENCY: string; private baseCurrency: string;
private DB = {}; private DB = {};
public constructor( public constructor(
private readonly configurationService: ConfigurationService private readonly configurationService: ConfigurationService
) { ) {
this.DEFAULT_CURRENCY = this.configurationService this.baseCurrency = this.configurationService
.get('BASE_CURRENCY') .get('BASE_CURRENCY')
.toUpperCase(); .toUpperCase();
this.DB = {}; this.DB = {};
@ -51,7 +51,7 @@ export class CoinGeckoDataService implements DataProviderInterface {
return {}; return {};
} }
public async getCoinList() { private async getCoinList() {
// TODO: Some caching refresh after X? // TODO: Some caching refresh after X?
if (this.COINLIST.length == 0) { if (this.COINLIST.length == 0) {
const req = bent(`${this.URL}/coins/list`, 'GET', 'json', 200); const req = bent(`${this.URL}/coins/list`, 'GET', 'json', 200);
@ -66,14 +66,14 @@ export class CoinGeckoDataService implements DataProviderInterface {
return { return {
assetClass: AssetClass.CASH, assetClass: AssetClass.CASH,
assetSubClass: AssetSubClass.CRYPTOCURRENCY, assetSubClass: AssetSubClass.CRYPTOCURRENCY,
currency: this.DEFAULT_CURRENCY.toUpperCase(), currency: this.baseCurrency.toUpperCase(),
dataSource: this.getName(), dataSource: this.getName(),
name: aSymbol, name: aSymbol,
symbol: aSymbol symbol: aSymbol
}; };
} }
public async popolateDb(datefrom: Date, symbol: string) { private async populateDatabase(datefrom: Date, symbol: string) {
let start_day; let start_day;
let end_day; let end_day;
datefrom.setHours(0, 0, 1); datefrom.setHours(0, 0, 1);
@ -81,7 +81,7 @@ export class CoinGeckoDataService implements DataProviderInterface {
end_day = Math.round(new Date().getTime() / 1000); end_day = Math.round(new Date().getTime() / 1000);
const targeturl = `${ const targeturl = `${
this.URL this.URL
}/coins/${symbol.toLowerCase()}/market_chart/range?vs_currency=${this.DEFAULT_CURRENCY.toLowerCase()}&from=${start_day}&to=${end_day}`; }/coins/${symbol.toLowerCase()}/market_chart/range?vs_currency=${this.baseCurrency.toLowerCase()}&from=${start_day}&to=${end_day}`;
const req = bent(targeturl, 'GET', 'json', 200); const req = bent(targeturl, 'GET', 'json', 200);
const response = await req(); const response = await req();
if (response.prices.length) { if (response.prices.length) {
@ -94,7 +94,7 @@ export class CoinGeckoDataService implements DataProviderInterface {
} }
} }
public async getDayStat(datein: Date, symbol: string) { private async getDayStat(datein: Date, symbol: string) {
let out = { marketPrice: 0 }; let out = { marketPrice: 0 };
let prevday = subDays(datein, 1); let prevday = subDays(datein, 1);
datein.setHours(0, 0, 1, 1); datein.setHours(0, 0, 1, 1);
@ -119,9 +119,9 @@ export class CoinGeckoDataService implements DataProviderInterface {
}> { }> {
let out = {}; let out = {};
out[aSymbol] = {}; out[aSymbol] = {};
const total_days = Math.abs(differenceInDays(from, to)) + 1; const totalDays = Math.abs(differenceInDays(from, to)) + 1;
await this.popolateDb(from, aSymbol); await this.populateDatabase(from, aSymbol);
for (const iter of Array(total_days).keys()) { for (const iter of Array(totalDays).keys()) {
let day = addDays(from, iter); let day = addDays(from, iter);
let datestr = format(day, DATE_FORMAT); let datestr = format(day, DATE_FORMAT);
out[aSymbol][datestr] = await this.getDayStat(day, aSymbol); out[aSymbol][datestr] = await this.getDayStat(day, aSymbol);
@ -143,26 +143,25 @@ export class CoinGeckoDataService implements DataProviderInterface {
aSymbols: string[] aSymbols: string[]
): Promise<{ [symbol: string]: IDataProviderResponse }> { ): Promise<{ [symbol: string]: IDataProviderResponse }> {
var results = {}; var results = {};
if (aSymbols.length <= 0) { if (aSymbols.length <= 0) {
return {}; return {};
} }
try { try {
for (const coin of aSymbols) { for (const coin of aSymbols) {
const coinlower = coin.toLowerCase();
const req = bent( const req = bent(
`${ `${
this.URL this.URL
}/simple/price?ids=${coinlower}&vs_currencies=${this.DEFAULT_CURRENCY.toLowerCase()}`, }/simple/price?ids=${coin.toLowerCase()}&vs_currencies=${this.baseCurrency.toLowerCase()}`,
'GET', 'GET',
'json', 'json',
200 200
); );
const response = await req(); const response = await req();
const price = response[coinlower][this.DEFAULT_CURRENCY.toLowerCase()]; const price =
response[coin.toLowerCase()][this.baseCurrency.toLowerCase()];
results[coin] = { results[coin] = {
currency: this.DEFAULT_CURRENCY, currency: this.baseCurrency,
dataSource: DataSource.COINGECKO, dataSource: DataSource.COINGECKO,
marketPrice: price, marketPrice: price,
marketState: 'closed' marketState: 'closed'
@ -177,22 +176,21 @@ export class CoinGeckoDataService implements DataProviderInterface {
} }
public async search(aQuery: string): Promise<{ items: LookupItem[] }> { public async search(aQuery: string): Promise<{ items: LookupItem[] }> {
const items: LookupItem[] = [];
await this.getCoinList(); await this.getCoinList();
if (aQuery.length <= 2) { if (aQuery.length <= 2) {
return { items: [] }; return { items };
} }
var coins = [];
for (const coiniter of this.COINLIST) { for (const coiniter of this.COINLIST) {
if (coiniter.id.toLowerCase().includes(aQuery)) { if (coiniter.id.toLowerCase().includes(aQuery)) {
coins.push({ items.push({
symbol: coiniter.id.toUpperCase(), symbol: coiniter.id.toUpperCase(),
currency: this.DEFAULT_CURRENCY, currency: this.baseCurrency,
dataSource: this.getName(), dataSource: this.getName(),
name: `${coiniter.name} (From CoinGecko)` name: `${coiniter.name} (From CoinGecko)`
}); });
} }
} }
return { items: coins }; return { items };
} }
} }

10
apps/api/src/services/data-provider/data-provider.module.ts

@ -1,7 +1,7 @@
import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module';
import { CryptocurrencyModule } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.module'; import { CryptocurrencyModule } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.module';
import { AlphaVantageService } from '@ghostfolio/api/services/data-provider/alpha-vantage/alpha-vantage.service'; import { AlphaVantageService } from '@ghostfolio/api/services/data-provider/alpha-vantage/alpha-vantage.service';
import { CoinGeckoDataService } from '@ghostfolio/api/services/data-provider/coingecko/coingecko-data.service'; import { CoinGeckoService } from '@ghostfolio/api/services/data-provider/coingecko/coingecko.service';
import { EodHistoricalDataService } from '@ghostfolio/api/services/data-provider/eod-historical-data/eod-historical-data.service'; import { EodHistoricalDataService } from '@ghostfolio/api/services/data-provider/eod-historical-data/eod-historical-data.service';
import { GoogleSheetsService } from '@ghostfolio/api/services/data-provider/google-sheets/google-sheets.service'; import { GoogleSheetsService } from '@ghostfolio/api/services/data-provider/google-sheets/google-sheets.service';
import { ManualService } from '@ghostfolio/api/services/data-provider/manual/manual.service'; import { ManualService } from '@ghostfolio/api/services/data-provider/manual/manual.service';
@ -22,7 +22,7 @@ import { DataProviderService } from './data-provider.service';
], ],
providers: [ providers: [
AlphaVantageService, AlphaVantageService,
CoinGeckoDataService, CoinGeckoService,
DataProviderService, DataProviderService,
EodHistoricalDataService, EodHistoricalDataService,
GoogleSheetsService, GoogleSheetsService,
@ -32,7 +32,7 @@ import { DataProviderService } from './data-provider.service';
{ {
inject: [ inject: [
AlphaVantageService, AlphaVantageService,
CoinGeckoDataService, CoinGeckoService,
EodHistoricalDataService, EodHistoricalDataService,
GoogleSheetsService, GoogleSheetsService,
ManualService, ManualService,
@ -42,7 +42,7 @@ import { DataProviderService } from './data-provider.service';
provide: 'DataProviderInterfaces', provide: 'DataProviderInterfaces',
useFactory: ( useFactory: (
alphaVantageService, alphaVantageService,
CoinGeckoDataService, CoinGeckoService,
eodHistoricalDataService, eodHistoricalDataService,
googleSheetsService, googleSheetsService,
manualService, manualService,
@ -50,7 +50,7 @@ import { DataProviderService } from './data-provider.service';
yahooFinanceService yahooFinanceService
) => [ ) => [
alphaVantageService, alphaVantageService,
CoinGeckoDataService, CoinGeckoService,
eodHistoricalDataService, eodHistoricalDataService,
googleSheetsService, googleSheetsService,
manualService, manualService,

Loading…
Cancel
Save