From 19fbecec70dbf93d586bd93996dd0b06fd7bc400 Mon Sep 17 00:00:00 2001 From: minij02 Date: Tue, 24 Feb 2026 20:18:02 +0900 Subject: [PATCH 1/2] Refactor: Align method types with PortOne V2 and remove PG provider logic --- prisma/schema.prisma | 1 - src/purchases/dtos/purchase.dto.ts | 2 - .../purchase.complete.repository.ts | 4 +- .../repositories/purchase.repository.ts | 5 --- .../services/purchase.complete.service.ts | 1 - src/purchases/services/purchase.service.ts | 1 - src/purchases/utils/payment.util.ts | 39 +++---------------- src/purchases/utils/portone.ts | 23 ++--------- 8 files changed, 10 insertions(+), 66 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 7f31d2d..7988cec 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -420,7 +420,6 @@ model Payment { purchase_id Int @unique status Status method PaymentMethod - provider PaymentProvider merchant_uid String @unique created_at DateTime @default(now()) updated_at DateTime @updatedAt diff --git a/src/purchases/dtos/purchase.dto.ts b/src/purchases/dtos/purchase.dto.ts index baf5e79..40168c5 100644 --- a/src/purchases/dtos/purchase.dto.ts +++ b/src/purchases/dtos/purchase.dto.ts @@ -1,11 +1,9 @@ -import { PaymentProvider } from "@prisma/client"; export interface PurchaseHistoryItemDTO { prompt_id: number; title: string; price: number; seller_nickname: string; - pg: PaymentProvider | null; } export interface PurchaseHistoryResponseDTO { diff --git a/src/purchases/repositories/purchase.complete.repository.ts b/src/purchases/repositories/purchase.complete.repository.ts index 9023650..3fe2b2f 100644 --- a/src/purchases/repositories/purchase.complete.repository.ts +++ b/src/purchases/repositories/purchase.complete.repository.ts @@ -1,4 +1,4 @@ -import { Prisma, PaymentMethod, PaymentProvider, Status } from '@prisma/client'; +import { Prisma, PaymentMethod, Status } from '@prisma/client'; type Tx = Prisma.TransactionClient; @@ -17,7 +17,6 @@ export const PurchaseCompleteRepository = { purchase_id: number; merchant_uid: string; method: PaymentMethod; - provider: PaymentProvider; status: Status; paymentId: string; cash_receipt_url?: string | null; @@ -29,7 +28,6 @@ export const PurchaseCompleteRepository = { merchant_uid: data.merchant_uid, imp_uid: data.paymentId, method: data.method, - provider: data.provider, status: data.status, cash_receipt_url: data.cash_receipt_url, cash_receipt_type: data.cash_receipt_type, diff --git a/src/purchases/repositories/purchase.repository.ts b/src/purchases/repositories/purchase.repository.ts index f6c3d67..35361be 100644 --- a/src/purchases/repositories/purchase.repository.ts +++ b/src/purchases/repositories/purchase.repository.ts @@ -15,11 +15,6 @@ export const PurchaseRepository = { user: { select: { nickname: true}}, }, }, - payment: { - select: { - provider: true, - }, - }, }, orderBy: { created_at: 'desc'}, }) diff --git a/src/purchases/services/purchase.complete.service.ts b/src/purchases/services/purchase.complete.service.ts index f2fea80..850dd76 100644 --- a/src/purchases/services/purchase.complete.service.ts +++ b/src/purchases/services/purchase.complete.service.ts @@ -48,7 +48,6 @@ export const PurchaseCompleteService = { paymentId: paymentId, status: 'Succeed', method: verifiedPayment.method, - provider: verifiedPayment.provider, cash_receipt_url: verifiedPayment.cashReceipt?.url, cash_receipt_type: verifiedPayment.cashReceipt?.type, }); diff --git a/src/purchases/services/purchase.service.ts b/src/purchases/services/purchase.service.ts index ad0884b..e676e83 100644 --- a/src/purchases/services/purchase.service.ts +++ b/src/purchases/services/purchase.service.ts @@ -11,7 +11,6 @@ export const PurchaseHistoryService = { price: r.amount, purchased_at: r.created_at.toISOString(), seller_nickname: r.prompt.user.nickname, - pg: r.payment?.provider ?? null, })); return { diff --git a/src/purchases/utils/payment.util.ts b/src/purchases/utils/payment.util.ts index 9bb65d6..0094970 100644 --- a/src/purchases/utils/payment.util.ts +++ b/src/purchases/utils/payment.util.ts @@ -1,42 +1,15 @@ import { PaymentMethod, PaymentProvider } from '@prisma/client'; import { AppError } from '../../errors/AppError'; -// 1. 결제 수단 매핑 +// 결제 수단 매핑 export function normalizePaymentMethod(input: string): PaymentMethod { const code = input.toUpperCase().replace(/\s+/g, ''); - if (code === 'CARD' || code.includes('카드')) return 'CARD'; - if (code === 'VIRTUAL_ACCOUNT' || code.includes('가상계좌')) return 'VIRTUAL_ACCOUNT'; - if (code === 'TRANSFER' || code.includes('계좌이체')) return 'TRANSFER'; - if (code === 'MOBILE' || code.includes('MOBILE_PHONE') || code.includes('휴대폰')) return 'MOBILE'; - if (code === 'EASY_PAY' || code.includes('간편결제')) return 'EASY_PAY'; + if (code === 'PaymentMethodCard') return 'CARD'; + if (code === 'PaymentMethodVirtualAccount') return 'VIRTUAL_ACCOUNT'; + if (code === 'PaymentMethodEasyPay') return 'TRANSFER'; + if (code === 'PaymentMethodTransfer') return 'MOBILE'; + if (code === 'PaymentMethodMobile') return 'EASY_PAY'; throw new AppError(`지원하지 않는 결제 수단입니다: ${input}`, 400, 'UnsupportedPaymentMethod'); -} - -// 2. 제공자 (Provider) 매핑 -export function normalizePaymentProvider(input: string, method: PaymentMethod): PaymentProvider { - const code = (input || '').toUpperCase().replace(/\s+/g, ''); - - if (code.includes('KAKAO') || code.includes('카카오')) { - return 'KAKAOPAY'; - } - if (code.includes('TOSSPAY') || code.includes('토스')) { - return 'TOSSPAY'; - } - if ( - code.includes('NAVER') || code.includes('네이버') || - code.includes('SAMSUNG') || code.includes('삼성') || - code.includes('APPLE') || code.includes('애플') || - code.includes('PAYCO') || code.includes('페이코') || - code.includes('LPAY') || code.includes('엘페이') || - code.includes('SSG') || code.includes('에스에스지') || - code.includes('PINPAY') || code.includes('핀페이') - ) { - throw new AppError(`현재 지원하지 않는 간편결제사입니다: ${input}`, 400, 'ProviderNotSupported'); - } - if (method !== 'EASY_PAY') { - return 'TOSSPAYMENTS'; - } - throw new AppError(`식별할 수 없는 결제 제공자입니다: ${input}`, 400, 'UnknownPaymentProvider'); } \ No newline at end of file diff --git a/src/purchases/utils/portone.ts b/src/purchases/utils/portone.ts index e6d5672..1d6a6ff 100644 --- a/src/purchases/utils/portone.ts +++ b/src/purchases/utils/portone.ts @@ -1,7 +1,7 @@ import axios from 'axios'; import { AppError } from '../../errors/AppError'; -import { PaymentMethod, PaymentProvider } from '@prisma/client' -import { normalizePaymentMethod, normalizePaymentProvider } from "./payment.util" +import { PaymentMethod } from '@prisma/client' +import { normalizePaymentMethod } from "./payment.util" interface PortOnePaymentResponse { id: string; // paymentId @@ -43,7 +43,6 @@ export type PortonePaymentVerified = { amount: number; status: string; method: PaymentMethod; - provider: PaymentProvider; paidAt: Date; customData: any; cashReceipt?: { @@ -101,24 +100,9 @@ export async function fetchAndVerifyPortonePayment( } } - // 5. PG Provider 추출 + // 5. 결제 수단 추출 const rawMethodType = payment.method?.type || ''; const method = normalizePaymentMethod(rawMethodType); - let rawProvider = ''; - - if (method === 'EASY_PAY') { - rawProvider = payment.method?.easyPay?.provider || ''; - } else if (method === 'CARD') { - rawProvider = payment.method?.card?.publisher || ''; - } else if (method === 'TRANSFER') { - rawProvider = payment.method?.transfer?.bank || ''; - } else if (method === 'VIRTUAL_ACCOUNT') { - rawProvider = payment.method?.virtualAccount?.bank || ''; - } else if (method === 'MOBILE') { - rawProvider = payment.method?.mobile?.carrier || 'MOBILE'; - } - - const provider = normalizePaymentProvider(rawProvider, method); // 6. 현금영수증 데이터 추출 let cashReceiptInfo = null; @@ -134,7 +118,6 @@ export async function fetchAndVerifyPortonePayment( amount: payment.amount.total, status: payment.status, method: method, - provider: provider, paidAt: payment.paidAt ? new Date(payment.paidAt) : new Date(), customData: parsedCustomData, cashReceipt: cashReceiptInfo From 7dd0d86fb1c2daf3510f8fd8a2d16e41d0672867 Mon Sep 17 00:00:00 2001 From: minij02 Date: Tue, 24 Feb 2026 20:31:15 +0900 Subject: [PATCH 2/2] Fix: Remove leftover provider field in webhook service --- src/purchases/services/purchase.webhook.service.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/purchases/services/purchase.webhook.service.ts b/src/purchases/services/purchase.webhook.service.ts index 8ab782d..b306ac3 100644 --- a/src/purchases/services/purchase.webhook.service.ts +++ b/src/purchases/services/purchase.webhook.service.ts @@ -61,7 +61,6 @@ export const WebhookService = { purchase_id: purchase.purchase_id, merchant_uid: paymentId, method: verifiedPayment.method, - provider: verifiedPayment.provider, cash_receipt_url: verifiedPayment.cashReceipt?.url, cash_receipt_type: verifiedPayment.cashReceipt?.type, status: 'Succeed',