Browse Source

Task/rename SymbolProfileOverrides to AssetProfileOverrides (#7271)

* Rename SymbolProfileOverrides to AssetProfileOverrides

* Update changelog
pull/6716/merge
Thomas Kaul 6 days ago
committed by GitHub
parent
commit
9b590efa87
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      CHANGELOG.md
  2. 6
      apps/api/src/app/activities/activities.service.ts
  3. 4
      apps/api/src/app/admin/admin.service.ts
  4. 6
      apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts
  5. 24
      apps/api/src/services/symbol-profile/symbol-profile.service.ts
  6. 6
      libs/common/src/lib/helper.ts
  7. 46
      prisma/schema.prisma

1
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 portfolio holdings page
- Set the change detection strategy to `OnPush` in the _FIRE_ 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 - 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 Dutch (`nl`)
- Improved the language localization for French (`fr`) - Improved the language localization for French (`fr`)
- Improved the language localization for German (`de`) - Improved the language localization for German (`de`)

6
apps/api/src/app/activities/activities.service.ts

@ -615,14 +615,14 @@ export class ActivitiesService {
}, },
{ {
OR: [ OR: [
{ SymbolProfileOverrides: { is: null } }, { assetProfileOverrides: { is: null } },
{ SymbolProfileOverrides: { assetClass: null } } { assetProfileOverrides: { assetClass: null } }
] ]
} }
] ]
}, },
{ {
SymbolProfileOverrides: { assetProfileOverrides: {
OR: filtersByAssetClass.map(({ id }) => { OR: filtersByAssetClass.map(({ id }) => {
return { assetClass: AssetClass[id] }; return { assetClass: AssetClass[id] };
}) })

4
apps/api/src/app/admin/admin.service.ts

@ -299,7 +299,7 @@ export class AdminService {
); );
} }
} else { } else {
const symbolProfileOverrides = { const assetProfileOverrides = {
assetClass: assetClass as AssetClass, assetClass: assetClass as AssetClass,
assetSubClass: assetSubClass as AssetSubClass, assetSubClass: assetSubClass as AssetSubClass,
countries: countries as Prisma.JsonArray, countries: countries as Prisma.JsonArray,
@ -320,7 +320,7 @@ export class AdminService {
symbolMapping, symbolMapping,
...this.symbolProfileService.getAssetProfileUpdateInput( ...this.symbolProfileService.getAssetProfileUpdateInput(
{ dataSource, symbol }, { dataSource, symbol },
symbolProfileOverrides assetProfileOverrides
) )
}; };

6
apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts

@ -198,6 +198,7 @@ export class AssetProfilesService {
take: 1 take: 1
}, },
assetClass: true, assetClass: true,
assetProfileOverrides: true,
assetSubClass: true, assetSubClass: true,
comment: true, comment: true,
countries: true, countries: true,
@ -210,8 +211,7 @@ export class AssetProfilesService {
name: true, name: true,
scraperConfiguration: true, scraperConfiguration: true,
sectors: true, sectors: true,
symbol: true, symbol: true
SymbolProfileOverrides: true
} }
}), }),
this.prismaService.symbolProfile.count({ where }) this.prismaService.symbolProfile.count({ where })
@ -268,7 +268,7 @@ export class AssetProfilesService {
const { assetClass, assetSubClass, countries, name, sectors } = const { assetClass, assetSubClass, countries, name, sectors } =
applyAssetProfileOverrides( applyAssetProfileOverrides(
assetProfile, assetProfile,
assetProfile.SymbolProfileOverrides assetProfile.assetProfileOverrides
); );
const countriesCount = countries ? Object.keys(countries).length : 0; const countriesCount = countries ? Object.keys(countries).length : 0;

24
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 { Injectable } from '@nestjs/common';
import { import {
AssetProfileOverrides,
DataSource, DataSource,
Prisma, Prisma,
SymbolProfile, SymbolProfile
SymbolProfileOverrides
} from '@prisma/client'; } from '@prisma/client';
import { continents, countries } from 'countries-list'; import { continents, countries } from 'countries-list';
@ -85,12 +85,12 @@ export class SymbolProfileService {
} }
return { return {
SymbolProfileOverrides: { assetProfileOverrides: {
upsert: { upsert: {
create: create:
data as Prisma.SymbolProfileOverridesCreateWithoutSymbolProfileInput, data as Prisma.AssetProfileOverridesCreateWithoutSymbolProfileInput,
update: update:
data as Prisma.SymbolProfileOverridesUpdateWithoutSymbolProfileInput data as Prisma.AssetProfileOverridesUpdateWithoutSymbolProfileInput
} }
} }
}; };
@ -112,7 +112,7 @@ export class SymbolProfileService {
select: { date: true }, select: { date: true },
take: 1 take: 1
}, },
SymbolProfileOverrides: true assetProfileOverrides: true
}, },
where: { where: {
OR: aAssetProfileIdentifiers.map(({ dataSource, symbol }) => { OR: aAssetProfileIdentifiers.map(({ dataSource, symbol }) => {
@ -137,7 +137,7 @@ export class SymbolProfileService {
_count: { _count: {
select: { activities: true, watchedBy: true } select: { activities: true, watchedBy: true }
}, },
SymbolProfileOverrides: true assetProfileOverrides: true
}, },
where: { where: {
id: { id: {
@ -174,6 +174,7 @@ export class SymbolProfileService {
{ dataSource, symbol }: AssetProfileIdentifier, { dataSource, symbol }: AssetProfileIdentifier,
{ {
assetClass, assetClass,
assetProfileOverrides,
assetSubClass, assetSubClass,
comment, comment,
countries, countries,
@ -185,13 +186,13 @@ export class SymbolProfileService {
scraperConfiguration, scraperConfiguration,
sectors, sectors,
symbolMapping, symbolMapping,
SymbolProfileOverrides,
url url
}: Prisma.SymbolProfileUpdateInput }: Prisma.SymbolProfileUpdateInput
) { ) {
return this.prismaService.symbolProfile.update({ return this.prismaService.symbolProfile.update({
data: { data: {
assetClass, assetClass,
assetProfileOverrides,
assetSubClass, assetSubClass,
comment, comment,
countries, countries,
@ -203,7 +204,6 @@ export class SymbolProfileService {
scraperConfiguration, scraperConfiguration,
sectors, sectors,
symbolMapping, symbolMapping,
SymbolProfileOverrides,
url url
}, },
where: { dataSource_symbol: { dataSource, symbol } } where: { dataSource_symbol: { dataSource, symbol } }
@ -216,13 +216,13 @@ export class SymbolProfileService {
activities?: { activities?: {
date: Date; date: Date;
}[]; }[];
SymbolProfileOverrides: SymbolProfileOverrides; assetProfileOverrides: AssetProfileOverrides;
})[] })[]
): EnhancedSymbolProfile[] { ): EnhancedSymbolProfile[] {
return symbolProfiles.map((symbolProfile) => { return symbolProfiles.map((symbolProfile) => {
const symbolProfileWithOverrides = applyAssetProfileOverrides( const symbolProfileWithOverrides = applyAssetProfileOverrides(
symbolProfile, symbolProfile,
symbolProfile.SymbolProfileOverrides symbolProfile.assetProfileOverrides
); );
const item = { const item = {
@ -252,7 +252,7 @@ export class SymbolProfileService {
item.dateOfFirstActivity = symbolProfile.activities?.[0]?.date; item.dateOfFirstActivity = symbolProfile.activities?.[0]?.date;
delete item.activities; delete item.activities;
delete item.SymbolProfileOverrides; delete item.assetProfileOverrides;
return item; return item;
}); });

6
libs/common/src/lib/helper.ts

@ -1,10 +1,10 @@
import { NumberParser } from '@internationalized/number'; import { NumberParser } from '@internationalized/number';
import { import {
Type as ActivityType, Type as ActivityType,
AssetProfileOverrides,
MarketData, MarketData,
Prisma, Prisma,
SymbolProfile, SymbolProfile
SymbolProfileOverrides
} from '@prisma/client'; } from '@prisma/client';
import { Big } from 'big.js'; import { Big } from 'big.js';
import { isISO4217CurrencyCode } from 'class-validator'; import { isISO4217CurrencyCode } from 'class-validator';
@ -56,7 +56,7 @@ export const DATE_FORMAT_YEARLY = 'yyyy';
export function applyAssetProfileOverrides<T extends Partial<SymbolProfile>>( export function applyAssetProfileOverrides<T extends Partial<SymbolProfile>>(
assetProfile: T, assetProfile: T,
assetProfileOverrides: SymbolProfileOverrides | null assetProfileOverrides: AssetProfileOverrides | null
): T { ): T {
if (!assetProfileOverrides) { if (!assetProfileOverrides) {
return assetProfile; return assetProfile;

46
prisma/schema.prisma

@ -90,6 +90,21 @@ model ApiKey {
@@index([userId]) @@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 { model AssetProfileResolution {
createdAt DateTime @default(now()) createdAt DateTime @default(now())
currency String currency String
@ -187,32 +202,32 @@ model Settings {
model SymbolProfile { model SymbolProfile {
activities Order[] activities Order[]
assetClass AssetClass? assetClass AssetClass?
assetProfileOverrides AssetProfileOverrides?
assetSubClass AssetSubClass? assetSubClass AssetSubClass?
comment String? comment String?
countries Json? countries Json?
createdAt DateTime @default(now()) createdAt DateTime @default(now())
currency String currency String
cusip String? cusip String?
dataGatheringFrequency DataGatheringFrequency @default(DAILY) dataGatheringFrequency DataGatheringFrequency @default(DAILY)
dataSource DataSource dataSource DataSource
figi String? figi String?
figiComposite String? figiComposite String?
figiShareClass String? figiShareClass String?
holdings Json? @default("[]") holdings Json? @default("[]")
id String @id @default(uuid()) id String @id @default(uuid())
isActive Boolean @default(true) isActive Boolean @default(true)
isin String? isin String?
name String? name String?
scraperConfiguration Json? scraperConfiguration Json?
sectors Json? sectors Json?
symbol String symbol String
symbolMapping Json? symbolMapping Json?
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
url String? url String?
user User? @relation(fields: [userId], onDelete: Cascade, references: [id]) user User? @relation(fields: [userId], onDelete: Cascade, references: [id])
userId String? userId String?
watchedBy User[] @relation("UserWatchlist") watchedBy User[] @relation("UserWatchlist")
SymbolProfileOverrides SymbolProfileOverrides?
@@unique([dataSource, symbol]) @@unique([dataSource, symbol])
@@index([assetClass]) @@index([assetClass])
@ -226,19 +241,6 @@ model SymbolProfile {
@@index([symbol]) @@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 { model Subscription {
createdAt DateTime @default(now()) createdAt DateTime @default(now())
expiresAt DateTime expiresAt DateTime

Loading…
Cancel
Save