Browse Source

Fix unused custom asset profiles created by activities import

pull/7673/head
Thomas Kaul 1 week ago
parent
commit
577934b1e0
  1. 62
      apps/api/src/app/import/import.service.ts
  2. 5
      apps/api/src/services/data-provider/data-provider.service.ts

62
apps/api/src/app/import/import.service.ts

@ -534,6 +534,12 @@ export class ImportService {
} }
} }
const assetProfilesToCreate: {
assetProfile: Prisma.SymbolProfileCreateInput;
assetProfileIdentifier: string;
marketDataObjects: Prisma.MarketDataUpdateInput[];
}[] = [];
if (assetProfilesWithMarketDataDto?.length) { if (assetProfilesWithMarketDataDto?.length) {
const customAssetProfileNames = assetProfilesWithMarketDataDto const customAssetProfileNames = assetProfilesWithMarketDataDto
.filter(({ dataSource, name }) => { .filter(({ dataSource, name }) => {
@ -557,6 +563,7 @@ export class ImportService {
]); ]);
for (const assetProfileWithMarketData of assetProfilesWithMarketDataDto) { for (const assetProfileWithMarketData of assetProfilesWithMarketDataDto) {
let assetProfileToCreate: Prisma.SymbolProfileCreateInput;
let symbol = assetProfileWithMarketData.symbol; let symbol = assetProfileWithMarketData.symbol;
// Check if there is any existing asset profile // Check if there is any existing asset profile
@ -605,13 +612,10 @@ export class ImportService {
assetProfile.symbol = symbol; assetProfile.symbol = symbol;
if (!isDryRun) { if (!isDryRun) {
// Create a new asset profile assetProfileToCreate = {
const assetProfileObject: Prisma.SymbolProfileCreateInput = {
...assetProfile, ...assetProfile,
user: { connect: { id: user.id } } user: { connect: { id: user.id } }
}; };
await this.symbolProfileService.add(assetProfileObject);
} }
} }
@ -625,7 +629,6 @@ export class ImportService {
} }
if (!isDryRun) { if (!isDryRun) {
// Insert or update market data
const marketDataObjects = ( const marketDataObjects = (
assetProfileWithMarketData.marketData ?? [] assetProfileWithMarketData.marketData ?? []
).map((marketData) => { ).map((marketData) => {
@ -636,7 +639,23 @@ export class ImportService {
} as Prisma.MarketDataUpdateInput; } as Prisma.MarketDataUpdateInput;
}); });
await this.marketDataService.updateMany({ data: marketDataObjects }); if (assetProfileToCreate) {
// Create the new asset profile and its market data later, once it
// is known which activities are imported
assetProfilesToCreate.push({
marketDataObjects,
assetProfile: assetProfileToCreate,
assetProfileIdentifier: getAssetProfileIdentifier({
symbol,
dataSource: assetProfileWithMarketData.dataSource
})
});
} else {
// Insert or update market data
await this.marketDataService.updateMany({
data: marketDataObjects
});
}
} }
} }
} }
@ -719,6 +738,37 @@ export class ImportService {
return id === TAG_ID_DRAFT; return id === TAG_ID_DRAFT;
}) ?? { id: TAG_ID_DRAFT, name: 'DRAFT' }; }) ?? { id: TAG_ID_DRAFT, name: 'DRAFT' };
if (assetProfilesToCreate.length) {
// Create the new asset profiles of the activities to import only, so
// that no unused asset profile remains, for example if an activity is a
// duplicate. An asset profile which is created before the validation of
// the activities would stay behind, because the import is not rolled
// back on an error.
const assetProfileIdentifiersToImport = new Set(
activitiesExtendedWithErrors
.filter(({ error }) => {
return !error;
})
.map(({ assetProfile }) => {
return getAssetProfileIdentifier(assetProfile);
})
);
for (const {
assetProfile,
assetProfileIdentifier,
marketDataObjects
} of assetProfilesToCreate) {
if (!assetProfileIdentifiersToImport.has(assetProfileIdentifier)) {
continue;
}
await this.symbolProfileService.add(assetProfile);
await this.marketDataService.updateMany({ data: marketDataObjects });
}
}
const activities: Activity[] = []; const activities: Activity[] = [];
for (const activity of activitiesExtendedWithErrors) { for (const activity of activitiesExtendedWithErrors) {

5
apps/api/src/services/data-provider/data-provider.service.ts

@ -298,14 +298,15 @@ export class DataProviderService implements OnModuleInit {
let assetProfile: Partial<SymbolProfile> = { currency }; let assetProfile: Partial<SymbolProfile> = { currency };
try { try {
assetProfile = ( assetProfile =
(
await this.getAssetProfiles([ await this.getAssetProfiles([
{ {
dataSource, dataSource,
symbol symbol
} }
]) ])
)?.[assetProfileIdentifier]; )?.[assetProfileIdentifier] ?? assetProfile;
} catch {} } catch {}
if (!assetProfile?.name) { if (!assetProfile?.name) {

Loading…
Cancel
Save