diff --git a/CHANGELOG.md b/CHANGELOG.md index eb97d2eba..541a0d4ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Extended the data providers management of the admin control panel by every data provider in use + ### Changed - Migrated the login with access token dialog from `ngModel` to form control diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index 8b2118ab1..e473813e9 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -66,7 +66,7 @@ export class AdminController { @HasPermission(permissions.accessAdminControl) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getAdminData(): Promise { - return this.adminService.get({ user: this.request.user }); + return this.adminService.get(); } @Get('demo-user/sync') diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 9e645c059..bce603289 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -29,7 +29,7 @@ import { Filter } from '@ghostfolio/common/interfaces'; import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; -import { MarketDataPreset, UserWithSettings } from '@ghostfolio/common/types'; +import { MarketDataPreset } from '@ghostfolio/common/types'; import { BadRequestException, @@ -133,11 +133,8 @@ export class AdminService { } } - public async get({ user }: { user: UserWithSettings }): Promise { - const dataSources = await this.dataProviderService.getDataSources({ - user, - includeGhostfolio: true - }); + public async get(): Promise { + const dataSources = Object.values(DataSource); const [settings, transactionCount, userCount] = await Promise.all([ this.propertyService.get(), @@ -145,24 +142,31 @@ export class AdminService { this.countUsersWithAnalytics() ]); - const dataProviders = await Promise.all( - dataSources.map(async (dataSource) => { - const dataProviderInfo = this.dataProviderService - .getDataProvider(dataSource) - .getDataProviderInfo(); + const dataProviders = ( + await Promise.all( + dataSources.map(async (dataSource) => { + const assetProfileCount = + await this.prismaService.symbolProfile.count({ + where: { + dataSource + } + }); - const assetProfileCount = await this.prismaService.symbolProfile.count({ - where: { - dataSource + if (assetProfileCount > 0 || dataSource === 'GHOSTFOLIO') { + const dataProviderInfo = this.dataProviderService + .getDataProvider(dataSource) + .getDataProviderInfo(); + + return { + ...dataProviderInfo, + assetProfileCount + }; } - }); - return { - ...dataProviderInfo, - assetProfileCount - }; - }) - ); + return null; + }) + ) + ).filter(Boolean); return { dataProviders, diff --git a/libs/common/src/lib/personal-finance-tools.ts b/libs/common/src/lib/personal-finance-tools.ts index e814ac415..d0e47ee3b 100644 --- a/libs/common/src/lib/personal-finance-tools.ts +++ b/libs/common/src/lib/personal-finance-tools.ts @@ -446,6 +446,17 @@ export const personalFinanceTools: Product[] = [ origin: 'Pakistan', slogan: 'Advanced portfolio tracking and stock market information' }, + { + founded: 2021, + hasFreePlan: true, + hasSelfHostingAbility: true, + key: 'invmon', + name: 'InvMon', + origin: 'Switzerland', + pricingPerYear: '$156', + slogan: 'Track all your assets, investments and portfolios in one place', + useAnonymously: true + }, { founded: 2011, hasFreePlan: true,