From 3ae45041287ee96f9f5ff7be6252ff036e075238 Mon Sep 17 00:00:00 2001 From: bicochan Date: Thu, 8 May 2025 09:05:06 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=EC=B2=98=EB=A6=AC=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/menu-authority-service.ts | 10 ++++ .../src/entities/menu-authority/index.ts | 2 + .../model/menu-authority-interface.ts | 9 ++++ .../src/entities/menu/lib/menu-wrapper.tsx | 48 +++++++++++++++---- .../src/pages/notice/ui/notice-page.tsx | 13 +++-- .../features/src/shared/store/menu-store.ts | 6 +++ 6 files changed, 75 insertions(+), 13 deletions(-) diff --git a/apps/common/features/src/entities/menu-authority/api/menu-authority-service.ts b/apps/common/features/src/entities/menu-authority/api/menu-authority-service.ts index 22e3dcefa..14988eee0 100644 --- a/apps/common/features/src/entities/menu-authority/api/menu-authority-service.ts +++ b/apps/common/features/src/entities/menu-authority/api/menu-authority-service.ts @@ -5,6 +5,7 @@ import type { MenuAuthorityParams, MenuAuthorityPayload, MenuAuthorityService, + PageMenuAuthority, } from "../model/menu-authority-interface"; export class MenuAuthorityApiService implements MenuAuthorityService { @@ -18,6 +19,15 @@ export class MenuAuthorityApiService implements MenuAuthorityService { return response.data; } + public async getPageMenuAuthority( + menuCd: number, + ): Promise { + const response = await client.get( + `${ENDPOINT.CMS_SERVICE.MENU_AUTHRTS}/pageinfo/${menuCd}`, + ); + return response.data; + } + public async saveMenuAuthority(data: MenuAuthorityPayload[]): Promise { const response = await client.post( `${ENDPOINT.CMS_SERVICE.MENU_AUTHRTS}`, diff --git a/apps/common/features/src/entities/menu-authority/index.ts b/apps/common/features/src/entities/menu-authority/index.ts index 07433a098..baf6e6085 100644 --- a/apps/common/features/src/entities/menu-authority/index.ts +++ b/apps/common/features/src/entities/menu-authority/index.ts @@ -1 +1,3 @@ +export { MenuAuthorityApi } from "./api/menu-authority-service"; +export { type PageMenuAuthority } from "./model/menu-authority-interface"; export { ManagementAuthorityDialog } from "./ui/management-authority-dialog"; diff --git a/apps/common/features/src/entities/menu-authority/model/menu-authority-interface.ts b/apps/common/features/src/entities/menu-authority/model/menu-authority-interface.ts index 7467728fe..b59574c2f 100644 --- a/apps/common/features/src/entities/menu-authority/model/menu-authority-interface.ts +++ b/apps/common/features/src/entities/menu-authority/model/menu-authority-interface.ts @@ -7,6 +7,14 @@ export interface MenuAuthorityParams extends PageableParams { useYn?: string; } +export interface PageMenuAuthority { + mngAuthrtYn: string; + inqAuthrtYn: string; + regAuthrtYn: string; + mdfcnAuthrtYn: string; + delAuthrtYn: string; +} + export const menuAuthoritySchema = z.object({ groupId: z.string(), groupNm: z.string(), @@ -35,5 +43,6 @@ export type MenuAuthorityFormData = z.infer; export interface MenuAuthorityService { getMenuAuthorityList(params: MenuAuthorityParams): Promise; + getPageMenuAuthority(menuCd: number): Promise; saveMenuAuthority(data: MenuAuthorityPayload[]): Promise; } diff --git a/apps/common/features/src/entities/menu/lib/menu-wrapper.tsx b/apps/common/features/src/entities/menu/lib/menu-wrapper.tsx index d473548af..1cdf99f8d 100644 --- a/apps/common/features/src/entities/menu/lib/menu-wrapper.tsx +++ b/apps/common/features/src/entities/menu/lib/menu-wrapper.tsx @@ -1,28 +1,58 @@ "use client"; import { useEffect } from "react"; -import { usePathname } from "next/navigation"; +import { usePathname, useRouter } from "next/navigation"; +import { MenuAuthorityApi } from "@/entities/menu-authority"; import { SITE_ID } from "@/shared/config"; -import { useMenuStore } from "@/shared/lib"; +import { getCookie, useAlertStore, useMenuStore } from "@/shared/lib"; import { MenuApi } from "../api/menu-service"; import { getCurrentMenu } from "./utils"; const MenuWrapper = ({ children }: { children: React.ReactNode }) => { + const router = useRouter(); const pathname = usePathname(); - const { setCurrentMenuInfo } = useMenuStore((state) => state); + + const { setMessage: alert } = useAlertStore((state) => state); + const { pageMenuAuthority, setCurrentMenuInfo, setPageMenuAuthority } = + useMenuStore((state) => state); + + const getCurrentMenuInfo = async () => { + const menuRoles = await MenuApi.getMenuRoles(SITE_ID); + if (!menuRoles) return; + return getCurrentMenu(menuRoles, pathname ?? ""); + }; + + const getPageMenuAuthority = async () => { + const menuCd = getCookie("menu-code-key"); + if (!menuCd) return; + const pageMenuAuthority = await MenuAuthorityApi.getPageMenuAuthority( + parseInt(menuCd), + ); + return pageMenuAuthority; + }; + + const checkInquiryAuthority = () => { + return pageMenuAuthority?.inqAuthrtYn === "Y"; + }; useEffect(() => { (async () => { - const menuRoles = await MenuApi.getMenuRoles(SITE_ID); - if (!menuRoles) return; + const currentMenu = await getCurrentMenuInfo(); + if (currentMenu) setCurrentMenuInfo(currentMenu); - const currentMenu = getCurrentMenu(menuRoles, pathname ?? ""); - if (!currentMenu) return; - - setCurrentMenuInfo(currentMenu); + const pageMenuAuthority = await getPageMenuAuthority(); + if (pageMenuAuthority?.length) + setPageMenuAuthority(pageMenuAuthority[0]!); })(); }, []); + useEffect(() => { + if (!pageMenuAuthority) return; + const inquiryAuthority = checkInquiryAuthority(); + if (!inquiryAuthority) + alert("페이지에 대한 조회 권한이 없습니다.", () => router.push("/")); + }, [pageMenuAuthority]); + return <>{children}; }; diff --git a/apps/common/features/src/pages/notice/ui/notice-page.tsx b/apps/common/features/src/pages/notice/ui/notice-page.tsx index 2ca1624dc..ff085824b 100644 --- a/apps/common/features/src/pages/notice/ui/notice-page.tsx +++ b/apps/common/features/src/pages/notice/ui/notice-page.tsx @@ -22,12 +22,15 @@ import { } from "@common/components"; import { PostApi, type Post, type PostParams } from "@/entities/post"; import { ENDPOINT } from "@/shared/config"; +import { useMenuStore } from "@/shared/lib"; import { columns } from "../model/notice-table-columns"; import { NoticeLayout } from "./notice-layout"; function NoticePage({ bbsId }: { bbsId: string }) { const router = useRouter(); const pathname = usePathname(); + const { pageMenuAuthority } = useMenuStore((state) => state); + const [rowSelection, setRowSelection] = useState({}); const [postParams, setPostParams] = useState({ keywordType: "title", @@ -82,7 +85,7 @@ function NoticePage({ bbsId }: { bbsId: string }) {
- + { diff --git a/apps/common/features/src/shared/store/menu-store.ts b/apps/common/features/src/shared/store/menu-store.ts index 9aec06603..cc35e2d3a 100644 --- a/apps/common/features/src/shared/store/menu-store.ts +++ b/apps/common/features/src/shared/store/menu-store.ts @@ -1,23 +1,29 @@ import { createStore } from "zustand/vanilla"; import type { MenuItem } from "@/entities/menu"; +import type { PageMenuAuthority } from "@/entities/menu-authority"; export type MenuState = { currentMenuInfo: MenuItem | null; + pageMenuAuthority: PageMenuAuthority | null; }; export type MenuActions = { setCurrentMenuInfo: (menu: MenuItem) => void; + setPageMenuAuthority: (authority: PageMenuAuthority) => void; }; export type MenuStore = MenuState & MenuActions; export const defaultInitState: MenuState = { currentMenuInfo: null, + pageMenuAuthority: null, }; export const createMenuStore = (initState: MenuState = defaultInitState) => { return createStore()((set) => ({ ...initState, setCurrentMenuInfo: (menu: MenuItem) => set({ currentMenuInfo: menu }), + setPageMenuAuthority: (authority: PageMenuAuthority) => + set({ pageMenuAuthority: authority }), })); };