diff --git a/CHANGELOG.md b/CHANGELOG.md index d85f138b6..e13ae4176 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Upgraded `stripe` from version `21.0.1` to `22.2.3` +### Fixed + +- Fixed the creation of the _Stripe_ checkout session for languages not supported by _Stripe_ (`ca` and `uk`) +- Fixed the error handling in the endpoint to create a _Stripe_ checkout session + ## 3.20.0 - 2026-07-04 ### Changed diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 0a27faa64..04b1f3bf2 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 074a9db0e..4018e4753 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 ab19d669a..07c2e7dbb 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 c256ada56..325f64eaa 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 4f3e9dd9d..c60170bbb 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 =