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:
@@ -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 拒絕",
|
||||
|
||||
@@ -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)",
|
||||
|
||||
Reference in New Issue
Block a user