From 6fd115433761d4f87d7c09a82cb84498c1c8f610 Mon Sep 17 00:00:00 2001 From: bicochan Date: Wed, 16 Apr 2025 15:44:59 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=AA=A8=EB=93=88=20API=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/register/page.tsx | 2 + apps/cs/src/pages/banner/ui/banner-form.tsx | 1 - apps/cs/src/pages/image/ui/image-form.tsx | 3 +- .../pages/module/api/authorization-service.ts | 12 ++ apps/cs/src/pages/module/index.ts | 1 + .../module/model/authorizations-interface.ts | 29 ++- .../src/pages/module/model/table-columns.tsx | 2 +- apps/cs/src/pages/module/ui/create-page.tsx | 45 +++++ apps/cs/src/pages/module/ui/module-form.tsx | 166 ++++++++++++++++++ apps/cs/src/pages/module/ui/module-page.tsx | 12 +- apps/cs/src/pages/site/ui/site-form.tsx | 2 +- .../widgets/form-wrapper/ui/form-wrapper.tsx | 4 +- 12 files changed, 263 insertions(+), 16 deletions(-) create mode 100644 apps/cs/app/(with-base-layout)/module/register/page.tsx create mode 100644 apps/cs/src/pages/module/ui/create-page.tsx create mode 100644 apps/cs/src/pages/module/ui/module-form.tsx diff --git a/apps/cs/app/(with-base-layout)/module/register/page.tsx b/apps/cs/app/(with-base-layout)/module/register/page.tsx new file mode 100644 index 000000000..6354dc8ab --- /dev/null +++ b/apps/cs/app/(with-base-layout)/module/register/page.tsx @@ -0,0 +1,2 @@ +import { CreatePage } from "@/pages/module"; +export default CreatePage; diff --git a/apps/cs/src/pages/banner/ui/banner-form.tsx b/apps/cs/src/pages/banner/ui/banner-form.tsx index b0a31d775..93c550de8 100644 --- a/apps/cs/src/pages/banner/ui/banner-form.tsx +++ b/apps/cs/src/pages/banner/ui/banner-form.tsx @@ -113,7 +113,6 @@ function BannerForm({ form, bnrSn, ...props }: BannerFormProps) { diff --git a/apps/cs/src/pages/image/ui/image-form.tsx b/apps/cs/src/pages/image/ui/image-form.tsx index b5c3de013..ac3d13832 100644 --- a/apps/cs/src/pages/image/ui/image-form.tsx +++ b/apps/cs/src/pages/image/ui/image-form.tsx @@ -128,7 +128,7 @@ function ImageForm({ form, imgSn, ...props }: ImageFormProps) { field.onChange(Number(value)); }} className="w-[12rem] !text-[1.3rem]" - placeholder="정렬순서를 입력해주세요" + placeholder="정렬순서 입력" /> @@ -147,7 +147,6 @@ function ImageForm({ form, imgSn, ...props }: ImageFormProps) { diff --git a/apps/cs/src/pages/module/api/authorization-service.ts b/apps/cs/src/pages/module/api/authorization-service.ts index fc42c8c67..3e0621171 100644 --- a/apps/cs/src/pages/module/api/authorization-service.ts +++ b/apps/cs/src/pages/module/api/authorization-service.ts @@ -4,6 +4,8 @@ import type { AuthorizationsService, AuthorizationsParams, AuthorizationsList, + AuthorizationFormData, + WithRoleAuthorizations, } from "../model/authorizations-interface"; export class AuthorizationsApiService implements AuthorizationsService { @@ -16,6 +18,16 @@ export class AuthorizationsApiService implements AuthorizationsService { ); return response.data; } + + public async createAuthorization( + data: AuthorizationFormData, + ): Promise { + const response = await client.post( + `${ENDPOINT.USER_SERVICE.AUTHORIZATIONS}`, + data, + ); + return response.data; + } } export const AuthorizationsApi = new AuthorizationsApiService(); diff --git a/apps/cs/src/pages/module/index.ts b/apps/cs/src/pages/module/index.ts index 970b914ca..b1e8c3b32 100644 --- a/apps/cs/src/pages/module/index.ts +++ b/apps/cs/src/pages/module/index.ts @@ -1 +1,2 @@ export { ModulePage } from "./ui/module-page"; +export { CreatePage } from "./ui/create-page"; diff --git a/apps/cs/src/pages/module/model/authorizations-interface.ts b/apps/cs/src/pages/module/model/authorizations-interface.ts index 07e100850..61cd849e2 100644 --- a/apps/cs/src/pages/module/model/authorizations-interface.ts +++ b/apps/cs/src/pages/module/model/authorizations-interface.ts @@ -1,3 +1,4 @@ +import { z } from "zod"; import type { PageableList, PageableParams } from "@/shared/model"; export interface AuthorizationsParams extends PageableParams { @@ -16,10 +17,34 @@ export interface Authorizations { mdfcnDt: string; } +export interface WithRoleAuthorizations extends Authorizations { + roleAuthorizations: { + roleId: string; + authorizationNo: number; + authorizationName: string; + urlPatternValue: string; + httpMethodCode: string; + sortSeq: number; + createdAt: string; + }[]; +} + +export const authorizationFormSchema = z.object({ + authorizationName: z.string(), + urlPatternValue: z.string(), + httpMethodCode: z.string(), + sortSeq: z.number(), + useYn: z.string(), +}); + export type AuthorizationsList = PageableList; +export type AuthorizationFormData = z.infer; export interface AuthorizationsService { - getAuthorizationsList( + getAuthorizationsList: ( params: AuthorizationsParams, - ): Promise; + ) => Promise; + createAuthorization: ( + data: AuthorizationFormData, + ) => Promise; } diff --git a/apps/cs/src/pages/module/model/table-columns.tsx b/apps/cs/src/pages/module/model/table-columns.tsx index 56467aa9a..cd6bb0d06 100644 --- a/apps/cs/src/pages/module/model/table-columns.tsx +++ b/apps/cs/src/pages/module/model/table-columns.tsx @@ -10,7 +10,7 @@ export const columns: ColumnDef[] = [ }, { accessorKey: "authorizationName", - header: "API 명", + header: "API명", }, { accessorKey: "urlPatternValue", diff --git a/apps/cs/src/pages/module/ui/create-page.tsx b/apps/cs/src/pages/module/ui/create-page.tsx new file mode 100644 index 000000000..50a78fc4c --- /dev/null +++ b/apps/cs/src/pages/module/ui/create-page.tsx @@ -0,0 +1,45 @@ +"use client"; + +import { useRouter } from "next/navigation"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useMutation } from "@tanstack/react-query"; +import { useAlertStore } from "@/shared/lib/use-alert-store"; +import { + authorizationFormSchema, + type AuthorizationFormData, +} from "../model/authorizations-interface"; +import { AuthorizationsApi } from "../api/authorization-service"; +import { ModuleForm } from "./module-form"; + +function CreatePage() { + const router = useRouter(); + const { setMessage: alert } = useAlertStore((state) => state); + + const { mutateAsync: createAuthorization } = useMutation({ + mutationFn: (data: AuthorizationFormData) => + AuthorizationsApi.createAuthorization(data), + onSuccess: () => { + alert("등록되었습니다.", router.back); + }, + }); + + const form = useForm({ + resolver: zodResolver(authorizationFormSchema), + defaultValues: { + sortSeq: 0, + useYn: "Y", + }, + }); + + return ( +
+
+

모듈API 등록

+
+ +
+ ); +} + +export { CreatePage }; diff --git a/apps/cs/src/pages/module/ui/module-form.tsx b/apps/cs/src/pages/module/ui/module-form.tsx new file mode 100644 index 000000000..4c0fdafbc --- /dev/null +++ b/apps/cs/src/pages/module/ui/module-form.tsx @@ -0,0 +1,166 @@ +"use client"; + +import type { UseFormReturn } from "react-hook-form"; +import { + Input, + Label, + RadioGroup, + RadioGroupItem, + Table, + TableBody, + TableCell, + TableHead, + TableRow, +} from "@common/components"; +import { FormWrapper } from "@/widgets/form-wrapper"; +import { CodeSelect } from "@/entities/code"; +import { FormControl, FormField, FormItem } from "@/shared/ui/form"; +import type { + AuthorizationFormData, + WithRoleAuthorizations, +} from "../model/authorizations-interface"; + +type BannerFormProps = { + form: UseFormReturn; + authorizationNo?: number; + handleSave: (data: AuthorizationFormData) => Promise; + handleDelete?: () => Promise; +}; + +function ModuleForm({ form, authorizationNo, ...props }: BannerFormProps) { + return ( + +
+ + + + + + + + API명 + + ( + + + + + + )} + /> + + + + API URL + + ( + + + + + + )} + /> + + + + 요청 메소드 + + ( + + + + + + )} + /> + + + + 정렬순서 + + ( + + + { + const value = e.target.value; + if (isNaN(Number(value))) return; + field.onChange(Number(value)); + }} + className="w-[12rem] !text-[1.3rem]" + placeholder="정렬순서 입력" + /> + + + )} + /> + + + + 사용여부 + + ( + + + +
+ + +
+
+ + +
+
+
+
+ )} + /> +
+
+
+
+
+
+ ); +} + +export { ModuleForm }; diff --git a/apps/cs/src/pages/module/ui/module-page.tsx b/apps/cs/src/pages/module/ui/module-page.tsx index ded1f160f..6f0ebee43 100644 --- a/apps/cs/src/pages/module/ui/module-page.tsx +++ b/apps/cs/src/pages/module/ui/module-page.tsx @@ -9,14 +9,14 @@ import { type PaginationState, } from "@tanstack/react-table"; import { Button, DataTable, Input, Label } from "@common/components"; +import { CodeSelect } from "@/entities/code"; import { ENDPOINT } from "@/shared/config"; -import { AuthorizationsApi } from "../api/authorization-service"; import type { Authorizations, AuthorizationsParams, } from "../model/authorizations-interface"; import { columns } from "../model/table-columns"; -import { CodeSelect } from "@/entities/code"; +import { AuthorizationsApi } from "../api/authorization-service"; function ModulePage() { const router = useRouter(); @@ -89,7 +89,7 @@ function ModulePage() {
-

콘텐츠 목록

- +

모듈API 목록

+
diff --git a/apps/cs/src/pages/site/ui/site-form.tsx b/apps/cs/src/pages/site/ui/site-form.tsx index f624a81b7..c76f23ae5 100644 --- a/apps/cs/src/pages/site/ui/site-form.tsx +++ b/apps/cs/src/pages/site/ui/site-form.tsx @@ -110,8 +110,8 @@ function SiteForm({ form, siteId, ...props }: SiteFormProps) { diff --git a/apps/cs/src/widgets/form-wrapper/ui/form-wrapper.tsx b/apps/cs/src/widgets/form-wrapper/ui/form-wrapper.tsx index 19f941106..5b6edb3bc 100644 --- a/apps/cs/src/widgets/form-wrapper/ui/form-wrapper.tsx +++ b/apps/cs/src/widgets/form-wrapper/ui/form-wrapper.tsx @@ -8,8 +8,8 @@ type FormWrapperProps = { form: UseFormReturn; children: React.ReactNode; isModifyMode?: boolean; - handleSave: (data: T) => Promise; - handleDelete?: () => Promise; + handleSave: (data: T) => Promise; + handleDelete?: () => Promise; }; function FormWrapper({