import 'server-only'; import { cache } from 'react'; import type { SidebarMenu } from '@/lib/domain/sidebar-menu'; /** * 사이드바 메뉴 Repository — 계정 권한에 맞는 메뉴 트리를 가져온다. * * **아직 백엔드 API가 없다.** 지금은 아래 mock을 돌려주지만, 호출부는 이미 "권한을 넘기면 * 트리가 온다"는 계약만 알고 있으므로 API가 생기면 이 파일의 함수 본문만 교체하면 된다 * (다른 Repository와 같은 자리·같은 모양이다). * * 권한을 인자로 받는 이유 — 메뉴는 계정마다 다르다. 인자로 두면 `cache()`가 권한별로 따로 * 기억해, 한 요청 안에서 여러 번 불러도 한 번만 조회하면서 다른 권한의 결과가 섞이지 않는다. * * 교체할 때는 다른 Repository처럼 `backendFetch` + `getSessionAccessToken`을 쓰고, 응답을 * `SidebarMenu`로 매핑하는 `toSidebarMenu`만 추가하면 된다. */ /** * mock 메뉴 — 지금 실제로 존재하는 화면만 담는다. 갈 곳 없는 항목을 넣으면 눌러도 아무 일이 * 없어 고장으로 보이므로, 시안에 있는 통합플랫폼 메뉴(기관 관리·역할 관리 등)는 넣지 않았다. * * 라벨과 계층은 기획 시안의 화면경로를 그대로 따른다 — 「학생 회원 < 회원정보관리」, * 「관리자 회원 < 관리자정보관리」, 「아이템 관리 < 꾸미기아이템관리」, * 「공지사항/1:1문의/FAQ < 게시판관리(고객센터)」. * * 아이콘은 시안 1depth가 쓰는 Phosphor 세트에서 골랐다. */ const MOCK_MENU: SidebarMenu = { favorites: [ { id: 'fav-students', label: '학생 회원', href: '/students' }, { id: 'fav-admins', label: '관리자 회원', href: '/admins' }, { id: 'fav-notices', label: '공지사항', href: '/boards/notices' }, ], sections: [ { id: 'operation', label: '운영 관리', items: [ { id: 'home', label: '홈', icon: 'house', href: '/' }, { id: 'members', label: '회원정보관리', icon: 'users-three', children: [ { id: 'students', label: '학생 회원', href: '/students' }, ], }, { id: 'admins', label: '관리자정보관리', icon: 'user-square', children: [{ id: 'admin-members', label: '관리자 회원', href: '/admins' }], }, { id: 'decoration', label: '꾸미기아이템관리', icon: 'potted-plant', children: [ { id: 'decoration-items', label: '아이템 관리', href: '/decoration-items' }, ], }, { id: 'boards', label: '게시판관리(고객센터)', icon: 'pencil-simple', children: [ { id: 'notices', label: '공지사항', href: '/boards/notices' }, { id: 'inquiries', label: '1:1문의', href: '/boards/inquiries' }, { id: 'faqs', label: 'FAQ', href: '/boards/faqs' }, ], }, { id: 'system', label: '시스템관리', icon: 'wrench', children: [{ id: 'codes', label: '코드관리', href: '/system/codes' }], }, ], }, ], }; /** * 권한에 맞는 사이드바 메뉴를 가져온다. * * @param roleCode 세션의 `admRoleCd`(예: `ROLE_SYSTEM`). 지금은 쓰이지 않지만 API가 붙으면 * 이 값으로 조회한다 — 인자를 미리 받아 두어야 호출부를 나중에 고치지 않는다. */ export const fetchSidebarMenu = cache( async (roleCode: string): Promise => { // TODO(백엔드): 권한별 메뉴 API가 생기면 backendFetch 호출로 교체한다. roleCode를 그대로 // 넘기면 되고, 아래 mock 반환만 지우면 된다. void roleCode; return MOCK_MENU; } );