424 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			424 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
/**
 | 
						|
 * 권한 시스템 타입 정의
 | 
						|
 *
 | 
						|
 * 2자리 계층 코드 시스템을 사용하여 페이지그룹 > 페이지 > 컴포넌트 계층 구조를 표현합니다.
 | 
						|
 *
 | 
						|
 * 코드 규칙:
 | 
						|
 * - 페이지그룹: PG01, PG02, PG03, PG04...
 | 
						|
 * - 페이지: P0101 (PG01 하위), P0201 (PG02 하위), P0501 (독립 페이지)...
 | 
						|
 * - 컴포넌트: C010101 (P0101 하위), C010102 (P0101 하위)...
 | 
						|
 */
 | 
						|
 | 
						|
// 리소스 타입 정의 (페이지그룹, 페이지, 컴포넌트)
 | 
						|
export type ResourceType = "PAGE_GROUP" | "PAGE" | "COMPONENT";
 | 
						|
 | 
						|
// 개별 리소스 객체 (계층 구조 지원)
 | 
						|
export interface Resource {
 | 
						|
  oid: number; // OID (고유 식별자)
 | 
						|
  code: string; // 2자리 계층 코드 (PG01, P0101, C010101)
 | 
						|
  name: string; // 리소스 이름
 | 
						|
  parentCode?: string; // 부모 리소스 코드 (계층 구조)
 | 
						|
  type: ResourceType; // 리소스 타입
 | 
						|
  path?: string; // 페이지 경로 (PAGE 타입만)
 | 
						|
  sortOrder: number; // 정렬 순서
 | 
						|
  description?: string; // 리소스 설명
 | 
						|
  menuYn?: string; // 메뉴 여부 (char(1))
 | 
						|
  componentType?: string; // 컴포넌트 세부 타입 (버튼, 그리드 등)
 | 
						|
}
 | 
						|
 | 
						|
// 사용자 권한 구조 (계층적 리소스 관리)
 | 
						|
