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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
/**
* Request Context가 없는 환경(cronjob, background worker 등)에서
* 캐시를 무효화하기 위한 유틸리티
*
* 사용 예시:
* ```ts
* // Cronjob에서 사용
* await revalidateViaCronJob({ tags: ['vendors', 'users'] });
*
* // 또는 개별 태그
* await revalidateTagViaCronJob('vendors');
* ```
*/
/**
* API를 통한 캐시 무효화 (cronjob 등에서 사용)
*/
export async function revalidateViaCronJob(options: {
tags?: string[];
}): Promise<{ success: boolean; error?: string }> {
try {
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: options.tags,
secret: process.env.REVALIDATION_SECRET,
}),
});
if (!response.ok) {
const error = await response.text();
console.error('[Revalidation] API call failed:', error);
return {
success: false,
error: `Revalidation API failed: ${response.statusText}`,
};
}
const result = await response.json();
console.log('[Revalidation] Cache invalidated:', options.tags);
return { success: true };
} catch (error) {
console.error('[Revalidation] Failed to revalidate cache:', error);
// 캐시 무효화 실패는 치명적이지 않으므로 경고만 출력
return {
success: false,
error: error instanceof Error ? error.message : 'Unknown error',
};
}
}
/**
* 단일 태그 무효화 (cronjob에서 사용)
*/
export async function revalidateTagViaCronJob(tag: string) {
return revalidateViaCronJob({ tags: [tag] });
}
/**
* 벤더 관련 캐시 무효화
*/
export async function revalidateVendorCaches() {
return revalidateViaCronJob({
tags: ['vendors', 'vendor-status-counts'],
});
}
/**
* 유저 관련 캐시 무효화
*/
export async function revalidateUserCaches() {
return revalidateViaCronJob({
tags: ['users', 'roles', 'user-roles'],
});
}
/**
* 승인 프로세스에서 사용하는 모든 캐시 무효화
*/
export async function revalidateApprovalRelatedCaches() {
return revalidateViaCronJob({
tags: [
'vendors',
'vendor-status-counts',
'users',
'roles',
'user-roles',
'approval-logs',
'pending-actions',
],
});
}
|