132 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import type { UserPermissions } from "~/types/permissions";
 | 
						|
import { MOCK_PERMISSIONS } from "~/types/permissions";
 | 
						|
 | 
						|
export const usePermissionsStore = defineStore(
 | 
						|
  "permissions",
 | 
						|
  () => {
 | 
						|
    // 권한 데이터 상태
 | 
						|
    const permissions = ref<UserPermissions>({
 | 
						|
      resources: {
 | 
						|
        pageGroups: [],
 | 
						|
        pages: [],
 | 
						|
        components: [],
 | 
						|
      },
 | 
						|
    });
 | 
						|
 | 
						|
    // 서버에서 권한 데이터 가져오기 (현재는 가데이터 사용)
 | 
						|
    const fetchPermissions = async (): Promise<boolean> => {
 | 
						|
      const { withLoading } = useLoading();
 | 
						|
 | 
						|
      return await withLoading(async () => {
 | 
						|
        // 실제 API 호출 (백엔드 준비되면 주석 해제)
 | 
						|
        /*
 | 
						|
        const { success, data } = await useApi<UserPermissions>('/auth/permissions', {
 | 
						|
          method: 'GET',
 | 
						|
          handleError: false
 | 
						|
        });
 | 
						|
 | 
						|
        if (success && data) {
 | 
						|
          permissions.value = {
 | 
						|
            resources: {
 | 
						|
              pageGroups: data.resources?.pageGroups || [],
 | 
						|
              pages: data.resources?.pages || [],
 | 
						|
              components: data.resources?.components || []
 | 
						|
            }
 | 
						|
          };
 | 
						|
          return true;
 | 
						|
        }
 | 
						|
        return false;
 | 
						|
        */
 | 
						|
 | 
						|
        // 임시 가데이터 사용
 | 
						|
        await new Promise(resolve => setTimeout(resolve, 3000)); // 로딩 시뮬레이션
 | 
						|
 | 
						|
        permissions.value = {
 | 
						|
          resources: {
 | 
						|
            pageGroups: [...MOCK_PERMISSIONS.resources.pageGroups],
 | 
						|
            pages: [...MOCK_PERMISSIONS.resources.pages],
 | 
						|
            components: [...MOCK_PERMISSIONS.resources.components],
 | 
						|
          },
 | 
						|
        };
 | 
						|
 | 
						|
        return true;
 | 
						|
      }, "권한 정보를 불러오는 중...");
 | 
						|
    };
 | 
						|
 | 
						|
    const getPagePaths = (): string[] => {
 | 
						|
      return permissions.value.resources.pages
 | 
						|
        .map(page => page.path)
 | 
						|
        .filter(Boolean) as string[];
 | 
						|
    };
 | 
						|
 | 
						|
    const getPageGroupCodes = (): string[] => {
 | 
						|
      return permissions.value.resources.pageGroups.map(
 | 
						|
        pageGroup => pageGroup.code
 | 
						|
      );
 | 
						|
    };
 | 
						|
 | 
						|
    const getComponentCodes = (): string[] => {
 | 
						|
      return permissions.value.resources.components.map(
 | 
						|
        component => component.code
 | 
						|
      );
 | 
						|
    };
 | 
						|
 | 
						|
    const hasPagePermission = (page: string): boolean => {
 | 
						|
      const pagePaths = getPagePaths();
 | 
						|
 | 
						|
      // 1. 정확한 경로 매치 먼저 확인
 | 
						|
      if (pagePaths.includes(page)) {
 | 
						|
        return true;
 | 
						|
      }
 | 
						|
 | 
						|
      // 2. 동적 라우팅 패턴 체크
 | 
						|
      for (const allowedPath of pagePaths) {
 | 
						|
        // 동적 라우팅 패턴: /[tabId]/path 형태
 | 
						|
        const dynamicPattern = new RegExp(`^/\\d+${allowedPath}$`);
 | 
						|
        if (dynamicPattern.test(page)) {
 | 
						|
          return true;
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      return false;
 | 
						|
    };
 | 
						|
 | 
						|
    const hasPageGroupPermission = (pageGroup: string): boolean => {
 | 
						|
      return getPageGroupCodes().includes(pageGroup);
 | 
						|
    };
 | 
						|
 | 
						|
    const hasComponentPermission = (component: string): boolean => {
 | 
						|
      return getComponentCodes().includes(component);
 | 
						|
    };
 | 
						|
 | 
						|
    // 권한 초기화
 | 
						|
    const clearPermissions = () => {
 | 
						|
      permissions.value = {
 | 
						|
        resources: {
 | 
						|
          pageGroups: [],
 | 
						|
          pages: [],
 | 
						|
          components: [],
 | 
						|
        },
 | 
						|
      };
 | 
						|
    };
 | 
						|
 | 
						|
    return {
 | 
						|
      permissions,
 | 
						|
 | 
						|
      fetchPermissions,
 | 
						|
      clearPermissions,
 | 
						|
 | 
						|
      hasPagePermission,
 | 
						|
      hasPageGroupPermission,
 | 
						|
      hasComponentPermission,
 | 
						|
 | 
						|
      getPagePaths,
 | 
						|
      getPageGroupCodes,
 | 
						|
      getComponentCodes,
 | 
						|
    };
 | 
						|
  },
 | 
						|
  {
 | 
						|
    persist: true,
 | 
						|
  }
 | 
						|
);
 |