From 0df708f8499fd952440dc1b186a9b23a23093cae Mon Sep 17 00:00:00 2001 From: bicochan Date: Mon, 9 Jun 2025 13:33:38 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EA=B6=8C=ED=95=9C=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../role/register/[roleId]/page.tsx | 10 +++ apps/cs/src/pages/role/api/role-service.ts | 18 +++++- apps/cs/src/pages/role/index.ts | 1 + .../cs/src/pages/role/model/role-interface.ts | 3 + apps/cs/src/pages/role/ui/modify-page.tsx | 62 +++++++++++++++++++ apps/cs/src/pages/role/ui/role-form.tsx | 3 +- apps/cs/src/pages/role/ui/role-page.tsx | 2 +- 7 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 apps/cs/app/(with-base-layout)/role/register/[roleId]/page.tsx create mode 100644 apps/cs/src/pages/role/ui/modify-page.tsx diff --git a/apps/cs/app/(with-base-layout)/role/register/[roleId]/page.tsx b/apps/cs/app/(with-base-layout)/role/register/[roleId]/page.tsx new file mode 100644 index 000000000..53ba411c8 --- /dev/null +++ b/apps/cs/app/(with-base-layout)/role/register/[roleId]/page.tsx @@ -0,0 +1,10 @@ +import { ModifyPage as VMModifyPage } from "@/pages/role"; + +export default async function ModifyPage({ + params, +}: { + params: Promise<{ roleId: string }>; +}) { + const { roleId } = await params; + return ; +} diff --git a/apps/cs/src/pages/role/api/role-service.ts b/apps/cs/src/pages/role/api/role-service.ts index 2d5e93462..d2db7e5bc 100644 --- a/apps/cs/src/pages/role/api/role-service.ts +++ b/apps/cs/src/pages/role/api/role-service.ts @@ -1,10 +1,11 @@ import { client } from "@/shared/api"; import { ENDPOINT } from "@/shared/config"; import type { - RoleService, + Role, RoleList, RoleParams, RoleFormData, + RoleService, } from "../model/role-interface"; export class RoleApiService implements RoleService { @@ -15,10 +16,25 @@ export class RoleApiService implements RoleService { return response.data; } + public async getRoleInfo(roleId: string): Promise { + const response = await client.get( + `${ENDPOINT.USER_SERVICE.ROLES}/${roleId}`, + ); + return response.data; + } + public async createRole(data: RoleFormData): Promise { await client.post(ENDPOINT.USER_SERVICE.ROLES, data); } + public async updateRole(roleId: string, data: RoleFormData): Promise { + await client.put(`${ENDPOINT.USER_SERVICE.ROLES}/${roleId}`, data); + } + + public async deleteRole(roleId: string): Promise { + await client.delete(`${ENDPOINT.USER_SERVICE.ROLES}/${roleId}`); + } + public async checkDuplicateRoleId(roleId: string): Promise { const response = await client.get( `${ENDPOINT.USER_SERVICE.ROLES}/check/dup`, diff --git a/apps/cs/src/pages/role/index.ts b/apps/cs/src/pages/role/index.ts index 361a5fc10..06df5e23e 100644 --- a/apps/cs/src/pages/role/index.ts +++ b/apps/cs/src/pages/role/index.ts @@ -1,2 +1,3 @@ export { RolePage } from "./ui/role-page"; export { CreatePage } from "./ui/create-page"; +export { ModifyPage } from "./ui/modify-page"; diff --git a/apps/cs/src/pages/role/model/role-interface.ts b/apps/cs/src/pages/role/model/role-interface.ts index a412912b6..1b9b8eea2 100644 --- a/apps/cs/src/pages/role/model/role-interface.ts +++ b/apps/cs/src/pages/role/model/role-interface.ts @@ -29,6 +29,9 @@ export type RoleFormData = z.infer; export interface RoleService { getRoles: (params: RoleParams) => Promise; + getRoleInfo: (roleId: string) => Promise; createRole: (data: RoleFormData) => Promise; + updateRole: (roleId: string, data: RoleFormData) => Promise; + deleteRole: (roleId: string) => Promise; checkDuplicateRoleId: (roleId: string) => Promise; } diff --git a/apps/cs/src/pages/role/ui/modify-page.tsx b/apps/cs/src/pages/role/ui/modify-page.tsx new file mode 100644 index 000000000..9c57538d4 --- /dev/null +++ b/apps/cs/src/pages/role/ui/modify-page.tsx @@ -0,0 +1,62 @@ +"use client"; + +import { useRouter } from "next/navigation"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useMutation, useQuery } from "@tanstack/react-query"; +import { useAlertStore } from "@/shared/lib/use-alert-store"; +import { RoleForm } from "./role-form"; +import { RoleApi } from "../api/role-service"; +import { roleFormSchema, type RoleFormData } from "../model/role-interface"; +import { ENDPOINT } from "@/shared/config"; + +function ModifyPage({ roleId }: { roleId: string }) { + const router = useRouter(); + const alert = useAlertStore((state) => state.setMessage); + + const { data: roleInfo } = useQuery({ + queryKey: [ENDPOINT.USER_SERVICE.ROLES, roleId], + queryFn: () => RoleApi.getRoleInfo(roleId), + }); + + const { mutateAsync: updateRole } = useMutation({ + mutationFn: (data: RoleFormData) => RoleApi.updateRole(roleId, data), + onSuccess: () => { + alert("수정되었습니다.", router.back); + }, + }); + + const { mutateAsync: deleteRole } = useMutation({ + mutationFn: () => RoleApi.deleteRole(roleId), + onSuccess: () => { + alert("삭제되었습니다.", router.back); + }, + }); + + const form = useForm({ + resolver: zodResolver(roleFormSchema), + values: { + roleId: roleInfo?.roleId ?? "", + roleName: roleInfo?.roleName ?? "", + roleContent: roleInfo?.roleContent ?? "", + useYn: roleInfo?.useYn ?? "", + mngrYn: roleInfo?.mngrYn ?? "", + }, + }); + + return ( +
+
+

권한 수정

+
+ +
+ ); +} + +export { ModifyPage }; diff --git a/apps/cs/src/pages/role/ui/role-form.tsx b/apps/cs/src/pages/role/ui/role-form.tsx index 5a7973f63..e980bfbeb 100644 --- a/apps/cs/src/pages/role/ui/role-form.tsx +++ b/apps/cs/src/pages/role/ui/role-form.tsx @@ -23,9 +23,10 @@ type RoleFormProps = { roleId?: string; form: UseFormReturn; handleSave: (data: RoleFormData) => Promise; + handleDelete?: () => Promise; }; -function RoleForm({ form, roleId, ...props }: RoleFormProps) { +function RoleForm({ roleId, form, ...props }: RoleFormProps) { const alert = useAlertStore((state) => state.setMessage); const [isValidRoleId, setIsValidRoleId] = useState(false); diff --git a/apps/cs/src/pages/role/ui/role-page.tsx b/apps/cs/src/pages/role/ui/role-page.tsx index eea0aec8f..ca57084b0 100644 --- a/apps/cs/src/pages/role/ui/role-page.tsx +++ b/apps/cs/src/pages/role/ui/role-page.tsx @@ -52,7 +52,7 @@ function RolePage() { }; const handleRowClick = (row: Role) => { - console.log(row); + router.push(`/role/register/${row.roleId}`); }; return (