summaryrefslogtreecommitdiff
path: root/lib/permissions/permission-settings-actions.ts
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-09-29 13:31:40 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-09-29 13:31:40 +0000
commit4614210aa9878922cfa1e424ce677ef893a1b6b2 (patch)
tree5e7edcce05fbee207230af0a43ed08cd351d7c4f /lib/permissions/permission-settings-actions.ts
parente41e3af4e72870d44a94b03e0f3246d6ccaaca48 (diff)
(대표님) 구매 권한설정, data room 등
Diffstat (limited to 'lib/permissions/permission-settings-actions.ts')
-rw-r--r--lib/permissions/permission-settings-actions.ts54
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<{