From ce17974cff345c39023b19dfda02a69f193c6805 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 16 Apr 2025 20:31:52 +0200 Subject: [PATCH] Refactoring --- apps/api/src/app/info/info.service.ts | 24 ++++++++++++++++--- apps/api/src/app/user/user.service.ts | 6 +++++ .../pages/pricing/pricing-page.component.ts | 7 +++++- .../src/lib/interfaces/info-item.interface.ts | 2 ++ 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index a5a1c6d92..d7e778694 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -13,6 +13,7 @@ import { PROPERTY_DEMO_USER_ID, PROPERTY_IS_READ_ONLY_MODE, PROPERTY_SLACK_COMMUNITY_USERS, + PROPERTY_STRIPE_CONFIG, ghostfolioFearAndGreedIndexDataSource } from '@ghostfolio/common/config'; import { @@ -20,7 +21,11 @@ import { encodeDataSource, extractNumberFromString } from '@ghostfolio/common/helper'; -import { InfoItem, Statistics } from '@ghostfolio/common/interfaces'; +import { + InfoItem, + Statistics, + SubscriptionOffer +} from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import { Injectable, Logger } from '@nestjs/common'; @@ -94,7 +99,8 @@ export class InfoService { demoAuthToken, isUserSignupEnabled, platforms, - statistics + statistics, + subscriptionOffer ] = await Promise.all([ this.benchmarkService.getBenchmarkAssetProfiles(), this.getDemoAuthToken(), @@ -102,7 +108,8 @@ export class InfoService { this.platformService.getPlatforms({ orderBy: { name: 'asc' } }), - this.getStatistics() + this.getStatistics(), + this.getDefaultSubscriptionOffer() ]); if (isUserSignupEnabled) { @@ -117,6 +124,7 @@ export class InfoService { isReadOnlyMode, platforms, statistics, + subscriptionOffer, baseCurrency: DEFAULT_CURRENCY, currencies: this.exchangeRateDataService.getCurrencies() }; @@ -230,6 +238,16 @@ export class InfoService { )) as string; } + private async getDefaultSubscriptionOffer(): Promise { + if (!this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { + return undefined; + } + + return (await this.propertyService.getByKey(PROPERTY_STRIPE_CONFIG))?.[ + 'default' + ] as SubscriptionOffer; + } + private async getDemoAuthToken() { const demoUserId = (await this.propertyService.getByKey( PROPERTY_DEMO_USER_ID diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index b48be28c4..31d8786df 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -392,6 +392,12 @@ export class UserService { currentPermissions, permissions.deleteOwnUser ); + + // Reset offer + user.subscription.offer.coupon = undefined; + user.subscription.offer.couponId = undefined; + user.subscription.offer.durationExtension = undefined; + user.subscription.offer.label = undefined; } } diff --git a/apps/client/src/app/pages/pricing/pricing-page.component.ts b/apps/client/src/app/pages/pricing/pricing-page.component.ts index 6cf79d873..cadc3a48c 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.component.ts +++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -55,9 +55,14 @@ export class PricingPageComponent implements OnDestroy, OnInit { ) {} public ngOnInit() { - const { baseCurrency } = this.dataService.fetchInfo(); + const { baseCurrency, subscriptionOffer } = this.dataService.fetchInfo(); this.baseCurrency = baseCurrency; + this.coupon = subscriptionOffer?.coupon; + this.durationExtension = subscriptionOffer?.durationExtension; + this.label = subscriptionOffer?.label; + this.price = subscriptionOffer?.price; + this.userService.stateChanged .pipe(takeUntil(this.unsubscribeSubject)) .subscribe((state) => { diff --git a/libs/common/src/lib/interfaces/info-item.interface.ts b/libs/common/src/lib/interfaces/info-item.interface.ts index b1e0eb33d..fe4101197 100644 --- a/libs/common/src/lib/interfaces/info-item.interface.ts +++ b/libs/common/src/lib/interfaces/info-item.interface.ts @@ -1,6 +1,7 @@ import { Platform, SymbolProfile } from '@prisma/client'; import { Statistics } from './statistics.interface'; +import { SubscriptionOffer } from './subscription-offer.interface'; export interface InfoItem { baseCurrency: string; @@ -15,4 +16,5 @@ export interface InfoItem { platforms: Platform[]; statistics: Statistics; stripePublicKey?: string; + subscriptionOffer?: SubscriptionOffer; }