From 0fdc209da547863bbc90ec06067136139b536893 Mon Sep 17 00:00:00 2001 From: Alexander Linder Date: Fri, 26 Jun 2026 22:19:16 +0200 Subject: [PATCH] Fix symbol mapping for manual assets --- .../data-gathering/data-gathering.service.ts | 48 +++++++++++++++---- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/apps/api/src/services/queues/data-gathering/data-gathering.service.ts b/apps/api/src/services/queues/data-gathering/data-gathering.service.ts index 1a2fa720e..b1eeb18b4 100644 --- a/apps/api/src/services/queues/data-gathering/data-gathering.service.ts +++ b/apps/api/src/services/queues/data-gathering/data-gathering.service.ts @@ -72,11 +72,7 @@ export class DataGatheringService { public async gatherAssetProfiles( aAssetProfileIdentifiers?: AssetProfileIdentifier[] ) { - let assetProfileIdentifiers = aAssetProfileIdentifiers?.filter( - (dataGatheringItem) => { - return dataGatheringItem.dataSource !== 'MANUAL'; - } - ); + let assetProfileIdentifiers = aAssetProfileIdentifiers; if (!assetProfileIdentifiers) { assetProfileIdentifiers = await this.getActiveAssetProfileIdentifiers(); @@ -86,10 +82,31 @@ export class DataGatheringService { return; } - const assetProfiles = await this.dataProviderService.getAssetProfiles( + const symbolProfiles = await this.symbolProfileService.getSymbolProfiles( assetProfileIdentifiers ); - const symbolProfiles = await this.symbolProfileService.getSymbolProfiles( + + // Exclude MANUAL asset profiles unless they define a symbol mapping that + // lets data enhancers gather profile data from another data source + assetProfileIdentifiers = assetProfileIdentifiers.filter( + ({ dataSource, symbol }) => { + if (dataSource !== 'MANUAL') { + return true; + } + + const symbolProfile = symbolProfiles.find((profile) => { + return profile.dataSource === dataSource && profile.symbol === symbol; + }); + + return !isEmpty(symbolProfile?.symbolMapping); + } + ); + + if (assetProfileIdentifiers.length <= 0) { + return; + } + + const assetProfiles = await this.dataProviderService.getAssetProfiles( assetProfileIdentifiers ); @@ -372,15 +389,16 @@ export class DataGatheringService { }: { maxAge?: StringValue; } = {}): Promise { - return this.prismaService.symbolProfile.findMany({ + const symbolProfiles = await this.prismaService.symbolProfile.findMany({ orderBy: [{ symbol: 'asc' }, { dataSource: 'asc' }], select: { dataSource: true, - symbol: true + symbol: true, + symbolMapping: true }, where: { dataSource: { - notIn: ['MANUAL', 'RAPID_API'] + not: 'RAPID_API' }, isActive: true, ...(maxAge && { @@ -390,6 +408,16 @@ export class DataGatheringService { }) } }); + + return symbolProfiles + .filter(({ dataSource, symbolMapping }) => { + // Include MANUAL asset profiles only when they define a symbol mapping + // that lets data enhancers gather profile data from another data source + return dataSource !== 'MANUAL' || !isEmpty(symbolMapping); + }) + .map(({ dataSource, symbol }) => { + return { dataSource, symbol }; + }); } private async getAssetProfileIdentifiersWithCompleteMarketData(): Promise<