From d4d6ce1d07a49c4b75366a93c42a0a3563f473bc Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Mon, 5 Jan 2026 23:28:18 +0700 Subject: [PATCH] Task/move admin service to UI library (#6159) * Move admin service to UI library * Update changelog --- CHANGELOG.md | 1 + .../app/components/admin-jobs/admin-jobs.component.ts | 2 +- .../admin-market-data/admin-market-data.component.ts | 3 +-- .../admin-market-data/admin-market-data.service.ts | 2 +- .../asset-profile-dialog.component.ts | 3 +-- .../create-asset-profile-dialog.component.ts | 3 +-- .../admin-overview/admin-overview.component.ts | 3 +-- .../admin-platform/admin-platform.component.ts | 3 +-- .../admin-settings/admin-settings.component.ts | 3 +-- .../components/admin-users/admin-users.component.ts | 3 +-- .../user-detail-dialog/user-detail-dialog.component.ts | 2 +- apps/client/src/environments/environment.prod.ts | 4 +++- apps/client/src/environments/environment.ts | 4 +++- apps/client/src/main.ts | 5 +++++ eslint.config.cjs | 4 +--- libs/ui/src/lib/assistant/assistant.component.ts | 4 +--- libs/ui/src/lib/environment/environment.interface.ts | 5 +++++ libs/ui/src/lib/environment/environment.token.ts | 7 +++++++ libs/ui/src/lib/environment/index.ts | 2 ++ .../historical-market-data-editor-dialog.component.ts | 4 +--- .../app => libs/ui/src/lib}/services/admin.service.ts | 10 +++++----- libs/ui/src/lib/services/index.ts | 1 + 22 files changed, 45 insertions(+), 33 deletions(-) create mode 100644 libs/ui/src/lib/environment/environment.interface.ts create mode 100644 libs/ui/src/lib/environment/environment.token.ts create mode 100644 libs/ui/src/lib/environment/index.ts rename {apps/client/src/app => libs/ui/src/lib}/services/admin.service.ts (94%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e66bb4ec..6fa5ef8b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Deprecated `activities` in the endpoint `GET api/v1/portfolio/holding/:dataSource/:symbol` +- Moved the admin service to `@ghostfolio/ui/services` - Moved the data service to `@ghostfolio/ui/services` - Refactored the dividend import diff --git a/apps/client/src/app/components/admin-jobs/admin-jobs.component.ts b/apps/client/src/app/components/admin-jobs/admin-jobs.component.ts index 66bac76f5..de70a7b6e 100644 --- a/apps/client/src/app/components/admin-jobs/admin-jobs.component.ts +++ b/apps/client/src/app/components/admin-jobs/admin-jobs.component.ts @@ -1,4 +1,3 @@ -import { AdminService } from '@ghostfolio/client/services/admin.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { DATA_GATHERING_QUEUE_PRIORITY_HIGH, @@ -9,6 +8,7 @@ import { import { getDateWithTimeFormatString } from '@ghostfolio/common/helper'; import { AdminJobs, User } from '@ghostfolio/common/interfaces'; import { NotificationService } from '@ghostfolio/ui/notifications'; +import { AdminService } from '@ghostfolio/ui/services'; import { CommonModule } from '@angular/common'; import { diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts index ebe35da3c..bc3b0d374 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts @@ -1,4 +1,3 @@ -import { AdminService } from '@ghostfolio/client/services/admin.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { DEFAULT_PAGE_SIZE, @@ -17,7 +16,7 @@ import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { GfActivitiesFilterComponent } from '@ghostfolio/ui/activities-filter'; import { translate } from '@ghostfolio/ui/i18n'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; -import { DataService } from '@ghostfolio/ui/services'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { SelectionModel } from '@angular/cdk/collections'; diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts index eaad32c0e..9528687a8 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts @@ -1,4 +1,3 @@ -import { AdminService } from '@ghostfolio/client/services/admin.service'; import { ghostfolioScraperApiSymbolPrefix } from '@ghostfolio/common/config'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { @@ -11,6 +10,7 @@ import { AdminMarketDataItem } from '@ghostfolio/common/interfaces'; import { NotificationService } from '@ghostfolio/ui/notifications'; +import { AdminService } from '@ghostfolio/ui/services'; import { Injectable } from '@angular/core'; import { EMPTY, catchError, finalize, forkJoin } from 'rxjs'; 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 67dadc7b5..cbd8deba3 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 @@ -1,5 +1,4 @@ import { AdminMarketDataService } from '@ghostfolio/client/components/admin-market-data/admin-market-data.service'; -import { AdminService } from '@ghostfolio/client/services/admin.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { ASSET_CLASS_MAPPING, @@ -24,7 +23,7 @@ import { translate } from '@ghostfolio/ui/i18n'; import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart'; -import { DataService } from '@ghostfolio/ui/services'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete'; import { GfValueComponent } from '@ghostfolio/ui/value'; diff --git a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts index 1087c11a1..6c180b034 100644 --- a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts @@ -1,10 +1,9 @@ -import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DEFAULT_CURRENCY, ghostfolioPrefix, PROPERTY_CURRENCIES } from '@ghostfolio/common/config'; -import { DataService } from '@ghostfolio/ui/services'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete'; import { diff --git a/apps/client/src/app/components/admin-overview/admin-overview.component.ts b/apps/client/src/app/components/admin-overview/admin-overview.component.ts index 101e60ec0..6284f05fd 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.component.ts +++ b/apps/client/src/app/components/admin-overview/admin-overview.component.ts @@ -1,4 +1,3 @@ -import { AdminService } from '@ghostfolio/client/services/admin.service'; import { CacheService } from '@ghostfolio/client/services/cache.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { @@ -19,7 +18,7 @@ import { } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { NotificationService } from '@ghostfolio/ui/notifications'; -import { DataService } from '@ghostfolio/ui/services'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; diff --git a/apps/client/src/app/components/admin-platform/admin-platform.component.ts b/apps/client/src/app/components/admin-platform/admin-platform.component.ts index 2843f059a..02a2eed64 100644 --- a/apps/client/src/app/components/admin-platform/admin-platform.component.ts +++ b/apps/client/src/app/components/admin-platform/admin-platform.component.ts @@ -1,10 +1,9 @@ -import { AdminService } from '@ghostfolio/client/services/admin.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { CreatePlatformDto, UpdatePlatformDto } from '@ghostfolio/common/dtos'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { NotificationService } from '@ghostfolio/ui/notifications'; -import { DataService } from '@ghostfolio/ui/services'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.ts b/apps/client/src/app/components/admin-settings/admin-settings.component.ts index a4da22402..446221058 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.ts +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.ts @@ -1,7 +1,6 @@ import { GfAdminPlatformComponent } from '@ghostfolio/client/components/admin-platform/admin-platform.component'; import { GfAdminTagComponent } from '@ghostfolio/client/components/admin-tag/admin-tag.component'; import { GfDataProviderStatusComponent } from '@ghostfolio/client/components/data-provider-status/data-provider-status.component'; -import { AdminService } from '@ghostfolio/client/services/admin.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { PROPERTY_API_KEY_GHOSTFOLIO } from '@ghostfolio/common/config'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; @@ -15,7 +14,7 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; -import { DataService } from '@ghostfolio/ui/services'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; diff --git a/apps/client/src/app/components/admin-users/admin-users.component.ts b/apps/client/src/app/components/admin-users/admin-users.component.ts index affd4d61c..2ae3b1a57 100644 --- a/apps/client/src/app/components/admin-users/admin-users.component.ts +++ b/apps/client/src/app/components/admin-users/admin-users.component.ts @@ -1,6 +1,5 @@ import { UserDetailDialogParams } from '@ghostfolio/client/components/user-detail-dialog/interfaces/interfaces'; import { GfUserDetailDialogComponent } from '@ghostfolio/client/components/user-detail-dialog/user-detail-dialog.component'; -import { AdminService } from '@ghostfolio/client/services/admin.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; @@ -20,7 +19,7 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; -import { DataService } from '@ghostfolio/ui/services'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; diff --git a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts index 248fd48f3..cdf977058 100644 --- a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts +++ b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts @@ -1,7 +1,7 @@ -import { AdminService } from '@ghostfolio/client/services/admin.service'; import { AdminUserResponse } from '@ghostfolio/common/interfaces'; import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer'; import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header'; +import { AdminService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { diff --git a/apps/client/src/environments/environment.prod.ts b/apps/client/src/environments/environment.prod.ts index 6f1d6b92d..4ee0d508b 100644 --- a/apps/client/src/environments/environment.prod.ts +++ b/apps/client/src/environments/environment.prod.ts @@ -1,4 +1,6 @@ -export const environment = { +import type { GfEnvironment } from '@ghostfolio/ui/environment'; + +export const environment: GfEnvironment = { lastPublish: '{BUILD_TIMESTAMP}', production: true, stripePublicKey: '' diff --git a/apps/client/src/environments/environment.ts b/apps/client/src/environments/environment.ts index 0a4d51d98..ccedf6738 100644 --- a/apps/client/src/environments/environment.ts +++ b/apps/client/src/environments/environment.ts @@ -1,8 +1,10 @@ +import type { GfEnvironment } from '@ghostfolio/ui/environment'; + // This file can be replaced during build by using the `fileReplacements` array. // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. // The list of file replacements can be found in `angular.json`. -export const environment = { +export const environment: GfEnvironment = { lastPublish: null, production: false, stripePublicKey: '' diff --git a/apps/client/src/main.ts b/apps/client/src/main.ts index c15703645..f596de5f4 100644 --- a/apps/client/src/main.ts +++ b/apps/client/src/main.ts @@ -1,5 +1,6 @@ import { InfoResponse } from '@ghostfolio/common/interfaces'; import { filterGlobalPermissions } from '@ghostfolio/common/permissions'; +import { GF_ENVIRONMENT } from '@ghostfolio/ui/environment'; import { GfNotificationModule } from '@ghostfolio/ui/notifications'; import { Platform } from '@angular/cdk/platform'; @@ -89,6 +90,10 @@ import { environment } from './environments/environment'; provide: DateAdapter, useClass: CustomDateAdapter }, + { + provide: GF_ENVIRONMENT, + useValue: environment + }, { provide: MAT_DATE_FORMATS, useValue: DateFormats diff --git a/eslint.config.cjs b/eslint.config.cjs index 5962e261d..76d627d18 100644 --- a/eslint.config.cjs +++ b/eslint.config.cjs @@ -28,9 +28,7 @@ module.exports = [ onlyDependOnLibsWithTags: ['*'] } ], - enforceBuildableLibDependency: true, - // Temporary fix, should be removed eventually - ignoredCircularDependencies: [['client', 'ui']] + enforceBuildableLibDependency: true } ], '@typescript-eslint/no-extra-semi': 'error', diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts index e3d597990..2b0216613 100644 --- a/libs/ui/src/lib/assistant/assistant.component.ts +++ b/libs/ui/src/lib/assistant/assistant.component.ts @@ -1,11 +1,9 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { AdminService } from '@ghostfolio/client/services/admin.service'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { Filter, PortfolioPosition, User } from '@ghostfolio/common/interfaces'; import { InternalRoute } from '@ghostfolio/common/routes/interfaces/internal-route.interface'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { AccountWithPlatform, DateRange } from '@ghostfolio/common/types'; -import { DataService } from '@ghostfolio/ui/services'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { FocusKeyManager } from '@angular/cdk/a11y'; import { diff --git a/libs/ui/src/lib/environment/environment.interface.ts b/libs/ui/src/lib/environment/environment.interface.ts new file mode 100644 index 000000000..9cb279515 --- /dev/null +++ b/libs/ui/src/lib/environment/environment.interface.ts @@ -0,0 +1,5 @@ +export interface GfEnvironment { + lastPublish: string | null; + production: boolean; + stripePublicKey: string; +} diff --git a/libs/ui/src/lib/environment/environment.token.ts b/libs/ui/src/lib/environment/environment.token.ts new file mode 100644 index 000000000..277e9c5e2 --- /dev/null +++ b/libs/ui/src/lib/environment/environment.token.ts @@ -0,0 +1,7 @@ +import { InjectionToken } from '@angular/core'; + +import { GfEnvironment } from './environment.interface'; + +export const GF_ENVIRONMENT = new InjectionToken( + 'GF_ENVIRONMENT' +); diff --git a/libs/ui/src/lib/environment/index.ts b/libs/ui/src/lib/environment/index.ts new file mode 100644 index 000000000..828eea646 --- /dev/null +++ b/libs/ui/src/lib/environment/index.ts @@ -0,0 +1,2 @@ +export * from './environment.interface'; +export * from './environment.token'; diff --git a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts index 7383c4c9c..7e7094dd3 100644 --- a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts +++ b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts @@ -1,6 +1,4 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { AdminService } from '@ghostfolio/client/services/admin.service'; -import { DataService } from '@ghostfolio/ui/services'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/services/admin.service.ts b/libs/ui/src/lib/services/admin.service.ts similarity index 94% rename from apps/client/src/app/services/admin.service.ts rename to libs/ui/src/lib/services/admin.service.ts index a5f2ca24f..145f134e3 100644 --- a/apps/client/src/app/services/admin.service.ts +++ b/libs/ui/src/lib/services/admin.service.ts @@ -21,22 +21,22 @@ import { Filter } from '@ghostfolio/common/interfaces'; import { DateRange } from '@ghostfolio/common/types'; +import { GF_ENVIRONMENT, GfEnvironment } from '@ghostfolio/ui/environment'; import { DataService } from '@ghostfolio/ui/services'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { Injectable } from '@angular/core'; +import { Inject, Injectable } from '@angular/core'; import { SortDirection } from '@angular/material/sort'; import { DataSource, MarketData, Platform } from '@prisma/client'; import { JobStatus } from 'bull'; -import { environment } from '../../environments/environment'; - @Injectable({ providedIn: 'root' }) export class AdminService { public constructor( private dataService: DataService, + @Inject(GF_ENVIRONMENT) private environment: GfEnvironment, private http: HttpClient ) {} @@ -124,7 +124,7 @@ export class AdminService { }); return this.http.get( - `${environment.production ? 'https://ghostfol.io' : ''}/api/v2/data-providers/ghostfolio/status`, + `${this.environment.production ? 'https://ghostfol.io' : ''}/api/v2/data-providers/ghostfolio/status`, { headers } ); } @@ -276,7 +276,7 @@ export class AdminService { scraperConfiguration, symbol }: AssetProfileIdentifier & UpdateAssetProfileDto['scraperConfiguration']) { - return this.http.post( + return this.http.post<{ price: number }>( `/api/v1/admin/market-data/${dataSource}/${symbol}/test`, { scraperConfiguration diff --git a/libs/ui/src/lib/services/index.ts b/libs/ui/src/lib/services/index.ts index 2ba773ede..9cedba875 100644 --- a/libs/ui/src/lib/services/index.ts +++ b/libs/ui/src/lib/services/index.ts @@ -1 +1,2 @@ +export * from './admin.service'; export * from './data.service';