From 25052127c2f63a45b66c34bd866abe48bb00f1d7 Mon Sep 17 00:00:00 2001 From: Dhoni77 Date: Sun, 22 Oct 2023 19:44:43 +0530 Subject: [PATCH] feat: extend asset profile dialog --- apps/api/src/app/admin/admin.service.ts | 6 +++ .../src/app/admin/update-asset-profile.dto.ts | 16 ++++++- .../symbol-profile/symbol-profile.service.ts | 14 +++++- .../asset-profile-dialog.component.ts | 46 +++++++++++++------ .../asset-profile-dialog.html | 42 +++++++++++++++-- .../asset-profile-dialog.module.ts | 2 + apps/client/src/app/services/admin.service.ts | 12 ++++- 7 files changed, 117 insertions(+), 21 deletions(-) diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 84ae5934c..a42723ba3 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -303,15 +303,21 @@ export class AdminService { } public async patchAssetProfileData({ + assetClass, + assetSubClass, comment, dataSource, + name, scraperConfiguration, symbol, symbolMapping }: Prisma.SymbolProfileUpdateInput & UniqueAsset) { await this.symbolProfileService.updateSymbolProfile({ + assetClass, + assetSubClass, comment, dataSource, + name, scraperConfiguration, symbol, symbolMapping diff --git a/apps/api/src/app/admin/update-asset-profile.dto.ts b/apps/api/src/app/admin/update-asset-profile.dto.ts index 54f2d8f25..a39f8db81 100644 --- a/apps/api/src/app/admin/update-asset-profile.dto.ts +++ b/apps/api/src/app/admin/update-asset-profile.dto.ts @@ -1,11 +1,23 @@ -import { Prisma } from '@prisma/client'; -import { IsObject, IsOptional, IsString } from 'class-validator'; +import { AssetClass, AssetSubClass, Prisma } from '@prisma/client'; +import { IsEnum, IsObject, IsOptional, IsString } from 'class-validator'; export class UpdateAssetProfileDto { + @IsEnum(AssetClass, { each: true }) + @IsOptional() + assetClass?: AssetClass; + + @IsEnum(AssetSubClass, { each: true }) + @IsOptional() + assetSubClass?: AssetSubClass; + @IsString() @IsOptional() comment?: string; + @IsString() + @IsOptional() + name?: string; + @IsObject() @IsOptional() scraperConfiguration?: Prisma.InputJsonObject; 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 b861ccf8f..04c6000d0 100644 --- a/apps/api/src/services/symbol-profile/symbol-profile.service.ts +++ b/apps/api/src/services/symbol-profile/symbol-profile.service.ts @@ -13,7 +13,7 @@ import { continents, countries } from 'countries-list'; @Injectable() export class SymbolProfileService { - public constructor(private readonly prismaService: PrismaService) {} + public constructor(private readonly prismaService: PrismaService) { } public async add( assetProfile: Prisma.SymbolProfileCreateInput @@ -86,14 +86,24 @@ export class SymbolProfileService { } public updateSymbolProfile({ + assetClass, + assetSubClass, comment, dataSource, + name, scraperConfiguration, symbol, symbolMapping }: Prisma.SymbolProfileUpdateInput & UniqueAsset) { return this.prismaService.symbolProfile.update({ - data: { comment, scraperConfiguration, symbolMapping }, + data: { + assetClass, + assetSubClass, + comment, + name, + scraperConfiguration, + symbolMapping + }, where: { dataSource_symbol: { dataSource, symbol } } }); } diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts index ccb6f3ccd..87e2be2d9 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts @@ -6,7 +6,7 @@ import { OnDestroy, OnInit } from '@angular/core'; -import { FormBuilder } from '@angular/forms'; +import { FormBuilder, FormControl, Validators } from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { UpdateAssetProfileDto } from '@ghostfolio/api/app/admin/update-asset-profile.dto'; import { AdminService } from '@ghostfolio/client/services/admin.service'; @@ -17,7 +17,12 @@ import { UniqueAsset } from '@ghostfolio/common/interfaces'; import { translate } from '@ghostfolio/ui/i18n'; -import { MarketData, SymbolProfile } from '@prisma/client'; +import { + AssetClass, + AssetSubClass, + MarketData, + SymbolProfile +} from '@prisma/client'; import { format, parseISO } from 'date-fns'; import { parse as csvToJson } from 'papaparse'; import { Subject } from 'rxjs'; @@ -33,14 +38,23 @@ import { AssetProfileDialogParams } from './interfaces/interfaces'; styleUrls: ['./asset-profile-dialog.component.scss'] }) export class AssetProfileDialog implements OnDestroy, OnInit { - public assetClass: string; + public assetProfileClass: string; + public assetClasses = Object.keys(AssetClass).map((assetClass) => { + return { id: assetClass, label: translate(assetClass) }; + }); + public assetSubClasses = Object.keys(AssetSubClass).map((assetSubClass) => { + return { id: assetSubClass, label: translate(assetSubClass) }; + }); public assetProfile: AdminMarketDataDetails['assetProfile']; public assetProfileForm = this.formBuilder.group({ + assetClass: new FormControl(undefined), + assetSubClass: new FormControl(undefined), comment: '', + name: ['', Validators.required], scraperConfiguration: '', symbolMapping: '' }); - public assetSubClass: string; + public assetProfileSubClass: string; public benchmarks: Partial[]; public countries: { [code: string]: { name: string; value: number }; @@ -65,7 +79,7 @@ export class AssetProfileDialog implements OnDestroy, OnInit { private dataService: DataService, public dialogRef: MatDialogRef, private formBuilder: FormBuilder - ) {} + ) { } public ngOnInit(): void { this.benchmarks = this.dataService.fetchInfo().benchmarks; @@ -86,8 +100,8 @@ export class AssetProfileDialog implements OnDestroy, OnInit { .subscribe(({ assetProfile, marketData }) => { this.assetProfile = assetProfile; - this.assetClass = translate(this.assetProfile?.assetClass); - this.assetSubClass = translate(this.assetProfile?.assetSubClass); + this.assetProfileClass = translate(this.assetProfile?.assetClass); + this.assetProfileSubClass = translate(this.assetProfile?.assetSubClass); this.countries = {}; this.isBenchmark = this.benchmarks.some(({ id }) => { return id === this.assetProfile.id; @@ -114,6 +128,9 @@ export class AssetProfileDialog implements OnDestroy, OnInit { } this.assetProfileForm.setValue({ + name: this.assetProfile.name, + assetClass: this.assetProfile.assetClass, + assetSubClass: this.assetProfile.assetSubClass, comment: this.assetProfile?.comment ?? '', scraperConfiguration: JSON.stringify( this.assetProfile?.scraperConfiguration ?? {} @@ -135,14 +152,14 @@ export class AssetProfileDialog implements OnDestroy, OnInit { this.adminService .gatherProfileDataBySymbol({ dataSource, symbol }) .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(() => {}); + .subscribe(() => { }); } public onGatherSymbol({ dataSource, symbol }: UniqueAsset) { this.adminService .gatherSymbol({ dataSource, symbol }) .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(() => {}); + .subscribe(() => { }); } public onImportHistoricalData() { @@ -195,18 +212,21 @@ export class AssetProfileDialog implements OnDestroy, OnInit { scraperConfiguration = JSON.parse( this.assetProfileForm.controls['scraperConfiguration'].value ); - } catch {} + } catch { } try { symbolMapping = JSON.parse( this.assetProfileForm.controls['symbolMapping'].value ); - } catch {} + } catch { } const assetProfileData: UpdateAssetProfileDto = { + assetClass: this.assetProfileForm.controls['assetClass'].value, + assetSubClass: this.assetProfileForm.controls['assetSubClass'].value, + comment: this.assetProfileForm.controls['comment'].value ?? null, + name: this.assetProfileForm.controls['name'].value, scraperConfiguration, - symbolMapping, - comment: this.assetProfileForm.controls['comment'].value ?? null + symbolMapping }; this.adminService diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html index 66d00e720..755768209 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -112,7 +112,11 @@ >
- Asset Class
@@ -120,8 +124,8 @@ Asset Sub Class @@ -174,6 +178,38 @@ +
+ + Name + + +
+
+ + Asset Class + + + {{ assetClass.label }} + + +
+
+ + Asset Sub Class + + + {{ assetSubClass.label }} + + +
( `/api/v1/admin/profile-data/${dataSource}/${symbol}`, - { comment, scraperConfiguration, symbolMapping } + { + assetClass, + assetSubClass, + comment, + name, + scraperConfiguration, + symbolMapping + } ); }