summaryrefslogtreecommitdiff
path: root/lib/approval/cache-utils.ts
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-11-05 19:28:49 +0900
committerjoonhoekim <26rote@gmail.com>2025-11-05 19:28:49 +0900
commite890fbae0c9c273b825ac808aa516de1f87fb218 (patch)
treec2b7bdacd22043a8b4781e9b4c6ea682468abd0f /lib/approval/cache-utils.ts
parent35e373fe29a4145d0692ee35ff9e6b0c887df0eb (diff)
(김준회) 실사의뢰 결재 오류 수정, 결재 캐시 백그라운드 컨텍스트에서 패스로 무효화 처리, pm2 ecosystem 설정 변경 (npm 레이어 로그 문제), git 줄바꿈 문제 2건 커밋으로 처리
Diffstat (limited to 'lib/approval/cache-utils.ts')
-rw-r--r--lib/approval/cache-utils.ts82
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}`]);
+}
+