fix(telegram): 修復簽核按鈕無作用 - 方法名稱錯誤

根本原因:
- 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 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-03-29 01:36:38 +08:00
parent 179e659f14
commit b0b91a59e5
2 changed files with 18 additions and 22 deletions

View File

@@ -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 拒絕",

View File

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