mirror of https://github.com/ghostfolio/ghostfolio
				
				
			
			
			
				Browse Source
			
			
			
			
				
		* Eliminate redundant storage of historical exchange rates * Clean up experimental API * Update changelogpull/501/head
							committed by
							
								 GitHub
								GitHub
							
						
					
				
				 12 changed files with 20 additions and 188 deletions
			
			
		| @ -1,22 +0,0 @@ | |||
| import { Type } from '@prisma/client'; | |||
| import { IsISO8601, IsNumber, IsString } from 'class-validator'; | |||
| 
 | |||
| export class CreateOrderDto { | |||
|   @IsString() | |||
|   currency: string; | |||
| 
 | |||
|   @IsISO8601() | |||
|   date: string; | |||
| 
 | |||
|   @IsNumber() | |||
|   quantity: number; | |||
| 
 | |||
|   @IsString() | |||
|   symbol: string; | |||
| 
 | |||
|   @IsString() | |||
|   type: Type; | |||
| 
 | |||
|   @IsNumber() | |||
|   unitPrice: number; | |||
| } | |||
| @ -1,69 +0,0 @@ | |||
| import { baseCurrency, benchmarks } from '@ghostfolio/common/config'; | |||
| import { DATE_FORMAT } from '@ghostfolio/common/helper'; | |||
| import { isApiTokenAuthorized } from '@ghostfolio/common/permissions'; | |||
| import type { RequestWithUser } from '@ghostfolio/common/types'; | |||
| import { | |||
|   Body, | |||
|   Controller, | |||
|   Get, | |||
|   Headers, | |||
|   HttpException, | |||
|   Inject, | |||
|   Param, | |||
|   Post | |||
| } from '@nestjs/common'; | |||
| import { REQUEST } from '@nestjs/core'; | |||
| import { parse } from 'date-fns'; | |||
| import { StatusCodes, getReasonPhrase } from 'http-status-codes'; | |||
| 
 | |||
| import { CreateOrderDto } from './create-order.dto'; | |||
| import { ExperimentalService } from './experimental.service'; | |||
| import { Data } from './interfaces/data.interface'; | |||
| 
 | |||
| @Controller('experimental') | |||
| export class ExperimentalController { | |||
|   public constructor( | |||
|     private readonly experimentalService: ExperimentalService, | |||
|     @Inject(REQUEST) private readonly request: RequestWithUser | |||
|   ) {} | |||
| 
 | |||
|   @Get('benchmarks') | |||
|   public async getBenchmarks( | |||
|     @Headers('Authorization') apiToken: string | |||
|   ): Promise<string[]> { | |||
|     if (!isApiTokenAuthorized(apiToken)) { | |||
|       throw new HttpException( | |||
|         getReasonPhrase(StatusCodes.FORBIDDEN), | |||
|         StatusCodes.FORBIDDEN | |||
|       ); | |||
|     } | |||
| 
 | |||
|     return benchmarks.map(({ symbol }) => { | |||
|       return symbol; | |||
|     }); | |||
|   } | |||
| 
 | |||
|   @Get('benchmarks/:symbol') | |||
|   public async getBenchmark( | |||
|     @Headers('Authorization') apiToken: string, | |||
|     @Param('symbol') symbol: string | |||
|   ): Promise<{ date: Date; marketPrice: number }[]> { | |||
|     if (!isApiTokenAuthorized(apiToken)) { | |||
|       throw new HttpException( | |||
|         getReasonPhrase(StatusCodes.FORBIDDEN), | |||
|         StatusCodes.FORBIDDEN | |||
|       ); | |||
|     } | |||
| 
 | |||
|     const marketData = await this.experimentalService.getBenchmark(symbol); | |||
| 
 | |||
|     if (marketData?.length === 0) { | |||
|       throw new HttpException( | |||
|         getReasonPhrase(StatusCodes.NOT_FOUND), | |||
|         StatusCodes.NOT_FOUND | |||
|       ); | |||
|     } | |||
| 
 | |||
|     return marketData; | |||
|   } | |||
| } | |||
| @ -1,23 +0,0 @@ | |||
| import { AccountService } from '@ghostfolio/api/app/account/account.service'; | |||
| import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; | |||
| import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; | |||
| import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; | |||
| import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data.module'; | |||
| import { PrismaModule } from '@ghostfolio/api/services/prisma.module'; | |||
| import { Module } from '@nestjs/common'; | |||
| 
 | |||
| import { ExperimentalController } from './experimental.controller'; | |||
| import { ExperimentalService } from './experimental.service'; | |||
| 
 | |||
| @Module({ | |||
|   imports: [ | |||
|     ConfigurationModule, | |||
|     DataProviderModule, | |||
|     ExchangeRateDataModule, | |||
|     RedisCacheModule, | |||
|     PrismaModule | |||
|   ], | |||
|   controllers: [ExperimentalController], | |||
|   providers: [AccountService, ExperimentalService] | |||
| }) | |||
| export class ExperimentalModule {} | |||
| @ -1,23 +0,0 @@ | |||
| import { AccountService } from '@ghostfolio/api/app/account/account.service'; | |||
| import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; | |||
| import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; | |||
| import { PrismaService } from '@ghostfolio/api/services/prisma.service'; | |||
| import { Injectable } from '@nestjs/common'; | |||
| 
 | |||
| @Injectable() | |||
| export class ExperimentalService { | |||
|   public constructor( | |||
|     private readonly accountService: AccountService, | |||
|     private readonly dataProviderService: DataProviderService, | |||
|     private readonly exchangeRateDataService: ExchangeRateDataService, | |||
|     private readonly prismaService: PrismaService | |||
|   ) {} | |||
| 
 | |||
|   public async getBenchmark(aSymbol: string) { | |||
|     return this.prismaService.marketData.findMany({ | |||
|       orderBy: { date: 'asc' }, | |||
|       select: { date: true, marketPrice: true }, | |||
|       where: { symbol: aSymbol } | |||
|     }); | |||
|   } | |||
| } | |||
| @ -1,4 +0,0 @@ | |||
| export interface Data { | |||
|   currency: string; | |||
|   value: number; | |||
| } | |||
					Loading…
					
					
				
		Reference in new issue