summaryrefslogtreecommitdiff
path: root/lib/approval/cache-utils.ts
blob: f4c56c256a914e4cc8498201e8af308eb770d0f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/**
 * 결재 시스템 캐시 무효화 유틸리티
 * 
 * 백그라운드 프로세스(폴링 서비스)에서 request 컨텍스트 없이
 * Next.js 캐시를 무효화하기 위한 헬퍼 함수들
 */

/**
 * 결재 관련 캐시 무효화
 * 
 * @param tags - 무효화할 캐시 태그 배열
 * @returns 무효화 결과
 * 
 * @example
 * // 결재 로그 캐시 무효화
 * await revalidateApprovalCache(['approval-logs']);
 * 
 * // 여러 캐시 동시 무효화
 * await revalidateApprovalCache(['approval-logs', 'pending-actions']);
 */
export async function revalidateApprovalCache(tags: string[]) {
  try {
    // 내부 API 호출로 캐시 무효화
    const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000';
    const response = await fetch(`${baseUrl}/api/revalidate/approval`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        tags,
        secret: process.env.REVALIDATION_SECRET, // 선택적 보안
      }),
    });

    if (!response.ok) {
      throw new Error(`Cache revalidation failed: ${response.statusText}`);
    }

    const result = await response.json();
    console.log(`[Approval Cache] Successfully revalidated tags:`, tags);
    return result;
  } catch (error) {
    // 캐시 무효화 실패는 치명적이지 않으므로 로그만 남기고 진행
    console.error('[Approval Cache] Failed to revalidate cache:', error);
    console.warn('[Approval Cache] Continuing despite cache revalidation failure');
    return { success: false, error };
  }
}

/**
 * 결재 로그 캐시 무효화
 */
export async function revalidateApprovalLogs() {
  return revalidateApprovalCache(['approval-logs']);
}

/**
 * Pending Actions 캐시 무효화
 */
export async function revalidatePendingActions() {
  return revalidateApprovalCache(['pending-actions']);
}

/**
 * 결재 관련 모든 캐시 무효화
 */
export async function revalidateAllApprovalCaches() {
  return revalidateApprovalCache([
    'approval-logs',
    'pending-actions',
    'approval-templates',
  ]);
}

/**
 * 특정 결재 ID의 상세 캐시 무효화
 */
export async function revalidateApprovalDetail(apInfId: string) {
  return revalidateApprovalCache([`approval-log-${apInfId}`]);
}