// /js/page-access-cache.js // 페이지 권한 캐시 - 중복 API 호출 방지 const CACHE_KEY = 'userPageAccess'; const CACHE_DURATION = 10 * 60 * 1000; // 10분 // 진행 중인 API 호출 Promise (중복 방지) let fetchPromise = null; /** * 페이지 접근 권한 데이터 가져오기 (캐시 우선) * @param {object} currentUser - 현재 사용자 객체 * @returns {Promise} 접근 가능한 페이지 목록 */ export async function getPageAccess(currentUser) { if (!currentUser || !currentUser.user_id) { return null; } // 1. 캐시 확인 const cached = localStorage.getItem(CACHE_KEY); if (cached) { try { const cacheData = JSON.parse(cached); if (Date.now() - cacheData.timestamp < CACHE_DURATION) { return cacheData.pages; } } catch (e) { localStorage.removeItem(CACHE_KEY); } } // 2. 이미 API 호출 중이면 기존 Promise 반환 if (fetchPromise) { return fetchPromise; } // 3. 새로운 API 호출 fetchPromise = (async () => { try { const response = await fetch(`${window.API_BASE_URL}/users/${currentUser.user_id}/page-access`, { method: 'GET', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${localStorage.getItem('token')}` } }); if (!response.ok) { console.error('페이지 권한 조회 실패:', response.status); return null; } const data = await response.json(); const accessiblePages = data.data.pageAccess || []; // 캐시 저장 localStorage.setItem(CACHE_KEY, JSON.stringify({ pages: accessiblePages, timestamp: Date.now() })); return accessiblePages; } catch (error) { console.error('페이지 권한 조회 오류:', error); return null; } finally { fetchPromise = null; } })(); return fetchPromise; } /** * 특정 페이지에 대한 접근 권한 확인 * @param {string} pageKey - 페이지 키 * @param {object} currentUser - 현재 사용자 객체 * @returns {Promise} */ export async function hasPageAccess(pageKey, currentUser) { // Admin은 모든 페이지 접근 가능 if (currentUser.role === 'Admin' || currentUser.role === 'System Admin') { return true; } // 대시보드, 프로필은 모든 사용자 접근 가능 if (pageKey === 'dashboard' || (pageKey && pageKey.startsWith('profile.'))) { return true; } const pages = await getPageAccess(currentUser); if (!pages) return false; const pageAccess = pages.find(p => p.page_key === pageKey); return pageAccess && pageAccess.can_access === 1; } /** * 접근 가능한 페이지 키 목록 반환 * @param {object} currentUser * @returns {Promise} */ export async function getAccessiblePageKeys(currentUser) { const pages = await getPageAccess(currentUser); if (!pages) return []; return pages .filter(p => p.can_access === 1) .map(p => p.page_key); } /** * 캐시 초기화 */ export function clearPageAccessCache() { localStorage.removeItem(CACHE_KEY); fetchPromise = null; }