mirror of https://github.com/ghostfolio/ghostfolio
Browse Source
* Eliminate redundant storage of historical exchange rates * Clean up experimental API * Update changelogpull/501/head
Thomas Kaul
3 years ago
committed by
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