diff options
| author | joonhoekim <26rote@gmail.com> | 2025-11-05 19:28:49 +0900 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-11-05 19:28:49 +0900 |
| commit | e890fbae0c9c273b825ac808aa516de1f87fb218 (patch) | |
| tree | c2b7bdacd22043a8b4781e9b4c6ea682468abd0f /lib/approval/cache-utils.ts | |
| parent | 35e373fe29a4145d0692ee35ff9e6b0c887df0eb (diff) | |
(김준회) 실사의뢰 결재 오류 수정, 결재 캐시 백그라운드 컨텍스트에서 패스로 무효화 처리, pm2 ecosystem 설정 변경 (npm 레이어 로그 문제), git 줄바꿈 문제 2건 커밋으로 처리
Diffstat (limited to 'lib/approval/cache-utils.ts')
| -rw-r--r-- | lib/approval/cache-utils.ts | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/lib/approval/cache-utils.ts b/lib/approval/cache-utils.ts new file mode 100644 index 00000000..f4c56c25 --- /dev/null +++ b/lib/approval/cache-utils.ts @@ -0,0 +1,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}`]); +} + |
