233 lines
6.4 KiB
TypeScript
233 lines
6.4 KiB
TypeScript
import type { UserPermissions, Resource } from "~/types/permissions";
|
|
import { MOCK_PERMISSIONS } from "~/types/permissions";
|
|
|
|
export const usePermissionsStore = defineStore(
|
|
"permissions",
|
|
() => {
|
|
// 권한 데이터 상태
|
|
const permissions = ref<UserPermissions>({
|
|
resources: {
|
|
pageGroups: [],
|
|
pages: [],
|
|
components: [],
|
|
},
|
|
});
|
|
|
|
// 권한 로딩 상태
|
|
const isLoading = ref(false);
|
|
|
|
// 서버에서 권한 데이터 가져오기 (현재는 가데이터 사용)
|
|
const fetchPermissions = async (): Promise<boolean> => {
|
|
try {
|
|
isLoading.value = true;
|
|
|
|
// 실제 API 호출 (백엔드 준비되면 주석 해제)
|
|
/*
|
|
const { success, data } = await useApi<{
|
|
pagePermissions: string[];
|
|
menuPermissions: string[];
|
|
componentPermissions: string[];
|
|
}>('/auth/permissions', {
|
|
method: 'GET',
|
|
handleError: false
|
|
});
|
|
|
|
if (success && data) {
|
|
permissions.value = {
|
|
pagePermissions: data.pagePermissions || [],
|
|
menuPermissions: data.menuPermissions || [],
|
|
componentPermissions: data.componentPermissions || []
|
|
};
|
|
return true;
|
|
}
|
|
return false;
|
|
*/
|
|
|
|
// 임시 가데이터 사용
|
|
await new Promise(resolve => setTimeout(resolve, 500)); // 로딩 시뮬레이션
|
|
|
|
permissions.value = {
|
|
resources: {
|
|
pageGroups: [...MOCK_PERMISSIONS.resources.pageGroups],
|
|
pages: [...MOCK_PERMISSIONS.resources.pages],
|
|
components: [...MOCK_PERMISSIONS.resources.components],
|
|
},
|
|
};
|
|
|
|
return true;
|
|
} catch (error) {
|
|
console.error("권한 데이터 로드 실패:", error);
|
|
return false;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// 헬퍼 함수들 - 기존 호환성을 위한 함수들
|
|
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 => {
|
|
return getPagePaths().includes(page);
|
|
};
|
|
|
|
const hasPageGroupPermission = (pageGroup: string): boolean => {
|
|
return getPageGroupCodes().includes(pageGroup);
|
|
};
|
|
|
|
const hasComponentPermission = (component: string): boolean => {
|
|
return getComponentCodes().includes(component);
|
|
};
|
|
|
|
// 여러 권한 중 하나라도 있는지 체크
|
|
const hasAnyPagePermission = (pages: string[]): boolean => {
|
|
return pages.some(page => hasPagePermission(page));
|
|
};
|
|
|
|
const hasAnyPageGroupPermission = (pageGroups: string[]): boolean => {
|
|
return pageGroups.some(pageGroup => hasPageGroupPermission(pageGroup));
|
|
};
|
|
|
|
const hasAnyComponentPermission = (components: string[]): boolean => {
|
|
return components.some(component => hasComponentPermission(component));
|
|
};
|
|
|
|
// 계층 구조를 고려한 권한 체크 함수들
|
|
const hasResourcePermission = (resourceCode: string): boolean => {
|
|
return (
|
|
findResourceByCode(permissions.value.resources, resourceCode) !==
|
|
undefined
|
|
);
|
|
};
|
|
|
|
const getResourceByCode = (code: string): Resource | undefined => {
|
|
return findResourceByCode(permissions.value.resources, code);
|
|
};
|
|
|
|
const getResourceByPath = (path: string): Resource | undefined => {
|
|
return findResourceByPath(permissions.value.resources, path);
|
|
};
|
|
|
|
const getChildResources = (parentCode: string): Resource[] => {
|
|
const parent = findResourceByCode(
|
|
permissions.value.resources,
|
|
parentCode
|
|
);
|
|
return parent?.children || [];
|
|
};
|
|
|
|
// 계층 구조에서 리소스 찾기 헬퍼 함수들
|
|
|
|
const findResourceByCode = (
|
|
resources: {
|
|
pageGroups: Resource[];
|
|
pages: Resource[];
|
|
components: Resource[];
|
|
},
|
|
code: string
|
|
): Resource | undefined => {
|
|
const allResources = [
|
|
...resources.pageGroups,
|
|
...resources.pages,
|
|
...resources.components,
|
|
];
|
|
for (const resource of allResources) {
|
|
if (resource.code === code) return resource;
|
|
if (resource.children) {
|
|
const found = findResourceByCode(
|
|
{ pageGroups: [], pages: [], components: resource.children },
|
|
code
|
|
);
|
|
if (found) return found;
|
|
}
|
|
}
|
|
return undefined;
|
|
};
|
|
|
|
const findResourceByPath = (
|
|
resources: {
|
|
pageGroups: Resource[];
|
|
pages: Resource[];
|
|
components: Resource[];
|
|
},
|
|
path: string
|
|
): Resource | undefined => {
|
|
const allResources = [
|
|
...resources.pageGroups,
|
|
...resources.pages,
|
|
...resources.components,
|
|
];
|
|
for (const resource of allResources) {
|
|
if (resource.path === path) return resource;
|
|
if (resource.children) {
|
|
const found = findResourceByPath(
|
|
{ pageGroups: [], pages: [], components: resource.children },
|
|
path
|
|
);
|
|
if (found) return found;
|
|
}
|
|
}
|
|
return undefined;
|
|
};
|
|
|
|
// 권한 초기화
|
|
const clearPermissions = () => {
|
|
permissions.value = {
|
|
resources: {
|
|
pageGroups: [],
|
|
pages: [],
|
|
components: [],
|
|
},
|
|
};
|
|
};
|
|
|
|
return {
|
|
// 상태
|
|
permissions: readonly(permissions),
|
|
isLoading: readonly(isLoading),
|
|
|
|
// 액션
|
|
fetchPermissions,
|
|
clearPermissions,
|
|
|
|
// 기존 호환성 함수들
|
|
hasPagePermission,
|
|
hasPageGroupPermission,
|
|
hasComponentPermission,
|
|
hasAnyPagePermission,
|
|
hasAnyPageGroupPermission,
|
|
hasAnyComponentPermission,
|
|
|
|
// 헬퍼 함수들
|
|
getPagePaths,
|
|
getPageGroupCodes,
|
|
getComponentCodes,
|
|
|
|
// 새로운 계층 구조 권한 체크 함수들
|
|
hasResourcePermission,
|
|
getResourceByCode,
|
|
getResourceByPath,
|
|
getChildResources,
|
|
};
|
|
},
|
|
{
|
|
persist: true,
|
|
}
|
|
);
|