feat(api): Phase 16 R3.4 ApprovalDBService DI 重構

變更:
- ApprovalDBService 新增 __init__(repository) 建構子
- get_approval() 支援 Repository 注入
- get_pending_approvals() 支援 Repository 注入
- get_approval_service(use_repository=True) 啟用 DI

絞殺者模式:
- use_repository=False (預設): 內嵌 DB 操作
- use_repository=True: 使用 ApprovalDBRepository

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-03-25 21:26:23 +08:00
parent bfda353270
commit f6a28d235c

View File

@@ -171,8 +171,21 @@ class ApprovalDBService:
資料庫授權服務 - 替代 in-memory TrustEngine
所有操作皆為資料庫 CRUD重啟後資料保持
Phase 16 R3.4: 支援 Repository 注入
- 有注入 repository: 使用 Repository 層
- 無注入: 使用內嵌 DB 操作 (向下相容)
"""
def __init__(self, repository=None):
"""
初始化 ApprovalDBService
Args:
repository: IApprovalRepository 實例 (可選Phase 16 DI)
"""
self._repository = repository
async def create_approval(
self,
request: ApprovalRequestCreate,
@@ -342,7 +355,14 @@ class ApprovalDBService:
async def get_approval(self, approval_id: UUID) -> ApprovalRequest | None:
"""
取得單一授權請求
Phase 16 R3.4: 支援 Repository 注入
"""
# Phase 16: 使用 Repository (如果有注入)
if self._repository:
return await self._repository.get_by_id(approval_id)
# Legacy: 內嵌 DB 操作
async with get_db_context() as db:
result = await db.execute(
select(ApprovalRecord).where(ApprovalRecord.id == str(approval_id))
@@ -357,7 +377,14 @@ class ApprovalDBService:
async def get_pending_approvals(self) -> list[ApprovalRequest]:
"""
取得所有待簽核請求
Phase 16 R3.4: 支援 Repository 注入
"""
# Phase 16: 使用 Repository (如果有注入)
if self._repository:
return await self._repository.get_pending()
# Legacy: 內嵌 DB 操作
now = datetime.now(UTC)
async with get_db_context() as db:
@@ -734,11 +761,25 @@ _approval_service: ApprovalDBService | None = None
_timeline_service: TimelineDBService | None = None
def get_approval_service() -> ApprovalDBService:
"""取得授權服務實例"""
def get_approval_service(use_repository: bool = False) -> ApprovalDBService:
"""
取得授權服務實例
Args:
use_repository: 是否使用 Repository 層 (Phase 16 R3.4)
Phase 16: 絞殺者模式
- use_repository=False: 使用內嵌 DB 操作 (預設,向下相容)
- use_repository=True: 使用 ApprovalDBRepository
"""
global _approval_service
if _approval_service is None:
_approval_service = ApprovalDBService()
if use_repository:
from src.repositories import get_approval_repository
_approval_service = ApprovalDBService(repository=get_approval_repository())
logger.info("approval_service_with_repository")
else:
_approval_service = ApprovalDBService()
return _approval_service