diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 5718db449..7e7202306 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -603,21 +603,14 @@ export class AdminService { comment, currency, dataSource, - holdings, isActive, scraperConfiguration, symbol, symbolMapping, - ...(dataSource === 'MANUAL' - ? { assetClass, assetSubClass, countries, name, sectors, url } - : { - SymbolProfileOverrides: { - upsert: { - create: symbolProfileOverrides, - update: symbolProfileOverrides - } - } - }) + ...this.symbolProfileService.getAssetProfileUpdateInput( + { dataSource, symbol }, + symbolProfileOverrides + ) }; await this.symbolProfileService.updateSymbolProfile( 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 b8199061f..9fa3ec47c 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 @@ -6,7 +6,7 @@ import { } from '@ghostfolio/common/interfaces'; import { Injectable, NotFoundException } from '@nestjs/common'; -import { DataSource, Prisma } from '@prisma/client'; +import { Prisma } from '@prisma/client'; @Injectable() export class AssetProfilesService { @@ -42,16 +42,10 @@ export class AssetProfilesService { dataSource, symbol }, - dataSource === DataSource.MANUAL - ? data - : { - SymbolProfileOverrides: { - upsert: { - create: data, - update: data - } - } - } + this.symbolProfileService.getAssetProfileUpdateInput( + { dataSource, symbol }, + data + ) ); const [updatedAssetProfile] = 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 413b7db03..2d5116274 100644 --- a/apps/api/src/services/symbol-profile/symbol-profile.service.ts +++ b/apps/api/src/services/symbol-profile/symbol-profile.service.ts @@ -11,7 +11,12 @@ import { Country } from '@ghostfolio/common/interfaces/country.interface'; import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; import { Injectable } from '@nestjs/common'; -import { Prisma, SymbolProfile, SymbolProfileOverrides } from '@prisma/client'; +import { + DataSource, + Prisma, + SymbolProfile, + SymbolProfileOverrides +} from '@prisma/client'; import { continents, countries } from 'countries-list'; @Injectable() @@ -71,6 +76,26 @@ export class SymbolProfileService { }); } + public getAssetProfileUpdateInput( + { dataSource }: AssetProfileIdentifier, + data: Prisma.SymbolProfileUpdateInput + ): Prisma.SymbolProfileUpdateInput { + if (dataSource === DataSource.MANUAL) { + return data; + } + + return { + SymbolProfileOverrides: { + upsert: { + create: + data as Prisma.SymbolProfileOverridesCreateWithoutSymbolProfileInput, + update: + data as Prisma.SymbolProfileOverridesUpdateWithoutSymbolProfileInput + } + } + }; + } + public async getSymbolProfiles( aAssetProfileIdentifiers: AssetProfileIdentifier[] ): Promise { diff --git a/libs/common/src/lib/dtos/update-asset-profile-data.dto.ts b/libs/common/src/lib/dtos/update-asset-profile-data.dto.ts index a2f600fcd..8d357ef3f 100644 --- a/libs/common/src/lib/dtos/update-asset-profile-data.dto.ts +++ b/libs/common/src/lib/dtos/update-asset-profile-data.dto.ts @@ -1,16 +1,9 @@ -import { Prisma } from '@prisma/client'; -import { IsArray, IsOptional } from 'class-validator'; +import { PickType } from '@nestjs/mapped-types'; -export class UpdateAssetProfileDataDto { - @IsArray() - @IsOptional() - countries?: Prisma.InputJsonArray; +import { UpdateAssetProfileDto } from './update-asset-profile.dto'; - @IsArray() - @IsOptional() - holdings?: Prisma.InputJsonArray; - - @IsArray() - @IsOptional() - sectors?: Prisma.InputJsonArray; -} +export class UpdateAssetProfileDataDto extends PickType(UpdateAssetProfileDto, [ + 'countries', + 'holdings', + 'sectors' +]) {} diff --git a/libs/common/src/lib/dtos/update-asset-profile.dto.ts b/libs/common/src/lib/dtos/update-asset-profile.dto.ts index a4981493e..1c8af3e72 100644 --- a/libs/common/src/lib/dtos/update-asset-profile.dto.ts +++ b/libs/common/src/lib/dtos/update-asset-profile.dto.ts @@ -36,6 +36,10 @@ export class UpdateAssetProfileDto { @IsOptional() dataSource?: DataSource; + @IsArray() + @IsOptional() + holdings?: Prisma.InputJsonArray; + @IsBoolean() @IsOptional() isActive?: boolean; diff --git a/package-lock.json b/package-lock.json index 26f8ee255..a302f259c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,6 +36,7 @@ "@nestjs/core": "11.1.21", "@nestjs/event-emitter": "3.1.0", "@nestjs/jwt": "11.0.2", + "@nestjs/mapped-types": "2.1.1", "@nestjs/passport": "11.0.5", "@nestjs/platform-express": "11.1.21", "@nestjs/schedule": "6.1.3", @@ -8279,6 +8280,26 @@ "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0" } }, + "node_modules/@nestjs/mapped-types": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.1.tgz", + "integrity": "sha512-SCCoMEJ6jdeI5h/N+KCVF1+pmg/hmEkNA5nHTS8Gvww7T/LCl4o1gFLinw2iQ60w7slFkszHcGLKGdazVI4F8A==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "class-transformer": "^0.4.0 || ^0.5.0", + "class-validator": "^0.13.0 || ^0.14.0 || ^0.15.0", + "reflect-metadata": "^0.1.12 || ^0.2.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, "node_modules/@nestjs/passport": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-11.0.5.tgz", diff --git a/package.json b/package.json index 04f125aa7..f61dc457e 100644 --- a/package.json +++ b/package.json @@ -80,6 +80,7 @@ "@nestjs/core": "11.1.21", "@nestjs/event-emitter": "3.1.0", "@nestjs/jwt": "11.0.2", + "@nestjs/mapped-types": "2.1.1", "@nestjs/passport": "11.0.5", "@nestjs/platform-express": "11.1.21", "@nestjs/schedule": "6.1.3",