diff options
Diffstat (limited to 'lib/approval/approval-workflow.ts')
| -rw-r--r-- | lib/approval/approval-workflow.ts | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/approval/approval-workflow.ts b/lib/approval/approval-workflow.ts index ed20e972..4c7eec09 100644 --- a/lib/approval/approval-workflow.ts +++ b/lib/approval/approval-workflow.ts @@ -50,6 +50,24 @@ export function getRegisteredHandlers() { } /** + * 핸들러 초기화 여부 추적 (Lazy Initialization용) + */ +let handlersInitialized = false; + +/** + * 핸들러가 등록되어 있지 않으면 자동으로 초기화 (Lazy Initialization) + * Next.js 서버 액션의 격리된 실행 컨텍스트를 위한 안전장치 + */ +async function ensureHandlersInitialized() { + if (!handlersInitialized) { + console.log('[Approval Workflow] Lazy initializing handlers...'); + const { initializeApprovalHandlers } = await import('./handlers-registry'); + await initializeApprovalHandlers(); + handlersInitialized = true; + } +} + +/** * 결재가 필요한 액션을 래핑하는 공통 함수 * * 사용법: @@ -77,8 +95,12 @@ export async function withApproval<T>( actionPayload: T, approvalConfig: ApprovalConfig ) { + // 핸들러 자동 초기화 (서버 액션 격리 문제 해결) + await ensureHandlersInitialized(); + // 핸들러가 등록되어 있는지 확인 if (!actionHandlers.has(actionType)) { + console.error('[Approval Workflow] Available handlers:', Array.from(actionHandlers.keys())); throw new Error(`No handler registered for action type: ${actionType}`); } @@ -232,6 +254,9 @@ export async function withApproval<T>( */ export async function executeApprovedAction(apInfId: string) { try { + // 핸들러 자동 초기화 (폴링 서비스의 격리 문제 해결) + await ensureHandlersInitialized(); + // 1. apInfId로 pendingAction 조회 const pendingAction = await db.query.pendingActions.findFirst({ where: eq(pendingActions.apInfId, apInfId), @@ -251,6 +276,7 @@ export async function executeApprovedAction(apInfId: string) { // 2. 등록된 핸들러 조회 const handler = actionHandlers.get(pendingAction.actionType); if (!handler) { + console.error('[Approval Workflow] Available handlers:', Array.from(actionHandlers.keys())); throw new Error(`Handler not found for action type: ${pendingAction.actionType}`); } |
