From 4edf0e801e35d1ff8514c464485197e03d83914e Mon Sep 17 00:00:00 2001 From: barsa Date: Wed, 17 Dec 2025 15:45:11 +0900 Subject: [PATCH] Refactor Account Portal Components and Update Routing - Further refined the account portal structure by updating existing components and enhancing their functionality. - Improved routing paths to ensure better navigation and accessibility within the account portal. - Enhanced user experience by integrating additional features and optimizing existing ones for seamless interaction. --- .../services/checkout-session.service.ts | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 apps/bff/src/modules/orders/services/checkout-session.service.ts diff --git a/apps/bff/src/modules/orders/services/checkout-session.service.ts b/apps/bff/src/modules/orders/services/checkout-session.service.ts new file mode 100644 index 00000000..cbb02c40 --- /dev/null +++ b/apps/bff/src/modules/orders/services/checkout-session.service.ts @@ -0,0 +1,64 @@ +import { Inject, Injectable, NotFoundException } from "@nestjs/common"; +import { Logger } from "nestjs-pino"; +import { randomUUID } from "crypto"; +import { CacheService } from "@bff/infra/cache/cache.service.js"; +import type { CheckoutBuildCartRequest, CheckoutCart } from "@customer-portal/domain/orders"; + +type CheckoutSessionRecord = { + request: CheckoutBuildCartRequest; + cart: CheckoutCart; + createdAt: string; + expiresAt: string; +}; + +@Injectable() +export class CheckoutSessionService { + private readonly ttlSeconds = 2 * 60 * 60; // 2 hours + private readonly keyPrefix = "checkout-session"; + + constructor( + private readonly cache: CacheService, + @Inject(Logger) private readonly logger: Logger + ) {} + + async createSession(request: CheckoutBuildCartRequest, cart: CheckoutCart) { + const sessionId = randomUUID(); + const createdAt = new Date(); + const expiresAt = new Date(createdAt.getTime() + this.ttlSeconds * 1000); + + const record: CheckoutSessionRecord = { + request, + cart, + createdAt: createdAt.toISOString(), + expiresAt: expiresAt.toISOString(), + }; + + const key = this.buildKey(sessionId); + await this.cache.set(key, record, this.ttlSeconds); + + this.logger.debug("Checkout session created", { sessionId, expiresAt: record.expiresAt }); + + return { + sessionId, + expiresAt: record.expiresAt, + }; + } + + async getSession(sessionId: string): Promise { + const key = this.buildKey(sessionId); + const record = await this.cache.get(key); + if (!record) { + throw new NotFoundException("Checkout session not found"); + } + return record; + } + + async deleteSession(sessionId: string): Promise { + const key = this.buildKey(sessionId); + await this.cache.del(key); + } + + private buildKey(sessionId: string): string { + return `${this.keyPrefix}:${sessionId}`; + } +}