Files
TK-FB-Project/deploy/tkfb-package/web-ui/js/page-access-cache.js
Hyungi Ahn 2b1c7bfb88 feat: 다수 기능 개선 - 순찰, 출근, 작업분석, 모바일 UI 등
- 순찰/점검 기능 개선 (zone-detail 페이지 추가)
- 출근/근태 시스템 개선 (연차 조회, 근무현황)
- 작업분석 대분류 그룹화 및 마이그레이션 스크립트
- 모바일 네비게이션 UI 추가
- NAS 배포 도구 및 문서 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 14:41:01 +09:00

120 lines
3.1 KiB
JavaScript

// /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<Array>} 접근 가능한 페이지 목록
*/
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<boolean>}
*/
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<string[]>}
*/
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;
}