diff --git a/apps/api/src/helper/data-source.helper.ts b/apps/api/src/helper/data-source.helper.ts new file mode 100644 index 000000000..c4a55c9da --- /dev/null +++ b/apps/api/src/helper/data-source.helper.ts @@ -0,0 +1,13 @@ +import { DataSource } from '@prisma/client'; + +export function getMaskedGhostfolioDataSource({ + dataSource, + ghostfolioDataSources +}: { + dataSource: DataSource; + ghostfolioDataSources: string[]; +}) { + return ghostfolioDataSources.includes(dataSource) + ? DataSource.GHOSTFOLIO + : dataSource; +} diff --git a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts index fb8ff5dc5..ddcf30b0c 100644 --- a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts +++ b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts @@ -1,3 +1,4 @@ +import { getMaskedGhostfolioDataSource } from '@ghostfolio/api/helper/data-source.helper'; import { redactPaths } from '@ghostfolio/api/helper/object.helper'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { encodeDataSource } from '@ghostfolio/common/helper'; @@ -51,10 +52,15 @@ export class TransformDataSourceInResponseInterceptor< const valueMap = this.encodedDataSourceMap; if (isExportMode) { - for (const dataSource of this.configurationService.get( + const ghostfolioDataSources = this.configurationService.get( 'DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER' - )) { - valueMap[dataSource] = 'GHOSTFOLIO'; + ) as DataSource[]; + + for (const dataSource of ghostfolioDataSources) { + valueMap[dataSource] = getMaskedGhostfolioDataSource({ + dataSource, + ghostfolioDataSources + }); } } 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 10b0e6fd8..c6e9c83c1 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -1,5 +1,6 @@ import { ImportDataDto } from '@ghostfolio/api/app/import/import-data.dto'; import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; +import { getMaskedGhostfolioDataSource } from '@ghostfolio/api/helper/data-source.helper'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; @@ -221,6 +222,9 @@ export class DataProviderService implements OnModuleInit { } = {}; const dataSources = await this.getDataSources(); + const ghostfolioDataSources = this.configurationService.get( + 'DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER' + ); for (const [ index, @@ -228,6 +232,10 @@ export class DataProviderService implements OnModuleInit { ] of activitiesDto.entries()) { const activityPath = maxActivitiesToImport === 1 ? 'activity' : `activities.${index}`; + const maskedDataSource = getMaskedGhostfolioDataSource({ + dataSource, + ghostfolioDataSources + }); if (!dataSources.includes(dataSource)) { throw new Error( @@ -243,7 +251,7 @@ export class DataProviderService implements OnModuleInit { if (dataProvider.getDataProviderInfo().isPremium) { throw new Error( - `${activityPath}.dataSource ("${dataSource}") is not valid` + `${activityPath}.dataSource ("${maskedDataSource}") requires Ghostfolio Premium` ); } } @@ -306,7 +314,7 @@ export class DataProviderService implements OnModuleInit { if (!assetProfile?.name) { throw new Error( - `activities.${index}.symbol ("${symbol}") is not valid for the specified data source ("${dataSource}")` + `activities.${index}.symbol ("${symbol}") is not valid for the specified data source ("${maskedDataSource}")` ); }