diff --git a/apps/common/features/src/entities/board/model/board-interface.ts b/apps/common/features/src/entities/board/model/board-interface.ts index 565b998fb..5abd002bc 100644 --- a/apps/common/features/src/entities/board/model/board-interface.ts +++ b/apps/common/features/src/entities/board/model/board-interface.ts @@ -1,12 +1,6 @@ import { z } from "zod"; import type { PageableList, PageableParams } from "@/shared/model"; - -export const BOARD_TYPE = { - BBSNORMAL: "BBSNORMAL", - BBSFAQ: "BBSFAQ", - BBSIMAGE: "BBSIMAGE", - BBSMOVIE: "BBSMOVIE", -} as const; +import type { BbsType } from "@/shared/store/menu-store"; export const BOARD_POSTING_CODE = { 팝업게시: "01", @@ -14,7 +8,6 @@ export const BOARD_POSTING_CODE = { 기간게시: "03", } as const; -export type BoardType = (typeof BOARD_TYPE)[keyof typeof BOARD_TYPE]; export type BoardPostingCode = (typeof BOARD_POSTING_CODE)[keyof typeof BOARD_POSTING_CODE]; @@ -45,7 +38,7 @@ export interface BoardPopupParams extends PageableParams { export interface Board { bbsId: number; - bbsTypeCd: string; + bbsTypeCd: BbsType; bbsTypeNm: string; bbsNm: string; bbsExpln: string; diff --git a/apps/cs/src/entities/board/model/board-interface.ts b/apps/cs/src/entities/board/model/board-interface.ts index 565b998fb..5abd002bc 100644 --- a/apps/cs/src/entities/board/model/board-interface.ts +++ b/apps/cs/src/entities/board/model/board-interface.ts @@ -1,12 +1,6 @@ import { z } from "zod"; import type { PageableList, PageableParams } from "@/shared/model"; - -export const BOARD_TYPE = { - BBSNORMAL: "BBSNORMAL", - BBSFAQ: "BBSFAQ", - BBSIMAGE: "BBSIMAGE", - BBSMOVIE: "BBSMOVIE", -} as const; +import type { BbsType } from "@/shared/store/menu-store"; export const BOARD_POSTING_CODE = { 팝업게시: "01", @@ -14,7 +8,6 @@ export const BOARD_POSTING_CODE = { 기간게시: "03", } as const; -export type BoardType = (typeof BOARD_TYPE)[keyof typeof BOARD_TYPE]; export type BoardPostingCode = (typeof BOARD_POSTING_CODE)[keyof typeof BOARD_POSTING_CODE]; @@ -45,7 +38,7 @@ export interface BoardPopupParams extends PageableParams { export interface Board { bbsId: number; - bbsTypeCd: string; + bbsTypeCd: BbsType; bbsTypeNm: string; bbsNm: string; bbsExpln: string; diff --git a/apps/cs/src/entities/menu-authority/@x/menu.ts b/apps/cs/src/entities/menu-authority/@x/menu.ts new file mode 100644 index 000000000..86479f859 --- /dev/null +++ b/apps/cs/src/entities/menu-authority/@x/menu.ts @@ -0,0 +1 @@ +export { MenuAuthorityApi } from "../api/menu-authority-service"; diff --git a/apps/cs/src/entities/menu-authority/api/menu-authority-service.ts b/apps/cs/src/entities/menu-authority/api/menu-authority-service.ts index 22e3dcefa..14988eee0 100644 --- a/apps/cs/src/entities/menu-authority/api/menu-authority-service.ts +++ b/apps/cs/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/cs/src/entities/menu-authority/model/menu-authority-interface.ts b/apps/cs/src/entities/menu-authority/model/menu-authority-interface.ts index 7467728fe..b59574c2f 100644 --- a/apps/cs/src/entities/menu-authority/model/menu-authority-interface.ts +++ b/apps/cs/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/cs/src/entities/menu/lib/menu-wrapper.tsx b/apps/cs/src/entities/menu/lib/menu-wrapper.tsx index d473548af..277cae8d3 100644 --- a/apps/cs/src/entities/menu/lib/menu-wrapper.tsx +++ b/apps/cs/src/entities/menu/lib/menu-wrapper.tsx @@ -1,28 +1,70 @@ "use client"; import { useEffect } from "react"; -import { usePathname } from "next/navigation"; +import { usePathname, useRouter } from "next/navigation"; +import { useLocalStorage } from "@frontend-opensource/use-react-hooks"; +import { MenuAuthorityApi } from "@/entities/menu-authority/@x/menu"; +import { getCookie, useAlertStore, useMenuStore } from "@/shared/lib"; import { SITE_ID } from "@/shared/config"; -import { 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, + setBbsInfo, + setCurrentMenuInfo, + setPageMenuAuthority, + } = useMenuStore((state) => state); + + const [storedBbsInfo] = useLocalStorage("bbs-info", ""); + + 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]); + + useEffect(() => { + if (!storedBbsInfo) return; + setBbsInfo(JSON.parse(storedBbsInfo)); + }, [storedBbsInfo]); + return <>{children}; };