summaryrefslogtreecommitdiff
path: root/lib/approval/approval-workflow.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/approval/approval-workflow.ts')
-rw-r--r--lib/approval/approval-workflow.ts26
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}`);
}