From 6e3e8d8abb35d93bc63408a21f9e18db9204a653 Mon Sep 17 00:00:00 2001 From: kappa Date: Thu, 5 Feb 2026 18:12:45 +0900 Subject: [PATCH] refactor: remove server order confirmation from message-handler Co-Authored-By: Claude Opus 4.5 --- src/routes/handlers/message-handler.ts | 117 +------------------------ 1 file changed, 4 insertions(+), 113 deletions(-) diff --git a/src/routes/handlers/message-handler.ts b/src/routes/handlers/message-handler.ts index bc07d27..d139273 100644 --- a/src/routes/handlers/message-handler.ts +++ b/src/routes/handlers/message-handler.ts @@ -58,12 +58,7 @@ export async function handleMessage( // 4. Session 데이터 미리 읽기 (KV 중복 호출 방지) const deleteSessionKey = `delete_confirm:${telegramUserId}`; - const orderSessionKey = `server_order_confirm:${telegramUserId}`; - - const [deleteSessionData, orderSessionData] = await Promise.all([ - env.SESSION_KV.get(deleteSessionKey), - env.SESSION_KV.get(orderSessionKey), - ]); + const deleteSessionData = await env.SESSION_KV.get(deleteSessionKey); try { // 5. 서버 삭제 확인 처리 (텍스트 기반) @@ -114,111 +109,7 @@ export async function handleMessage( } } - // 7. 서버 신청 확인 처리 (텍스트 기반) - Queue 기반 - if (text.trim() === '신청') { - if (orderSessionData) { - try { - const orderData = JSON.parse(orderSessionData); - - // 1. 서버 세션에서 가격 정보 가져오기 - const { ServerSessionManager } = await import('../../utils/session-manager'); - const { getSessionConfig } = await import('../../constants/agent-config'); - const sessionManager = new ServerSessionManager(getSessionConfig('server')); - const session = await sessionManager.get(env.DB, telegramUserId); - - if (!session || !session.last_recommendation) { - await env.SESSION_KV.delete(orderSessionKey); - await sendMessage( - env.BOT_TOKEN, - chatId, - '❌ 세션이 만료되었습니다.\n다시 "서버 추천"을 시작해주세요.' - ); - return; - } - - const selected = session.last_recommendation.recommendations[orderData.index]; - if (!selected) { - await env.SESSION_KV.delete(orderSessionKey); - await sessionManager.delete(env.DB, telegramUserId); - await sendMessage(env.BOT_TOKEN, chatId, '❌ 선택한 서버를 찾을 수 없습니다.'); - return; - } - - const price = selected.price?.monthly_krw || 0; - - // 2. 잔액 확인 - const deposit = await env.DB.prepare( - 'SELECT balance FROM user_deposits WHERE user_id = ?' - ).bind(userId).first<{ balance: number }>(); - - if (!deposit || deposit.balance < price) { - await sendMessage( - env.BOT_TOKEN, - chatId, - `❌ 잔액이 부족합니다.\n\n` + - `• 서버 가격: ${price.toLocaleString()}원/월\n` + - `• 현재 잔액: ${(deposit?.balance || 0).toLocaleString()}원\n` + - `• 부족 금액: ${(price - (deposit?.balance || 0)).toLocaleString()}원\n\n` + - `잔액을 충전 후 다시 시도해주세요.` - ); - return; - } - - // 3. Queue 확인 - if (!env.SERVER_PROVISION_QUEUE) { - await sendMessage( - env.BOT_TOKEN, - chatId, - '❌ 서버 프로비저닝 시스템이 준비되지 않았습니다.' - ); - return; - } - - // 4. 주문 생성 및 Queue 전송 - const { createServerOrder, sendProvisionMessage } = await import('../../server-provision'); - - const orderId = await createServerOrder( - env.DB, - userId, - telegramUserId, - selected.pricing_id, - selected.region.code, - 'anvil', - price, - `${selected.plan_name} - ${orderData.label || session.collected_info?.useCase || 'server'}` - ); - - await sendProvisionMessage(env.SERVER_PROVISION_QUEUE, orderId, userId, telegramUserId); - - // 5. 세션 정리 - await env.SESSION_KV.delete(orderSessionKey); - await sessionManager.delete(env.DB, telegramUserId); - - // 6. 즉시 응답 - await sendMessage( - env.BOT_TOKEN, - chatId, - `📋 서버 주문 접수 완료! (주문 #${orderId})\n\n` + - `• 서버: ${selected.plan_name}\n` + - `• 리전: ${selected.region.name} (${selected.region.code})\n` + - `• 가격: ${price.toLocaleString()}원/월\n\n` + - `⏳ 서버를 생성하고 있습니다... (1-2분 소요)\n` + - `완료되면 메시지로 알려드릴게요.` - ); - return; - } catch (error) { - logger.error('서버 신청 처리 오류', error as Error, { telegramUserId }); - await sendMessage( - env.BOT_TOKEN, - chatId, - '🚫 서버 신청 중 오류가 발생했습니다. 다시 시도해주세요.' - ); - return; - } - } - } - - // 8. 명령어 처리 + // 7. 명령어 처리 if (text.startsWith('/')) { const [command, ...argParts] = text.split(' '); const args = argParts.join(' '); @@ -238,7 +129,7 @@ export async function handleMessage( return; } - // 9. 일반 대화 처리 (ConversationService 위임) + // 8. 일반 대화 처리 (ConversationService 위임) const result = await conversationService.processUserMessage( userId, chatIdStr, @@ -248,7 +139,7 @@ export async function handleMessage( const finalResponse = result.responseText; - // 10. 응답 전송 (키보드 포함 여부 확인) + // 9. 응답 전송 (키보드 포함 여부 확인) if (result.keyboardData) { logger.info('Keyboard data received', { type: result.keyboardData.type }); if (result.keyboardData.type === 'domain_register') {