diff --git a/apps/api/src/services/configuration/configuration.service.ts b/apps/api/src/services/configuration/configuration.service.ts index 5b76055c1..69a043fc4 100644 --- a/apps/api/src/services/configuration/configuration.service.ts +++ b/apps/api/src/services/configuration/configuration.service.ts @@ -15,6 +15,7 @@ export class ConfigurationService { BETTER_UPTIME_API_KEY: str({ default: '' }), CACHE_QUOTES_TTL: num({ default: 1 }), CACHE_TTL: num({ default: 1 }), + COINGECKO_API_KEY: str({ default: '' }), DATA_SOURCE_EXCHANGE_RATES: str({ default: DataSource.YAHOO }), DATA_SOURCE_IMPORT: str({ default: DataSource.YAHOO }), DATA_SOURCES: json({ diff --git a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts index d2156ed3b..9046f87b9 100644 --- a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts +++ b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts @@ -21,11 +21,14 @@ import got from 'got'; @Injectable() export class CoinGeckoService implements DataProviderInterface { + private apiKey: string; private readonly URL = 'https://api.coingecko.com/api/v3'; public constructor( private readonly configurationService: ConfigurationService - ) {} + ) { + this.apiKey = this.configurationService.get('COINGECKO_API_KEY'); + } public canHandle(symbol: string) { return true; @@ -49,7 +52,8 @@ export class CoinGeckoService implements DataProviderInterface { abortController.abort(); }, this.configurationService.get('REQUEST_TIMEOUT')); - const { name } = await got(`${this.URL}/coins/${aSymbol}`, { + const { name } = await got(`${this.URL}/coins/${aSymbol + }?x_cg_demo_api_key=${this.apiKey}`, { // @ts-ignore signal: abortController.signal }).json(); @@ -104,7 +108,8 @@ export class CoinGeckoService implements DataProviderInterface { this.URL }/coins/${aSymbol}/market_chart/range?vs_currency=${DEFAULT_CURRENCY.toLowerCase()}&from=${getUnixTime( from - )}&to=${getUnixTime(to)}`, + )}&to=${getUnixTime(to) + }?x_cg_demo_api_key=${this.apiKey}`, { // @ts-ignore signal: abortController.signal @@ -165,7 +170,8 @@ export class CoinGeckoService implements DataProviderInterface { const quotes = await got( `${this.URL}/simple/price?ids=${symbols.join( ',' - )}&vs_currencies=${DEFAULT_CURRENCY.toLowerCase()}`, + )}&vs_currencies=${DEFAULT_CURRENCY.toLowerCase() + }?x_cg_demo_api_key=${this.apiKey}`, { // @ts-ignore signal: abortController.signal @@ -216,7 +222,8 @@ export class CoinGeckoService implements DataProviderInterface { abortController.abort(); }, this.configurationService.get('REQUEST_TIMEOUT')); - const { coins } = await got(`${this.URL}/search?query=${query}`, { + const { coins } = await got(`${this.URL}/search?query=${query + }?x_cg_demo_api_key=${this.apiKey}`, { // @ts-ignore signal: abortController.signal }).json(); diff --git a/apps/api/src/services/interfaces/environment.interface.ts b/apps/api/src/services/interfaces/environment.interface.ts index a410070a0..f8829a24f 100644 --- a/apps/api/src/services/interfaces/environment.interface.ts +++ b/apps/api/src/services/interfaces/environment.interface.ts @@ -6,6 +6,7 @@ export interface Environment extends CleanedEnvAccessors { BETTER_UPTIME_API_KEY: string; CACHE_QUOTES_TTL: number; CACHE_TTL: number; + COINGECKO_API_KEY: string; DATA_SOURCE_EXCHANGE_RATES: string; DATA_SOURCE_IMPORT: string; DATA_SOURCES: string[];