/** * 결재 시스템 캐시 무효화 유틸리티 * * 백그라운드 프로세스(폴링 서비스)에서 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}`]); }