From 65ee2fe6c53e46dd26b41d1c2364b3809d28c464 Mon Sep 17 00:00:00 2001 From: minij02 Date: Fri, 20 Mar 2026 17:14:31 +0900 Subject: [PATCH] Feat: add field to prompt detail API for UX improvement --- src/prompts/repositories/prompt.repository.ts | 34 +++++++++++++++++-- src/prompts/routes/prompt.route.ts | 1 + 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/prompts/repositories/prompt.repository.ts b/src/prompts/repositories/prompt.repository.ts index 284c0c5..62821d1 100644 --- a/src/prompts/repositories/prompt.repository.ts +++ b/src/prompts/repositories/prompt.repository.ts @@ -278,7 +278,7 @@ const promptSelect = Prisma.validator()({ }, }); -export const getPromptDetailRepo = async (promptId: number) => { +export const getPromptDetailRepo = async (promptId: number, userId?: number) => { await prisma.prompt.update({ where: { prompt_id: promptId }, @@ -334,7 +334,37 @@ export const getPromptDetailRepo = async (promptId: number) => { // ✅ 통계 붙이기 const [promptWithStats] = attachReviewStats([prompt], stats); - return promptWithStats; + let is_paid = false; + + if (userId) { + if (prompt.user_id === userId) { + // 본인이 등록한 프롬프트 (무조건 열람 가능) + is_paid = true; + } else if (prompt.is_free) { + // 로그인한 상태 && 무료 프롬프트 (DB 조회 없이 열람 가능) + is_paid = true; + } else { + // 로그인한 상태 && 유료 프롬프트 (결제 성공 여부 검사) + const purchaseRecord = await prisma.purchase.findFirst({ + where: { + user_id: userId, + prompt_id: promptId, + payment: { + status: 'Succeed', + }, + }, + }); + + if (purchaseRecord) { + is_paid = true; + } + } + } + + return { + ...promptWithStats, + is_paid, + }; }; export const createPromptWriteRepo = async ( diff --git a/src/prompts/routes/prompt.route.ts b/src/prompts/routes/prompt.route.ts index 8086341..7e91632 100644 --- a/src/prompts/routes/prompt.route.ts +++ b/src/prompts/routes/prompt.route.ts @@ -200,6 +200,7 @@ router.get("/", promptController.getAllPrompts); * usage_guide: "사용 가이드 2" * price: 1000 * is_free: false + * is_paid: true * tags: * - tag_id: 2 * name: "태그 2"