From 41f99334eb7b146689169453e559c3d22f0fdc73 Mon Sep 17 00:00:00 2001 From: kappa Date: Wed, 28 Jan 2026 20:46:05 +0900 Subject: [PATCH] feat: implement server start/stop functionality - Replace stub implementations with actual API calls - POST /api/provision/orders/{order_id}/start - POST /api/provision/orders/{order_id}/stop - Add proper validation, logging, and error handling - Follow existing code patterns (callProvisionAPI, __DIRECT__) Co-Authored-By: Claude Opus 4.5 --- src/tools/server-tool.ts | 62 ++++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/src/tools/server-tool.ts b/src/tools/server-tool.ts index 81eac22..ff9e332 100644 --- a/src/tools/server-tool.ts +++ b/src/tools/server-tool.ts @@ -843,23 +843,69 @@ export async function executeServerAction( } case 'start': { - const { server_id } = args; + const { order_id } = args; - if (!server_id) { - return '🚫 μ„œλ²„ μ‹œμž‘μ—λŠ” server_idκ°€ ν•„μš”ν•©λ‹ˆλ‹€.'; + if (!order_id) { + return '🚫 μ„œλ²„ μ‹œμž‘μ—λŠ” order_idκ°€ ν•„μš”ν•©λ‹ˆλ‹€.'; } - return '🚧 μ„œλ²„ μ‹œμž‘ κΈ°λŠ₯은 μ€€λΉ„ μ€‘μž…λ‹ˆλ‹€.\n\nν˜„μž¬ μ„œλ²„ μΆ”μ²œ κΈ°λŠ₯만 μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.'; + if (!telegramUserId) { + return '🚫 μ‚¬μš©μž 인증이 ν•„μš”ν•©λ‹ˆλ‹€.'; + } + + if (!env) { + return '🚫 ν™˜κ²½ 섀정이 ν•„μš”ν•©λ‹ˆλ‹€.'; + } + + // Call the provision API to start the server + const result = await callProvisionAPI( + `/api/provision/orders/${order_id}/start`, + 'POST', + env, + undefined, + telegramUserId + ); + + if (result.error) { + return `🚫 μ„œλ²„ μ‹œμž‘ μ‹€νŒ¨: ${result.error}`; + } + + logger.info('μ„œλ²„ μ‹œμž‘ μš”μ²­', { userId: maskUserId(telegramUserId), orderId: order_id }); + + return `__DIRECT__\nβœ… μ„œλ²„ μ‹œμž‘ μš”μ²­μ΄ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.\n\nβ€’ 주문번호: #${order_id}\nβ€’ μƒνƒœ: μ‹œμž‘ 쀑...\n\n⏳ μ„œλ²„κ°€ μ‹œμž‘λ˜κΈ°κΉŒμ§€ 1-2λΆ„ μ†Œμš”λ  수 μžˆμŠ΅λ‹ˆλ‹€.`; } case 'stop': { - const { server_id } = args; + const { order_id } = args; - if (!server_id) { - return '🚫 μ„œλ²„ μ€‘μ§€μ—λŠ” server_idκ°€ ν•„μš”ν•©λ‹ˆλ‹€.'; + if (!order_id) { + return '🚫 μ„œλ²„ μ€‘μ§€μ—λŠ” order_idκ°€ ν•„μš”ν•©λ‹ˆλ‹€.'; } - return '🚧 μ„œλ²„ 쀑지 κΈ°λŠ₯은 μ€€λΉ„ μ€‘μž…λ‹ˆλ‹€.\n\nν˜„μž¬ μ„œλ²„ μΆ”μ²œ κΈ°λŠ₯만 μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.'; + if (!telegramUserId) { + return '🚫 μ‚¬μš©μž 인증이 ν•„μš”ν•©λ‹ˆλ‹€.'; + } + + if (!env) { + return '🚫 ν™˜κ²½ 섀정이 ν•„μš”ν•©λ‹ˆλ‹€.'; + } + + // Call the provision API to stop the server + const result = await callProvisionAPI( + `/api/provision/orders/${order_id}/stop`, + 'POST', + env, + undefined, + telegramUserId + ); + + if (result.error) { + return `🚫 μ„œλ²„ 쀑지 μ‹€νŒ¨: ${result.error}`; + } + + logger.info('μ„œλ²„ 쀑지 μš”μ²­', { userId: maskUserId(telegramUserId), orderId: order_id }); + + return `__DIRECT__\nβœ… μ„œλ²„ 쀑지 μš”μ²­μ΄ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.\n\nβ€’ 주문번호: #${order_id}\nβ€’ μƒνƒœ: 쀑지 쀑...\n\n⏳ μ„œλ²„κ°€ μ€‘μ§€λ˜κΈ°κΉŒμ§€ 1-2λΆ„ μ†Œμš”λ  수 μžˆμŠ΅λ‹ˆλ‹€.`; } case 'list': {