feat: 권한수정 작업

This commit is contained in:
2025-06-09 13:33:38 +09:00
parent 116a022a20
commit 0df708f849
7 changed files with 96 additions and 3 deletions
@@ -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 <VMModifyPage roleId={roleId} />;
}
+17 -1
View File
@@ -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<Role> {
const response = await client.get<Role>(
`${ENDPOINT.USER_SERVICE.ROLES}/${roleId}`,
);
return response.data;
}
public async createRole(data: RoleFormData): Promise<void> {
await client.post(ENDPOINT.USER_SERVICE.ROLES, data);
}
public async updateRole(roleId: string, data: RoleFormData): Promise<void> {
await client.put(`${ENDPOINT.USER_SERVICE.ROLES}/${roleId}`, data);
}
public async deleteRole(roleId: string): Promise<void> {
await client.delete(`${ENDPOINT.USER_SERVICE.ROLES}/${roleId}`);
}
public async checkDuplicateRoleId(roleId: string): Promise<boolean> {
const response = await client.get(
`${ENDPOINT.USER_SERVICE.ROLES}/check/dup`,
+1
View File
@@ -1,2 +1,3 @@
export { RolePage } from "./ui/role-page";
export { CreatePage } from "./ui/create-page";
export { ModifyPage } from "./ui/modify-page";
@@ -29,6 +29,9 @@ export type RoleFormData = z.infer<typeof roleFormSchema>;
export interface RoleService {
getRoles: (params: RoleParams) => Promise<RoleList>;
getRoleInfo: (roleId: string) => Promise<Role>;
createRole: (data: RoleFormData) => Promise<void>;
updateRole: (roleId: string, data: RoleFormData) => Promise<void>;
deleteRole: (roleId: string) => Promise<void>;
checkDuplicateRoleId: (roleId: string) => Promise<boolean>;
}
+62
View File
@@ -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<RoleFormData>({
resolver: zodResolver(roleFormSchema),
values: {
roleId: roleInfo?.roleId ?? "",
roleName: roleInfo?.roleName ?? "",
roleContent: roleInfo?.roleContent ?? "",
useYn: roleInfo?.useYn ?? "",
mngrYn: roleInfo?.mngrYn ?? "",
},
});
return (
<div className="card card-border !mt-6">
<div className="card-header">
<h3 className="text-2xl font-medium text-label">권한 수정</h3>
</div>
<RoleForm
roleId={roleId}
form={form}
handleSave={updateRole}
handleDelete={deleteRole}
/>
</div>
);
}
export { ModifyPage };
+2 -1
View File
@@ -23,9 +23,10 @@ type RoleFormProps = {
roleId?: string;
form: UseFormReturn<RoleFormData>;
handleSave: (data: RoleFormData) => Promise<void>;
handleDelete?: () => Promise<void>;
};
function RoleForm({ form, roleId, ...props }: RoleFormProps) {
function RoleForm({ roleId, form, ...props }: RoleFormProps) {
const alert = useAlertStore((state) => state.setMessage);
const [isValidRoleId, setIsValidRoleId] = useState(false);
+1 -1
View File
@@ -52,7 +52,7 @@ function RolePage() {
};
const handleRowClick = (row: Role) => {
console.log(row);
router.push(`/role/register/${row.roleId}`);
};
return (