diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 0a27faa641..04b1f3bf21 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -147,7 +147,9 @@ import { UserModule } from './user/user.module'; .split(',')[0] .split('-')[0]; - if (SUPPORTED_LANGUAGE_CODES.includes(code)) { + if ( + (SUPPORTED_LANGUAGE_CODES as readonly string[]).includes(code) + ) { languageCode = code; } } catch {} diff --git a/apps/api/src/app/subscription/subscription.controller.ts b/apps/api/src/app/subscription/subscription.controller.ts index 074a9db0ef..4018e4753e 100644 --- a/apps/api/src/app/subscription/subscription.controller.ts +++ b/apps/api/src/app/subscription/subscription.controller.ts @@ -116,11 +116,11 @@ export class SubscriptionController { @Post('stripe/checkout-session') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) - public createStripeCheckoutSession( + public async createStripeCheckoutSession( @Body() { couponId, priceId }: { couponId?: string; priceId: string } ): Promise { try { - return this.subscriptionService.createStripeCheckoutSession({ + return await this.subscriptionService.createStripeCheckoutSession({ couponId, priceId, user: this.request.user diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index a811d22434..17a234f15d 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -3,7 +3,8 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { DEFAULT_LANGUAGE_CODE, - PROPERTY_STRIPE_CONFIG + PROPERTY_STRIPE_CONFIG, + SUPPORTED_LANGUAGE_CODES } from '@ghostfolio/common/config'; import { SubscriptionType } from '@ghostfolio/common/enums'; import { parseDate } from '@ghostfolio/common/helper'; @@ -75,10 +76,7 @@ export class SubscriptionService { quantity: 1 } ], - locale: - (user.settings?.settings - ?.language as Stripe.Checkout.SessionCreateParams.Locale) ?? - DEFAULT_LANGUAGE_CODE, + locale: this.getStripeLocale(user.settings?.settings?.language), metadata: subscriptionOffer ? { subscriptionOffer: JSON.stringify(subscriptionOffer) } : {}, @@ -246,4 +244,28 @@ export class SubscriptionService { isRenewal: key.startsWith('renewal') }; } + + private getStripeLocale( + languageCode: string + ): Stripe.Checkout.SessionCreateParams.Locale { + const unsupportedLanguageCodes: Record< + Exclude< + (typeof SUPPORTED_LANGUAGE_CODES)[number], + Stripe.Checkout.SessionCreateParams.Locale + >, + true + > = { + ca: true, + uk: true + }; + + if ( + (SUPPORTED_LANGUAGE_CODES as readonly string[]).includes(languageCode) && + !(languageCode in unsupportedLanguageCodes) + ) { + return languageCode as Stripe.Checkout.SessionCreateParams.Locale; + } + + return DEFAULT_LANGUAGE_CODE; + } } diff --git a/apps/api/src/middlewares/html-template.middleware.ts b/apps/api/src/middlewares/html-template.middleware.ts index c256ada565..325f64eaad 100644 --- a/apps/api/src/middlewares/html-template.middleware.ts +++ b/apps/api/src/middlewares/html-template.middleware.ts @@ -117,7 +117,9 @@ export class HtmlTemplateMiddleware implements NestMiddleware { const path = request.originalUrl.replace(/\/$/, ''); let languageCode = path.substr(1, 2); - if (!SUPPORTED_LANGUAGE_CODES.includes(languageCode)) { + if ( + !(SUPPORTED_LANGUAGE_CODES as readonly string[]).includes(languageCode) + ) { languageCode = DEFAULT_LANGUAGE_CODE; } diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 4f3e9dd9d9..c60170bbbd 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -323,7 +323,7 @@ export const SUPPORTED_LANGUAGE_CODES = [ 'tr', 'uk', 'zh' -]; +] as const; export const TAG_ID_EMERGENCY_FUND = '4452656d-9fa4-4bd0-ba38-70492e31d180'; export const TAG_ID_EXCLUDE_FROM_ANALYSIS =