refactor: remove server order confirmation from message-handler
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -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,
|
||||
`📋 <b>서버 주문 접수 완료!</b> (주문 #${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') {
|
||||
|
||||
Reference in New Issue
Block a user