/** * 결재 워크플로우 핸들러 레지스트리 * * Saga 패턴에서 사용할 액션 핸들러들을 등록하고 관리합니다. * * 흐름: * ApprovalSubmissionSaga → Knox 상신 → [폴링으로 상태 감지] → ApprovalExecutionSaga */ /** * 액션 핸들러 타입 정의 * payload를 받아서 실제 비즈니스 로직을 수행하는 함수 */ // eslint-disable-next-line @typescript-eslint/no-explicit-any export type ActionHandler = (payload: any) => Promise; /** * 액션 타입별 핸들러 저장소 * registerActionHandler()로 등록된 핸들러들이 여기 저장됨 */ export const actionHandlers = new Map(); /** * 특정 액션 타입에 대한 핸들러 등록 * * @example * registerActionHandler('vendor_investigation_request', async (payload) => { * return await createInvestigation(payload); * }); */ export function registerActionHandler(actionType: string, handler: ActionHandler) { actionHandlers.set(actionType, handler); } /** * 등록된 핸들러 조회 (디버깅/테스트용) */ export function getRegisteredHandlers() { return Array.from(actionHandlers.keys()); } /** * 핸들러 초기화 여부 추적 (Lazy Initialization용) */ let handlersInitialized = false; /** * 핸들러가 등록되어 있지 않으면 자동으로 초기화 (Lazy Initialization) * Next.js 서버 액션의 격리된 실행 컨텍스트를 위한 안전장치 */ export async function ensureHandlersInitialized() { if (!handlersInitialized) { console.log('[Approval Workflow] Lazy initializing handlers...'); const { initializeApprovalHandlers } = await import('./handlers-registry'); await initializeApprovalHandlers(); handlersInitialized = true; } }