diff options
Diffstat (limited to 'lib/permissions/permission-settings-actions.ts')
| -rw-r--r-- | lib/permissions/permission-settings-actions.ts | 54 |
1 files changed, 49 insertions, 5 deletions
diff --git a/lib/permissions/permission-settings-actions.ts b/lib/permissions/permission-settings-actions.ts index 5d04a1d3..bb82b456 100644 --- a/lib/permissions/permission-settings-actions.ts +++ b/lib/permissions/permission-settings-actions.ts @@ -12,6 +12,37 @@ import { import { getServerSession } from "next-auth/next" import { authOptions } from "@/app/api/auth/[...nextauth]/route" import { checkUserPermission } from "./service"; +import fs from 'fs/promises'; +import path from 'path'; + +// i18n 번역 파일을 읽어오는 헬퍼 함수 +async function getTranslations(locale: string = 'ko') { + try { + const filePath = path.join(process.cwd(), 'i18n', 'locales', locale, 'menu.json'); + const fileContent = await fs.readFile(filePath, 'utf-8'); + return JSON.parse(fileContent); + } catch (error) { + console.error(`Failed to load translations for ${locale}:`, error); + return {}; + } +} + +// 중첩된 객체에서 키로 값을 가져오는 헬퍼 함수 +function getNestedValue(obj: any, key: string): string { + const keys = key.split('.'); + let value = obj; + + for (const k of keys) { + if (value && typeof value === 'object' && k in value) { + value = value[k]; + } else { + return key; // 키를 찾지 못하면 원본 키를 반환 + } + } + + return typeof value === 'string' ? value : key; +} + // 모든 권한 조회 export async function getAllPermissions() { @@ -110,7 +141,11 @@ export async function deletePermission(id: number) { } // 메뉴 권한 분석 + export async function analyzeMenuPermissions() { + // 한국어 번역 파일 로드 + const translations = await getTranslations('ko'); + const menus = await db.select().from(menuAssignments); const analysis = await Promise.all( @@ -126,20 +161,26 @@ export async function analyzeMenuPermissions() { .innerJoin(permissions, eq(permissions.id, menuRequiredPermissions.permissionId)) .where(eq(menuRequiredPermissions.menuPath, menu.menuPath)); + // i18n 키를 실제 텍스트로 변환 + const menuTitleTranslated = getNestedValue(translations, menu.menuTitle); + const menuDescriptionTranslated = menu.menuDescription + ? getNestedValue(translations, menu.menuDescription) + : ''; + // 제안할 권한 생성 const suggestedPermissions = []; const resourceName = menu.menuPath.split('/').pop() || 'unknown'; - // 기본 메뉴 접근 권한 + // 기본 메뉴 접근 권한 (번역된 제목 사용) suggestedPermissions.push({ permissionKey: `${resourceName}.menu_access`, - name: `${menu.menuTitle} 접근`, + name: `${menuTitleTranslated} 접근`, permissionType: "menu_access", action: "access", scope: "assigned", }); - // CRUD 권한 제안 + // CRUD 권한 제안 (번역된 제목 사용) const actions = [ { action: "view", name: "조회", type: "data_read" }, { action: "create", name: "생성", type: "data_write" }, @@ -150,7 +191,7 @@ export async function analyzeMenuPermissions() { actions.forEach(({ action, name, type }) => { suggestedPermissions.push({ permissionKey: `${resourceName}.${action}`, - name: `${menu.menuTitle} ${name}`, + name: `${menuTitleTranslated} ${name}`, permissionType: type, action, scope: "assigned", @@ -159,7 +200,9 @@ export async function analyzeMenuPermissions() { return { menuPath: menu.menuPath, - menuTitle: menu.menuTitle, + menuTitle: menuTitleTranslated, // 번역된 제목 + menuTitleKey: menu.menuTitle, // 원본 i18n 키 (필요한 경우) + menuDescription: menuDescriptionTranslated, // 번역된 설명 domain: menu.domain, existingPermissions: existing, suggestedPermissions: suggestedPermissions.filter( @@ -172,6 +215,7 @@ export async function analyzeMenuPermissions() { return analysis; } + // 메뉴 기반 권한 생성 export async function generateMenuPermissions( permissionsToCreate: Array<{ |
