diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-06-30 08:28:13 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-06-30 08:28:13 +0000 |
| commit | 5b6313f16f508882a0ea67716b7dbaa1c6967f04 (patch) | |
| tree | 3d1d8dafea2f31274ace3fbda08333e889e06d1c /lib/menu-list/servcie.ts | |
| parent | 3f0fad18483a5c800c79c5e33946d9bb384c10e2 (diff) | |
(대표님) 20250630 16시 - 유저 도메인별 라우터 분리와 보안성검토 대응
Diffstat (limited to 'lib/menu-list/servcie.ts')
| -rw-r--r-- | lib/menu-list/servcie.ts | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/lib/menu-list/servcie.ts b/lib/menu-list/servcie.ts new file mode 100644 index 00000000..35362e6d --- /dev/null +++ b/lib/menu-list/servcie.ts @@ -0,0 +1,239 @@ +// app/evcp/menu-list/actions.ts + +"use server"; + +import db from "@/db/db"; +import { menuAssignments, users } from "@/db/schema"; +import { eq, and } from "drizzle-orm"; +import { revalidatePath } from "next/cache"; +import { mainNav, mainNavVendor, additionalNav, additionalNavVendor } from "@/config/menuConfig"; + +// 메뉴 데이터 타입 정의 +interface MenuData { + menuPath: string; + menuTitle: string; + menuDescription?: string; + menuGroup?: string; + sectionTitle: string; + domain: "evcp" | "partners"; +} + +// Config에서 메뉴 데이터 추출 +function extractMenusFromConfig(): MenuData[] { + const menus: MenuData[] = []; + + // EVCP 메인 네비게이션 + mainNav.forEach(section => { + section.items.forEach(item => { + menus.push({ + menuPath: item.href, + menuTitle: item.title, + menuDescription: item.description, + menuGroup: item.group, + sectionTitle: section.title, + domain: "evcp" + }); + }); + }); + + // EVCP 추가 네비게이션 + additionalNav.forEach(item => { + menus.push({ + menuPath: item.href, + menuTitle: item.title, + menuDescription: item.description, + menuGroup: undefined, + sectionTitle: "추가 메뉴", + domain: "evcp" + }); + }); + + // Partners 메인 네비게이션 + mainNavVendor.forEach(section => { + section.items.forEach(item => { + menus.push({ + menuPath: item.href, + menuTitle: item.title, + menuDescription: item.description, + menuGroup: item.group, + sectionTitle: section.title, + domain: "partners" + }); + }); + }); + + // Partners 추가 네비게이션 + additionalNavVendor.forEach(item => { + menus.push({ + menuPath: item.href, + menuTitle: item.title, + menuDescription: item.description, + menuGroup: undefined, + sectionTitle: "추가 메뉴", + domain: "partners" + }); + }); + + return menus; +} + +// 초기 메뉴 데이터 생성 또는 업데이트 +export async function initializeMenuAssignments() { + try { + const configMenus = extractMenusFromConfig(); + const existingMenus = await db.select().from(menuAssignments); + const existingPaths = new Set(existingMenus.map(m => m.menuPath)); + + // 새로운 메뉴만 추가 + const newMenus = configMenus.filter(menu => !existingPaths.has(menu.menuPath)); + + console.log(newMenus, newMenus) + + if (newMenus.length > 0) { + await db.insert(menuAssignments).values( + newMenus.map(menu => ({ + menuPath: menu.menuPath, + menuTitle: menu.menuTitle, + menuDescription: menu.menuDescription || null, + menuGroup: menu.menuGroup || null, + sectionTitle: menu.sectionTitle, + domain: menu.domain, + isActive: true, + })) + ); + } + + // 기존 메뉴 정보 업데이트 (title, description 등이 변경될 수 있음) + for (const configMenu of configMenus) { + if (existingPaths.has(configMenu.menuPath)) { + await db + .update(menuAssignments) + .set({ + menuTitle: configMenu.menuTitle, + menuDescription: configMenu.menuDescription || null, + menuGroup: configMenu.menuGroup || null, + sectionTitle: configMenu.sectionTitle, + updatedAt: new Date(), + }) + .where(eq(menuAssignments.menuPath, configMenu.menuPath)); + } + } + + revalidatePath("/evcp/menu-list"); + return { success: true, message: `${newMenus.length}개의 새로운 메뉴가 추가되었습니다.` }; + } catch (error) { + console.error("메뉴 초기화 오류:", error); + return { success: false, message: "메뉴 초기화 중 오류가 발생했습니다." }; + } +} + +// 메뉴 담당자 업데이트 +export async function updateMenuManager( + menuPath: string, + manager1Id?: number | null, + manager2Id?: number | null +) { + try { + + console.log(menuPath, manager1Id) + + await db + .update(menuAssignments) + .set({ + manager1Id: manager1Id || null, + manager2Id: manager2Id || null, + updatedAt: new Date(), + }) + .where(eq(menuAssignments.menuPath, menuPath)); + + revalidatePath("/evcp/menu-list"); + return { success: true, message: "담당자가 업데이트되었습니다." }; + } catch (error) { + console.error("담당자 업데이트 오류:", error); + return { success: false, message: "담당자 업데이트 중 오류가 발생했습니다." }; + } +} + +// 메뉴 리스트 조회 (담당자 정보 포함) +export async function getMenuAssignments(domain?: "evcp" | "partners") { + try { + const whereCondition = domain + ? eq(menuAssignments.domain, domain) + : undefined; + + const result = await db + .select({ + id: menuAssignments.id, + menuPath: menuAssignments.menuPath, + menuTitle: menuAssignments.menuTitle, + menuDescription: menuAssignments.menuDescription, + menuGroup: menuAssignments.menuGroup, + sectionTitle: menuAssignments.sectionTitle, + domain: menuAssignments.domain, + isActive: menuAssignments.isActive, + createdAt: menuAssignments.createdAt, + updatedAt: menuAssignments.updatedAt, + manager1Id: menuAssignments.manager1Id, + manager2Id: menuAssignments.manager2Id, + manager1Name: users.name, + manager1Email: users.email, + manager2Name: users.name, + manager2Email: users.email, + }) + .from(menuAssignments) + .leftJoin(users, eq(menuAssignments.manager1Id, users.id)) + .where(whereCondition) + .orderBy(menuAssignments.sectionTitle, menuAssignments.menuGroup, menuAssignments.menuTitle); + + return { success: true, data: result }; + } catch (error) { + console.error("메뉴 조회 오류:", error); + return { success: false, message: "메뉴 조회 중 오류가 발생했습니다.", data: [] }; + } +} + +// 활성 사용자 리스트 조회 +export async function getActiveUsers(domain?: "evcp" | "partners") { + try { + const whereCondition = and( + eq(users.isActive, true), + domain ? eq(users.domain, domain) : undefined + ); + + const result = await db + .select({ + id: users.id, + name: users.name, + email: users.email, + domain: users.domain, + }) + .from(users) + .where(whereCondition) + .orderBy(users.name); + + return { success: true, data: result }; + } catch (error) { + console.error("사용자 조회 오류:", error); + return { success: false, message: "사용자 조회 중 오류가 발생했습니다.", data: [] }; + } +} + +// 메뉴 활성화/비활성화 +export async function toggleMenuActive(menuPath: string, isActive: boolean) { + try { + await db + .update(menuAssignments) + .set({ + isActive, + updatedAt: new Date(), + }) + .where(eq(menuAssignments.menuPath, menuPath)); + + revalidatePath("/evcp/menu-list"); + + return { success: true, message: `메뉴가 ${isActive ? '활성화' : '비활성화'}되었습니다.` }; + } catch (error) { + console.error("메뉴 상태 변경 오류:", error); + return { success: false, message: "메뉴 상태 변경 중 오류가 발생했습니다." }; + } +}
\ No newline at end of file |
