From ea1ba91a96b9a00ec45082522c5d65a25dc01387 Mon Sep 17 00:00:00 2001 From: Thomas <4159106+dtslvr@users.noreply.github.com> Date: Thu, 16 Mar 2023 20:37:43 +0100 Subject: [PATCH] Extend pricing page --- apps/api/src/app/symbol/symbol.controller.ts | 13 ++++++-- apps/api/src/app/symbol/symbol.service.ts | 20 +++++++++--- .../data-provider/data-provider.service.ts | 32 +++++++++++++++---- .../subscription-interstitial-dialog.html | 8 +++-- .../src/app/pages/pricing/pricing-page.html | 7 ++++ 5 files changed, 66 insertions(+), 14 deletions(-) diff --git a/apps/api/src/app/symbol/symbol.controller.ts b/apps/api/src/app/symbol/symbol.controller.ts index 249284ea8..6003c50d3 100644 --- a/apps/api/src/app/symbol/symbol.controller.ts +++ b/apps/api/src/app/symbol/symbol.controller.ts @@ -1,15 +1,18 @@ import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor'; import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response.interceptor'; import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import type { RequestWithUser } from '@ghostfolio/common/types'; import { Controller, Get, HttpException, + Inject, Param, Query, UseGuards, UseInterceptors } from '@nestjs/common'; +import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; import { DataSource } from '@prisma/client'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; @@ -21,7 +24,10 @@ import { SymbolService } from './symbol.service'; @Controller('symbol') export class SymbolController { - public constructor(private readonly symbolService: SymbolService) {} + public constructor( + @Inject(REQUEST) private readonly request: RequestWithUser, + private readonly symbolService: SymbolService + ) {} /** * Must be before /:symbol @@ -33,7 +39,10 @@ export class SymbolController { @Query() { query = '' } ): Promise<{ items: LookupItem[] }> { try { - return this.symbolService.lookup(query.toLowerCase()); + return this.symbolService.lookup({ + query: query.toLowerCase(), + user: this.request.user + }); } catch { throw new HttpException( getReasonPhrase(StatusCodes.INTERNAL_SERVER_ERROR), diff --git a/apps/api/src/app/symbol/symbol.service.ts b/apps/api/src/app/symbol/symbol.service.ts index 7a5f5586d..718387b3b 100644 --- a/apps/api/src/app/symbol/symbol.service.ts +++ b/apps/api/src/app/symbol/symbol.service.ts @@ -5,7 +5,10 @@ import { } from '@ghostfolio/api/services/interfaces/interfaces'; import { MarketDataService } from '@ghostfolio/api/services/market-data.service'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; -import { HistoricalDataItem } from '@ghostfolio/common/interfaces'; +import { + HistoricalDataItem, + UserWithSettings +} from '@ghostfolio/common/interfaces'; import { Injectable, Logger } from '@nestjs/common'; import { format, subDays } from 'date-fns'; @@ -79,15 +82,24 @@ export class SymbolService { }; } - public async lookup(aQuery: string): Promise<{ items: LookupItem[] }> { + public async lookup({ + query, + user + }: { + query: string; + user: UserWithSettings; + }): Promise<{ items: LookupItem[] }> { const results: { items: LookupItem[] } = { items: [] }; - if (!aQuery) { + if (!query) { return results; } try { - const { items } = await this.dataProviderService.search(aQuery); + const { items } = await this.dataProviderService.search({ + query, + user + }); results.items = items; return results; } catch (error) { diff --git a/apps/api/src/services/data-provider/data-provider.service.ts b/apps/api/src/services/data-provider/data-provider.service.ts index 9edeedc1c..5b45c12f8 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -8,6 +8,7 @@ import { } from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma.service'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; +import { UserWithSettings } from '@ghostfolio/common/interfaces'; import { Granularity } from '@ghostfolio/common/types'; import { Inject, Injectable, Logger } from '@nestjs/common'; import { DataSource, MarketData, SymbolProfile } from '@prisma/client'; @@ -260,18 +261,33 @@ export class DataProviderService { return response; } - public async search(aQuery: string): Promise<{ items: LookupItem[] }> { + public async search({ + query, + user + }: { + query: string; + user: UserWithSettings; + }): Promise<{ items: LookupItem[] }> { const promises: Promise<{ items: LookupItem[] }>[] = []; let lookupItems: LookupItem[] = []; - if (aQuery?.length < 2) { + if (query?.length < 2) { return { items: lookupItems }; } - for (const dataSource of this.configurationService.get('DATA_SOURCES')) { - promises.push( - this.getDataProvider(DataSource[dataSource]).search(aQuery) - ); + let dataSources = this.configurationService.get('DATA_SOURCES'); + + if ( + this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && + user.subscription.type === 'Basic' + ) { + dataSources = dataSources.filter((dataSource) => { + return !this.isPremiumDataSource(DataSource[dataSource]); + }); + } + + for (const dataSource of dataSources) { + promises.push(this.getDataProvider(DataSource[dataSource]).search(query)); } const searchResults = await Promise.all(promises); @@ -305,4 +321,8 @@ export class DataProviderService { throw new Error('No data provider has been found.'); } + + private isPremiumDataSource(aDataSource: DataSource) { + return aDataSource === DataSource.EOD_HISTORICAL_DATA; + } } diff --git a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html index 061b43e3d..321ab1e13 100644 --- a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html +++ b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -19,16 +19,20 @@