mirror of https://github.com/ghostfolio/ghostfolio
				
				
			
			
			
				Browse Source
			
			
			
			
				
		* Add Financial Modeling Prep as new data source type * Update changelogpull/1961/head
							committed by
							
								 GitHub
								GitHub
							
						
					
				
				 8 changed files with 139 additions and 1 deletions
			
			
		| @ -0,0 +1,121 @@ | |||
| import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; | |||
| import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; | |||
| import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; | |||
| import { | |||
|   IDataProviderHistoricalResponse, | |||
|   IDataProviderResponse | |||
| } from '@ghostfolio/api/services/interfaces/interfaces'; | |||
| import { DataProviderInfo } from '@ghostfolio/common/interfaces'; | |||
| import { Granularity } from '@ghostfolio/common/types'; | |||
| import { Injectable, Logger } from '@nestjs/common'; | |||
| import { DataSource, SymbolProfile } from '@prisma/client'; | |||
| import bent from 'bent'; | |||
| 
 | |||
| @Injectable() | |||
| export class FinancialModelingPrepService implements DataProviderInterface { | |||
|   private apiKey: string; | |||
|   private baseCurrency: string; | |||
|   private readonly URL = 'https://financialmodelingprep.com/api/v3'; | |||
| 
 | |||
|   public constructor( | |||
|     private readonly configurationService: ConfigurationService | |||
|   ) { | |||
|     this.apiKey = this.configurationService.get( | |||
|       'FINANCIAL_MODELING_PREP_API_KEY' | |||
|     ); | |||
|     this.baseCurrency = this.configurationService.get('BASE_CURRENCY'); | |||
|   } | |||
| 
 | |||
|   public canHandle(symbol: string) { | |||
|     return true; | |||
|   } | |||
| 
 | |||
|   public async getAssetProfile( | |||
|     aSymbol: string | |||
|   ): Promise<Partial<SymbolProfile>> { | |||
|     return { | |||
|       dataSource: this.getName(), | |||
|       symbol: aSymbol | |||
|     }; | |||
|   } | |||
| 
 | |||
|   public async getDividends({ | |||
|     from, | |||
|     granularity = 'day', | |||
|     symbol, | |||
|     to | |||
|   }: { | |||
|     from: Date; | |||
|     granularity: Granularity; | |||
|     symbol: string; | |||
|     to: Date; | |||
|   }) { | |||
|     return {}; | |||
|   } | |||
| 
 | |||
|   public async getHistorical( | |||
|     aSymbol: string, | |||
|     aGranularity: Granularity = 'day', | |||
|     from: Date, | |||
|     to: Date | |||
|   ): Promise<{ | |||
|     [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; | |||
|   }> { | |||
|     return { | |||
|       [aSymbol]: {} | |||
|     }; | |||
|   } | |||
| 
 | |||
|   public getName(): DataSource { | |||
|     return DataSource.FINANCIAL_MODELING_PREP; | |||
|   } | |||
| 
 | |||
|   public async getQuotes( | |||
|     aSymbols: string[] | |||
|   ): Promise<{ [symbol: string]: IDataProviderResponse }> { | |||
|     const results: { [symbol: string]: IDataProviderResponse } = {}; | |||
| 
 | |||
|     if (aSymbols.length <= 0) { | |||
|       return {}; | |||
|     } | |||
| 
 | |||
|     try { | |||
|       const get = bent( | |||
|         `${this.URL}/quote/${aSymbols.join(',')}?apikey=${this.apiKey}`, | |||
|         'GET', | |||
|         'json', | |||
|         200 | |||
|       ); | |||
|       const response = await get(); | |||
| 
 | |||
|       for (const { price, symbol } of response) { | |||
|         results[symbol] = { | |||
|           currency: this.baseCurrency, | |||
|           dataProviderInfo: this.getDataProviderInfo(), | |||
|           dataSource: DataSource.FINANCIAL_MODELING_PREP, | |||
|           marketPrice: price, | |||
|           marketState: 'delayed' | |||
|         }; | |||
|       } | |||
|     } catch (error) { | |||
|       Logger.error(error, 'FinancialModelingPrepService'); | |||
|     } | |||
| 
 | |||
|     return results; | |||
|   } | |||
| 
 | |||
|   public getTestSymbol() { | |||
|     return 'AAPL'; | |||
|   } | |||
| 
 | |||
|   public async search(aQuery: string): Promise<{ items: LookupItem[] }> { | |||
|     return { items: [] }; | |||
|   } | |||
| 
 | |||
|   private getDataProviderInfo(): DataProviderInfo { | |||
|     return { | |||
|       name: 'Financial Modeling Prep', | |||
|       url: 'https://financialmodelingprep.com/developer/docs' | |||
|     }; | |||
|   } | |||
| } | |||
| @ -0,0 +1,2 @@ | |||
| -- AlterEnum | |||
| ALTER TYPE "DataSource" ADD VALUE 'FINANCIAL_MODELING_PREP'; | |||
					Loading…
					
					
				
		Reference in new issue