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)",