export interface UserPermissions {
 | 
						|
  resources: {
 | 
						|
    pageGroups: Resource[]; // 페이지그룹 리소스들 (PG01, PG02...)
 | 
						|
    pages: Resource[]; // 페이지 리소스들 (P0101, P0201...)
 | 
						|
    components: Resource[]; // 컴포넌트 리소스들 (C010101, C010102...)
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
// 권한 체크 결과 타입 (권한 스토어에서 제공하는 함수들)
 | 
						|
export interface PermissionCheckResult {
 | 
						|
  // 기존 호환성 함수들 (경로/코드 기반)
 | 
						|
  hasPagePermission: (page: string) => boolean; // 페이지 경로로 권한 체크
 | 
						|
  hasPageGroupPermission: (pageGroup: string) => boolean; // 페이지그룹 코드로 권한 체크
 | 
						|
  hasComponentPermission: (component: string) => boolean; // 컴포넌트 코드로 권한 체크
 | 
						|
 | 
						|
  // 계층 구조를 고려한 권한 체크 함수들
 | 
						|
  hasResourcePermission: (resourceCode: string) => boolean; // 리소스 코드로 권한 체크
 | 
						|
  getResourceByCode: (code: string) => Resource | undefined; // 코드로 리소스 조회
 | 
						|
  getResourceByPath: (path: string) => Resource | undefined; // 경로로 리소스 조회
 | 
						|
  getChildResources: (parentCode: string) => Resource[]; // 부모의 자식 리소스들 조회
 | 
						|
}
 | 
						|
 | 
						|
// 권한 종류별 상수 (기존 호환성 유지용)
 | 
						|
export const PERMISSION_TYPES = {
 | 
						|
  PAGE: "pagePermissions",
 | 
						|
  PAGE_GROUP: "pageGroupPermissions",
 | 
						|
  COMPONENT: "componentPermissions",
 | 
						|
} as const;
 | 
						|
 | 
						|
/**
 | 
						|
 * 가데이터용 권한 목록 (개발/테스트용)
 | 
						|
 *
 | 
						|
 * 2자리 계층 코드 시스템을 사용한 실제 권한 데이터 예시입니다.
 | 
						|
 *
 | 
						|
 * 계층 구조:
 | 
						|
 * - PG01 (테스트 페이지그룹) > P0101~P0115 (테스트 페이지들) > C010101~C010106 (컴포넌트들)
 | 
						|
 * - PG02 (관리자 페이지그룹) > P0201~P0203 (관리자 페이지들)
 | 
						|
 * - P0501~P0504 (독립 페이지들: 홈, 로그인, 회원가입, 소개)
 | 
						|
 * - P0601~P0602 (테스트 페이지들)
 | 
						|
 * - P0701 (팝업 페이지들)
 | 
						|
 */
 | 
						|
export const MOCK_PERMISSIONS: UserPermissions = {
 | 
						|
  resources: {
 | 
						|
    // 페이지그룹 리소스들 (최상위 레벨)
 | 
						|
    pageGroups: [
 | 
						|
      {
 | 
						|
        oid: 1,
 | 
						|
        code: "PG01",
 | 
						|
        name: "테스트",
 | 
						|
        type: "PAGE_GROUP",
 | 
						|
        sortOrder: 1,
 | 
						|
        description: "테스트 관련 페이지그룹",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 2,
 | 
						|
        code: "PG02",
 | 
						|
        name: "관리자",
 | 
						|
        type: "PAGE_GROUP",
 | 
						|
        sortOrder: 2,
 | 
						|
        description: "관리자 전용 페이지그룹",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 3,
 | 
						|
        code: "PG03",
 | 
						|
        name: "공통 팝업",
 | 
						|
        type: "PAGE_GROUP",
 | 
						|
        sortOrder: 2,
 | 
						|
        description: "공통 팝업 페이지그룹",
 | 
						|
        menuYn: "N",
 | 
						|
      },
 | 
						|
    ],
 | 
						|
 | 
						|
    // 페이지 리소스들 (화면 메뉴 구성에 맞춤)
 | 
						|
    pages: [
 | 
						|
      // 테스트 페이지그룹 하위 페이지들 (PG01 > P0101~P0115)
 | 
						|
      {
 | 
						|
        oid: 5,
 | 
						|
        code: "P0101",
 | 
						|
        name: "테스트",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 1,
 | 
						|
        description: "기본 테스트 페이지",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 50,
 | 
						|
        code: "P010101",
 | 
						|
        name: "테스트 등록 팝업",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test/registerPopup",
 | 
						|
        parentCode: "P0101",
 | 
						|
        sortOrder: 1,
 | 
						|
        description: "기본 테스트 페이지",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 6,
 | 
						|
        code: "P0102",
 | 
						|
        name: "ivg",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test/igv",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 2,
 | 
						|
        description: "IGV 테스트 페이지",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 7,
 | 
						|
        code: "P0103",
 | 
						|
        name: "ivg2",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test/igv2",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 3,
 | 
						|
        description: "IGV2 테스트 페이지",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 8,
 | 
						|
        code: "P0104",
 | 
						|
        name: "pathway",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test/pathway",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 4,
 | 
						|
        description: "경로 분석 페이지",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 9,
 | 
						|
        code: "P0105",
 | 
						|
        name: "pathway2",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test/pathway2",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 5,
 | 
						|
        description: "경로 분석 페이지 2",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 10,
 | 
						|
        code: "P0106",
 | 
						|
        name: "pathway3",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test/pathway3",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 6,
 | 
						|
        description: "경로 분석 페이지 3",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 11,
 | 
						|
        code: "P0107",
 | 
						|
        name: "pathway4",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test/pathway4",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 7,
 | 
						|
        description: "경로 분석 페이지 4",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 12,
 | 
						|
        code: "P0108",
 | 
						|
        name: "pathwayjson",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test/pathwayJson",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 8,
 | 
						|
        description: "경로 분석 JSON 페이지",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 13,
 | 
						|
        code: "P0109",
 | 
						|
        name: "배양그래프",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test/culture-graph",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 9,
 | 
						|
        description: "배양 그래프 페이지",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 14,
 | 
						|
        code: "P0110",
 | 
						|
        name: "배양그래프 멀티",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test/culture-graph-multi",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 10,
 | 
						|
        description: "배양 그래프 멀티 페이지",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 15,
 | 
						|
        code: "P0111",
 | 
						|
        name: "배양그래프 탭",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test/culture-graph-tab",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 11,
 | 
						|
        description: "배양 그래프 탭 페이지",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 16,
 | 
						|
        code: "P0112",
 | 
						|
        name: "tui-grid",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/tui",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 12,
 | 
						|
        description: "TUI 그리드 페이지",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 17,
 | 
						|
        code: "P0113",
 | 
						|
        name: "리소스",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/admin/resource",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 13,
 | 
						|
        description: "리소스 관리 페이지",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 18,
 | 
						|
        code: "P0114",
 | 
						|
        name: "sample",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/sampleList",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 14,
 | 
						|
        description: "샘플 목록 페이지",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 19,
 | 
						|
        code: "P0115",
 | 
						|
        name: "공용 기능 테스트",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test/common-test",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 15,
 | 
						|
        description: "공용 기능 테스트 페이지",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 20,
 | 
						|
        code: "P0116",
 | 
						|
        name: "권한 시스템 테스트",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test/permission-test",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 16,
 | 
						|
        description: "권한 시스템 테스트 페이지",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 25,
 | 
						|
        code: "P0117",
 | 
						|
        name: "등록",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test/register",
 | 
						|
        parentCode: "PG01",
 | 
						|
        sortOrder: 17,
 | 
						|
        description: "테스트 등록 페이지",
 | 
						|
        menuYn: "N",
 | 
						|
      },
 | 
						|
 | 
						|
      // 관리자 페이지그룹 하위 페이지들 (PG02 > P0201~P0203)
 | 
						|
      {
 | 
						|
        oid: 21,
 | 
						|
        code: "P0201",
 | 
						|
        name: "접속기록",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/admin/logs",
 | 
						|
        parentCode: "PG02",
 | 
						|
        sortOrder: 1,
 | 
						|
        description: "사용자 접속 기록 관리",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 22,
 | 
						|
        code: "P0202",
 | 
						|
        name: "공통코드",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/admin/codes",
 | 
						|
        parentCode: "PG02",
 | 
						|
        sortOrder: 2,
 | 
						|
        description: "공통 코드 관리",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 23,
 | 
						|
        code: "P0203",
 | 
						|
        name: "프로그램",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/admin/programs",
 | 
						|
        parentCode: "PG02",
 | 
						|
        sortOrder: 3,
 | 
						|
        description: "프로그램 관리",
 | 
						|
        menuYn: "Y",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 24,
 | 
						|
        code: "P0204",
 | 
						|
        name: "등록",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/admin/register",
 | 
						|
        parentCode: "PG02",
 | 
						|
        sortOrder: 4,
 | 
						|
        description: "관리자 등록 페이지",
 | 
						|
        menuYn: "N",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 25,
 | 
						|
        code: "P0301",
 | 
						|
        name: "부서 조회 팝업",
 | 
						|
        type: "PAGE",
 | 
						|
        path: "/test/departmentPopup",
 | 
						|
        parentCode: "PG03",
 | 
						|
        sortOrder: 1,
 | 
						|
        description: "부서 조회 팝업",
 | 
						|
        menuYn: "N",
 | 
						|
      },
 | 
						|
    ],
 | 
						|
 | 
						|
    // 컴포넌트 리소스들 (페이지 하위)
 | 
						|
    components: [
 | 
						|
      // 테스트 페이지 하위 컴포넌트들 (P0101 > C010101~C010106)
 | 
						|
      {
 | 
						|
        oid: 19,
 | 
						|
        code: "C010101",
 | 
						|
        name: "삭제 버튼",
 | 
						|
        type: "COMPONENT",
 | 
						|
        parentCode: "P0101",
 | 
						|
        sortOrder: 1,
 | 
						|
        description: "테스트 삭제 버튼",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 20,
 | 
						|
        code: "C010102",
 | 
						|
        name: "수정 버튼",
 | 
						|
        type: "COMPONENT",
 | 
						|
        parentCode: "P0101",
 | 
						|
        sortOrder: 2,
 | 
						|
        description: "테스트 수정 버튼",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 21,
 | 
						|
        code: "C010103",
 | 
						|
        name: "내보내기 버튼",
 | 
						|
        type: "COMPONENT",
 | 
						|
        parentCode: "P0101",
 | 
						|
        sortOrder: 3,
 | 
						|
        description: "테스트 내보내기 버튼",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 22,
 | 
						|
        code: "C010104",
 | 
						|
        name: "가져오기 버튼",
 | 
						|
        type: "COMPONENT",
 | 
						|
        parentCode: "P0101",
 | 
						|
        sortOrder: 4,
 | 
						|
        description: "테스트 가져오기 버튼",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 23,
 | 
						|
        code: "C010105",
 | 
						|
        name: "생성 버튼",
 | 
						|
        type: "COMPONENT",
 | 
						|
        parentCode: "P0101",
 | 
						|
        sortOrder: 5,
 | 
						|
        description: "테스트 생성 버튼",
 | 
						|
      },
 | 
						|
      {
 | 
						|
        oid: 24,
 | 
						|
        code: "C010106",
 | 
						|
        name: "보기 버튼",
 | 
						|
        type: "COMPONENT",
 | 
						|
        parentCode: "P0101",
 | 
						|
        sortOrder: 6,
 | 
						|
        description: "테스트 상세보기 버튼",
 | 
						|
      },
 | 
						|
    ],
 | 
						|
  },
 | 
						|
};
 |