From b0b91a59e5f2be619d3eb87a98460473443a3d20 Mon Sep 17 00:00:00 2001 From: OG T Date: Sun, 29 Mar 2026 01:36:38 +0800 Subject: [PATCH] =?UTF-8?q?fix(telegram):=20=E4=BF=AE=E5=BE=A9=E7=B0=BD?= =?UTF-8?q?=E6=A0=B8=E6=8C=89=E9=88=95=E7=84=A1=E4=BD=9C=E7=94=A8=20-=20?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E5=90=8D=E7=A8=B1=E9=8C=AF=E8=AA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根本原因: - telegram_gateway.py 呼叫 service.add_signature() 但該方法不存在 - telegram.py 呼叫 service.reject() 但該方法不存在 - 正確方法為 sign_approval() 和 reject_approval() 修復: - _execute_approval_action: add_signature → sign_approval - _execute_approval_action: reject → reject_approval - telegram webhook: 同步修復 影響範圍: - Telegram 簽核/拒絕/稍後/靜默按鈕現在正常運作 - 前端 Y/n 按鈕本就使用正確 API (不受影響) Co-Authored-By: Claude Opus 4.5 --- apps/api/src/api/v1/telegram.py | 21 ++++++++------------- apps/api/src/services/telegram_gateway.py | 19 ++++++++++--------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/apps/api/src/api/v1/telegram.py b/apps/api/src/api/v1/telegram.py index 9c7a2416..a8b6937e 100644 --- a/apps/api/src/api/v1/telegram.py +++ b/apps/api/src/api/v1/telegram.py @@ -26,7 +26,6 @@ from pydantic import BaseModel from src.core.config import settings from src.core.logging import get_logger -from src.models.approval import Signature, SignatureSource from src.services.approval_db import get_approval_service from src.services.security_interceptor import ( NonceReplayError, @@ -135,20 +134,14 @@ async def telegram_webhook( service = get_approval_service() + # 2026-03-29 ogt: 修復方法呼叫 - add_signature/reject 不存在 + # 正確方法: sign_approval / reject_approval if action == "approve": - # 建立 Telegram 簽核記錄 - signature = Signature( + approval, msg, execution_triggered = await service.sign_approval( + approval_id=UUID(approval_id), signer_id=f"tg_{user_id}", signer_name=user.get("username") or user.get("first_name") or str(user_id), comment="Telegram 簽核", - source=SignatureSource.TELEGRAM, - telegram_user_id=user_id, - telegram_message_id=message_id, - ) - - approval = await service.add_signature( - UUID(approval_id), - signature, ) if approval: @@ -157,6 +150,7 @@ async def telegram_webhook( approval_id=approval_id, user_id=user_id, status=approval.status.value, + execution_triggered=execution_triggered, ) return { @@ -164,11 +158,12 @@ async def telegram_webhook( "message": "Approved", "approval_id": approval_id, "status": approval.status.value, + "execution_triggered": execution_triggered, } elif action == "reject": - approval = await service.reject( - UUID(approval_id), + approval, msg = await service.reject_approval( + approval_id=UUID(approval_id), rejector_id=f"tg_{user_id}", rejector_name=user.get("username") or str(user_id), reason="Telegram 拒絕", diff --git a/apps/api/src/services/telegram_gateway.py b/apps/api/src/services/telegram_gateway.py index 9a961b94..3ecab1b8 100644 --- a/apps/api/src/services/telegram_gateway.py +++ b/apps/api/src/services/telegram_gateway.py @@ -1244,44 +1244,45 @@ class TelegramGateway: username: 使用者名稱 message_id: 訊息 ID """ + # 2026-03-29 ogt: 修復方法呼叫 - add_signature/reject 不存在 + # 正確方法: sign_approval / reject_approval from uuid import UUID - from src.models.approval import Signature, SignatureSource from src.services.approval_db import get_approval_service try: service = get_approval_service() if action == "approve": - signature = Signature( + # 2026-03-29 ogt: 正確呼叫 sign_approval (返回 tuple) + approval, message, execution_triggered = await service.sign_approval( + approval_id=UUID(approval_id), signer_id=f"tg_{user_id}", signer_name=username, comment="Telegram 簽核 (Long Polling)", - source=SignatureSource.TELEGRAM, - telegram_user_id=user_id, - telegram_message_id=message_id, ) - approval = await service.add_signature(UUID(approval_id), signature) - if approval: logger.info( "telegram_approval_signed_via_polling", approval_id=approval_id, user_id=user_id, status=approval.status.value, + execution_triggered=execution_triggered, ) print(f"\n{'='*60}") print("✅ 統帥已授權執行!") print(f"簽核單: {approval_id}") print(f"簽核者: @{username} (ID: {user_id})") print(f"狀態: {approval.status.value}") + print(f"執行觸發: {execution_triggered}") print(f"時間: {datetime.now(UTC).isoformat()}") print(f"{'='*60}\n") elif action == "reject": - approval = await service.reject( - UUID(approval_id), + # 2026-03-29 ogt: 正確呼叫 reject_approval (返回 tuple) + approval, message = await service.reject_approval( + approval_id=UUID(approval_id), rejector_id=f"tg_{user_id}", rejector_name=username, reason="Telegram 拒絕 (Long Polling)",