Browse Source

Improve creation of Stripe checkout session

pull/7220/head
Thomas Kaul 2 months ago
parent
commit
ca7d5b5f72
  1. 4
      apps/api/src/app/app.module.ts
  2. 4
      apps/api/src/app/subscription/subscription.controller.ts
  3. 32
      apps/api/src/app/subscription/subscription.service.ts
  4. 4
      apps/api/src/middlewares/html-template.middleware.ts
  5. 2
      libs/common/src/lib/config.ts

4
apps/api/src/app/app.module.ts

@ -147,7 +147,9 @@ import { UserModule } from './user/user.module';
.split(',')[0] .split(',')[0]
.split('-')[0]; .split('-')[0];
if (SUPPORTED_LANGUAGE_CODES.includes(code)) { if (
(SUPPORTED_LANGUAGE_CODES as readonly string[]).includes(code)
) {
languageCode = code; languageCode = code;
} }
} catch {} } catch {}

4
apps/api/src/app/subscription/subscription.controller.ts

@ -116,11 +116,11 @@ export class SubscriptionController {
@Post('stripe/checkout-session') @Post('stripe/checkout-session')
@UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseGuards(AuthGuard('jwt'), HasPermissionGuard)
public createStripeCheckoutSession( public async createStripeCheckoutSession(
@Body() { couponId, priceId }: { couponId?: string; priceId: string } @Body() { couponId, priceId }: { couponId?: string; priceId: string }
): Promise<CreateStripeCheckoutSessionResponse> { ): Promise<CreateStripeCheckoutSessionResponse> {
try { try {
return this.subscriptionService.createStripeCheckoutSession({ return await this.subscriptionService.createStripeCheckoutSession({
couponId, couponId,
priceId, priceId,
user: this.request.user user: this.request.user

32
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 { PropertyService } from '@ghostfolio/api/services/property/property.service';
import { import {
DEFAULT_LANGUAGE_CODE, DEFAULT_LANGUAGE_CODE,
PROPERTY_STRIPE_CONFIG PROPERTY_STRIPE_CONFIG,
SUPPORTED_LANGUAGE_CODES
} from '@ghostfolio/common/config'; } from '@ghostfolio/common/config';
import { SubscriptionType } from '@ghostfolio/common/enums'; import { SubscriptionType } from '@ghostfolio/common/enums';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
@ -75,10 +76,7 @@ export class SubscriptionService {
quantity: 1 quantity: 1
} }
], ],
locale: locale: this.getStripeLocale(user.settings?.settings?.language),
(user.settings?.settings
?.language as Stripe.Checkout.SessionCreateParams.Locale) ??
DEFAULT_LANGUAGE_CODE,
metadata: subscriptionOffer metadata: subscriptionOffer
? { subscriptionOffer: JSON.stringify(subscriptionOffer) } ? { subscriptionOffer: JSON.stringify(subscriptionOffer) }
: {}, : {},
@ -246,4 +244,28 @@ export class SubscriptionService {
isRenewal: key.startsWith('renewal') 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;
}
} }

4
apps/api/src/middlewares/html-template.middleware.ts

@ -117,7 +117,9 @@ export class HtmlTemplateMiddleware implements NestMiddleware {
const path = request.originalUrl.replace(/\/$/, ''); const path = request.originalUrl.replace(/\/$/, '');
let languageCode = path.substr(1, 2); 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; languageCode = DEFAULT_LANGUAGE_CODE;
} }

2
libs/common/src/lib/config.ts

@ -323,7 +323,7 @@ export const SUPPORTED_LANGUAGE_CODES = [
'tr', 'tr',
'uk', 'uk',
'zh' 'zh'
]; ] as const;
export const TAG_ID_EMERGENCY_FUND = '4452656d-9fa4-4bd0-ba38-70492e31d180'; export const TAG_ID_EMERGENCY_FUND = '4452656d-9fa4-4bd0-ba38-70492e31d180';
export const TAG_ID_EXCLUDE_FROM_ANALYSIS = export const TAG_ID_EXCLUDE_FROM_ANALYSIS =

Loading…
Cancel
Save