From 9b590efa873c7da017c53d68f69c698580c398fb Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 8 Jul 2026 13:33:46 +0200 Subject: [PATCH] Task/rename SymbolProfileOverrides to AssetProfileOverrides (#7271) * Rename SymbolProfileOverrides to AssetProfileOverrides * Update changelog --- CHANGELOG.md | 1 + .../src/app/activities/activities.service.ts | 6 +-- apps/api/src/app/admin/admin.service.ts | 4 +- .../asset-profiles/asset-profiles.service.ts | 6 +-- .../symbol-profile/symbol-profile.service.ts | 24 +++++----- libs/common/src/lib/helper.ts | 6 +-- prisma/schema.prisma | 46 ++++++++++--------- 7 files changed, 48 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c6137890..3f2fc105d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Set the change detection strategy to `OnPush` in the portfolio holdings page - Set the change detection strategy to `OnPush` in the _FIRE_ page - Set the change detection strategy to `OnPush` in the users section of the admin control panel +- Renamed the `SymbolProfileOverrides` _Prisma_ data model to `AssetProfileOverrides` while keeping the database table name - Improved the language localization for Dutch (`nl`) - Improved the language localization for French (`fr`) - Improved the language localization for German (`de`) diff --git a/apps/api/src/app/activities/activities.service.ts b/apps/api/src/app/activities/activities.service.ts index b404b6a37..bd08d05f9 100644 --- a/apps/api/src/app/activities/activities.service.ts +++ b/apps/api/src/app/activities/activities.service.ts @@ -615,14 +615,14 @@ export class ActivitiesService { }, { OR: [ - { SymbolProfileOverrides: { is: null } }, - { SymbolProfileOverrides: { assetClass: null } } + { assetProfileOverrides: { is: null } }, + { assetProfileOverrides: { assetClass: null } } ] } ] }, { - SymbolProfileOverrides: { + assetProfileOverrides: { OR: filtersByAssetClass.map(({ id }) => { return { assetClass: AssetClass[id] }; }) diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index e6f5fd700..81a48aff2 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -299,7 +299,7 @@ export class AdminService { ); } } else { - const symbolProfileOverrides = { + const assetProfileOverrides = { assetClass: assetClass as AssetClass, assetSubClass: assetSubClass as AssetSubClass, countries: countries as Prisma.JsonArray, @@ -320,7 +320,7 @@ export class AdminService { symbolMapping, ...this.symbolProfileService.getAssetProfileUpdateInput( { dataSource, symbol }, - symbolProfileOverrides + assetProfileOverrides ) }; diff --git a/apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts index 68b8d5627..b1a36df26 100644 --- a/apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts +++ b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts @@ -198,6 +198,7 @@ export class AssetProfilesService { take: 1 }, assetClass: true, + assetProfileOverrides: true, assetSubClass: true, comment: true, countries: true, @@ -210,8 +211,7 @@ export class AssetProfilesService { name: true, scraperConfiguration: true, sectors: true, - symbol: true, - SymbolProfileOverrides: true + symbol: true } }), this.prismaService.symbolProfile.count({ where }) @@ -268,7 +268,7 @@ export class AssetProfilesService { const { assetClass, assetSubClass, countries, name, sectors } = applyAssetProfileOverrides( assetProfile, - assetProfile.SymbolProfileOverrides + assetProfile.assetProfileOverrides ); const countriesCount = countries ? Object.keys(countries).length : 0; diff --git a/apps/api/src/services/symbol-profile/symbol-profile.service.ts b/apps/api/src/services/symbol-profile/symbol-profile.service.ts index 5d0968c5c..7157f0856 100644 --- a/apps/api/src/services/symbol-profile/symbol-profile.service.ts +++ b/apps/api/src/services/symbol-profile/symbol-profile.service.ts @@ -12,10 +12,10 @@ import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; import { Injectable } from '@nestjs/common'; import { + AssetProfileOverrides, DataSource, Prisma, - SymbolProfile, - SymbolProfileOverrides + SymbolProfile } from '@prisma/client'; import { continents, countries } from 'countries-list'; @@ -85,12 +85,12 @@ export class SymbolProfileService { } return { - SymbolProfileOverrides: { + assetProfileOverrides: { upsert: { create: - data as Prisma.SymbolProfileOverridesCreateWithoutSymbolProfileInput, + data as Prisma.AssetProfileOverridesCreateWithoutSymbolProfileInput, update: - data as Prisma.SymbolProfileOverridesUpdateWithoutSymbolProfileInput + data as Prisma.AssetProfileOverridesUpdateWithoutSymbolProfileInput } } }; @@ -112,7 +112,7 @@ export class SymbolProfileService { select: { date: true }, take: 1 }, - SymbolProfileOverrides: true + assetProfileOverrides: true }, where: { OR: aAssetProfileIdentifiers.map(({ dataSource, symbol }) => { @@ -137,7 +137,7 @@ export class SymbolProfileService { _count: { select: { activities: true, watchedBy: true } }, - SymbolProfileOverrides: true + assetProfileOverrides: true }, where: { id: { @@ -174,6 +174,7 @@ export class SymbolProfileService { { dataSource, symbol }: AssetProfileIdentifier, { assetClass, + assetProfileOverrides, assetSubClass, comment, countries, @@ -185,13 +186,13 @@ export class SymbolProfileService { scraperConfiguration, sectors, symbolMapping, - SymbolProfileOverrides, url }: Prisma.SymbolProfileUpdateInput ) { return this.prismaService.symbolProfile.update({ data: { assetClass, + assetProfileOverrides, assetSubClass, comment, countries, @@ -203,7 +204,6 @@ export class SymbolProfileService { scraperConfiguration, sectors, symbolMapping, - SymbolProfileOverrides, url }, where: { dataSource_symbol: { dataSource, symbol } } @@ -216,13 +216,13 @@ export class SymbolProfileService { activities?: { date: Date; }[]; - SymbolProfileOverrides: SymbolProfileOverrides; + assetProfileOverrides: AssetProfileOverrides; })[] ): EnhancedSymbolProfile[] { return symbolProfiles.map((symbolProfile) => { const symbolProfileWithOverrides = applyAssetProfileOverrides( symbolProfile, - symbolProfile.SymbolProfileOverrides + symbolProfile.assetProfileOverrides ); const item = { @@ -252,7 +252,7 @@ export class SymbolProfileService { item.dateOfFirstActivity = symbolProfile.activities?.[0]?.date; delete item.activities; - delete item.SymbolProfileOverrides; + delete item.assetProfileOverrides; return item; }); diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index f9dcd52cf..42aec19ac 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -1,10 +1,10 @@ import { NumberParser } from '@internationalized/number'; import { Type as ActivityType, + AssetProfileOverrides, MarketData, Prisma, - SymbolProfile, - SymbolProfileOverrides + SymbolProfile } from '@prisma/client'; import { Big } from 'big.js'; import { isISO4217CurrencyCode } from 'class-validator'; @@ -56,7 +56,7 @@ export const DATE_FORMAT_YEARLY = 'yyyy'; export function applyAssetProfileOverrides>( assetProfile: T, - assetProfileOverrides: SymbolProfileOverrides | null + assetProfileOverrides: AssetProfileOverrides | null ): T { if (!assetProfileOverrides) { return assetProfile; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index ed07d6f47..733399506 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -90,6 +90,21 @@ model ApiKey { @@index([userId]) } +model AssetProfileOverrides { + assetClass AssetClass? + assetSubClass AssetSubClass? + countries Json? @default("[]") + holdings Json? @default("[]") + name String? + sectors Json? @default("[]") + symbolProfile SymbolProfile @relation(fields: [symbolProfileId], onDelete: Cascade, references: [id]) + symbolProfileId String @id + updatedAt DateTime @updatedAt + url String? + + @@map("SymbolProfileOverrides") +} + model AssetProfileResolution { createdAt DateTime @default(now()) currency String @@ -187,32 +202,32 @@ model Settings { model SymbolProfile { activities Order[] assetClass AssetClass? + assetProfileOverrides AssetProfileOverrides? assetSubClass AssetSubClass? comment String? countries Json? - createdAt DateTime @default(now()) + createdAt DateTime @default(now()) currency String cusip String? - dataGatheringFrequency DataGatheringFrequency @default(DAILY) + dataGatheringFrequency DataGatheringFrequency @default(DAILY) dataSource DataSource figi String? figiComposite String? figiShareClass String? - holdings Json? @default("[]") - id String @id @default(uuid()) - isActive Boolean @default(true) + holdings Json? @default("[]") + id String @id @default(uuid()) + isActive Boolean @default(true) isin String? name String? scraperConfiguration Json? sectors Json? symbol String symbolMapping Json? - updatedAt DateTime @updatedAt + updatedAt DateTime @updatedAt url String? - user User? @relation(fields: [userId], onDelete: Cascade, references: [id]) + user User? @relation(fields: [userId], onDelete: Cascade, references: [id]) userId String? - watchedBy User[] @relation("UserWatchlist") - SymbolProfileOverrides SymbolProfileOverrides? + watchedBy User[] @relation("UserWatchlist") @@unique([dataSource, symbol]) @@index([assetClass]) @@ -226,19 +241,6 @@ model SymbolProfile { @@index([symbol]) } -model SymbolProfileOverrides { - assetClass AssetClass? - assetSubClass AssetSubClass? - countries Json? @default("[]") - holdings Json? @default("[]") - name String? - sectors Json? @default("[]") - symbolProfileId String @id - updatedAt DateTime @updatedAt - url String? - SymbolProfile SymbolProfile @relation(fields: [symbolProfileId], onDelete: Cascade, references: [id]) -} - model Subscription { createdAt DateTime @default(now()) expiresAt DateTime