Browse Source

refactor(coingecko.service): Move API authentication to headers and specify demo key

pull/2827/head
Tanguy Herbron 2 years ago
committed by Thomas Kaul
parent
commit
afc2e34478
  1. 2
      apps/api/src/services/configuration/configuration.service.ts
  2. 26
      apps/api/src/services/data-provider/coingecko/coingecko.service.ts
  3. 2
      apps/api/src/services/interfaces/environment.interface.ts

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

@ -15,7 +15,7 @@ export class ConfigurationService {
BETTER_UPTIME_API_KEY: str({ default: '' }), BETTER_UPTIME_API_KEY: str({ default: '' }),
CACHE_QUOTES_TTL: num({ default: 1 }), CACHE_QUOTES_TTL: num({ default: 1 }),
CACHE_TTL: num({ default: 1 }), CACHE_TTL: num({ default: 1 }),
COINGECKO_API_KEY: str({ default: '' }), COINGECKO_API_KEY_DEMO: str({ default: '' }),
DATA_SOURCE_EXCHANGE_RATES: str({ default: DataSource.YAHOO }), DATA_SOURCE_EXCHANGE_RATES: str({ default: DataSource.YAHOO }),
DATA_SOURCE_IMPORT: str({ default: DataSource.YAHOO }), DATA_SOURCE_IMPORT: str({ default: DataSource.YAHOO }),
DATA_SOURCES: json({ DATA_SOURCES: json({

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

@ -17,17 +17,19 @@ import {
SymbolProfile SymbolProfile
} from '@prisma/client'; } from '@prisma/client';
import { format, fromUnixTime, getUnixTime } from 'date-fns'; import { format, fromUnixTime, getUnixTime } from 'date-fns';
import got from 'got'; import got, { Headers } from 'got';
@Injectable() @Injectable()
export class CoinGeckoService implements DataProviderInterface { export class CoinGeckoService implements DataProviderInterface {
private apiKey: string; private headers: Headers = {};
private readonly URL = 'https://api.coingecko.com/api/v3'; private readonly URL = 'https://api.coingecko.com/api/v3';
public constructor( public constructor(
private readonly configurationService: ConfigurationService private readonly configurationService: ConfigurationService
) { ) {
this.apiKey = this.configurationService.get('COINGECKO_API_KEY'); if (this.configurationService.get('COINGECKO_API_KEY_DEMO')) {
this.headers['x-cg-demo-api-key'] = this.configurationService.get('COINGECKO_API_KEY_DEMO');
}
} }
public canHandle(symbol: string) { public canHandle(symbol: string) {
@ -52,10 +54,10 @@ export class CoinGeckoService implements DataProviderInterface {
abortController.abort(); abortController.abort();
}, this.configurationService.get('REQUEST_TIMEOUT')); }, 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 // @ts-ignore
signal: abortController.signal signal: abortController.signal,
headers: this.headers
}).json<any>(); }).json<any>();
response.name = name; response.name = name;
@ -108,11 +110,11 @@ export class CoinGeckoService implements DataProviderInterface {
this.URL this.URL
}/coins/${aSymbol}/market_chart/range?vs_currency=${DEFAULT_CURRENCY.toLowerCase()}&from=${getUnixTime( }/coins/${aSymbol}/market_chart/range?vs_currency=${DEFAULT_CURRENCY.toLowerCase()}&from=${getUnixTime(
from from
)}&to=${getUnixTime(to) )}&to=${getUnixTime(to)}`,
}?x_cg_demo_api_key=${this.apiKey}`,
{ {
// @ts-ignore // @ts-ignore
signal: abortController.signal signal: abortController.signal,
headers: this.headers
} }
).json<any>(); ).json<any>();
@ -170,8 +172,7 @@ export class CoinGeckoService implements DataProviderInterface {
const quotes = await got( const quotes = await got(
`${this.URL}/simple/price?ids=${symbols.join( `${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 // @ts-ignore
signal: abortController.signal signal: abortController.signal
@ -222,8 +223,7 @@ export class CoinGeckoService implements DataProviderInterface {
abortController.abort(); abortController.abort();
}, this.configurationService.get('REQUEST_TIMEOUT')); }, 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 // @ts-ignore
signal: abortController.signal signal: abortController.signal
}).json<any>(); }).json<any>();

2
apps/api/src/services/interfaces/environment.interface.ts

@ -6,7 +6,7 @@ export interface Environment extends CleanedEnvAccessors {
BETTER_UPTIME_API_KEY: string; BETTER_UPTIME_API_KEY: string;
CACHE_QUOTES_TTL: number; CACHE_QUOTES_TTL: number;
CACHE_TTL: number; CACHE_TTL: number;
COINGECKO_API_KEY: string; COINGECKO_API_KEY_DEMO: string;
DATA_SOURCE_EXCHANGE_RATES: string; DATA_SOURCE_EXCHANGE_RATES: string;
DATA_SOURCE_IMPORT: string; DATA_SOURCE_IMPORT: string;
DATA_SOURCES: string[]; DATA_SOURCES: string[];

Loading…
Cancel
Save