From d19ef7efc7a150459647d31506a5a38a15ddd9a9 Mon Sep 17 00:00:00 2001 From: keyy1315 Date: Thu, 26 Jun 2025 17:32:25 +0900 Subject: [PATCH 1/2] feat: implement method handler for survey sales API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 보안정책으로 인해 delete, patch, put 메소드 post 메소드로 래핑하여 처리 --- src/app/api/survey-sales/[id]/route.ts | 37 ++++++++++++++++++-------- src/hooks/useSurvey.ts | 10 ++++--- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/app/api/survey-sales/[id]/route.ts b/src/app/api/survey-sales/[id]/route.ts index 9b33d86..5fcb8eb 100644 --- a/src/app/api/survey-sales/[id]/route.ts +++ b/src/app/api/survey-sales/[id]/route.ts @@ -59,6 +59,28 @@ async function getSurveySaleDetail(request: NextRequest): Promise return NextResponse.json(result) } +/** + * @param {NextRequest} request - body에 method 키 필요 { method: 'PUT' | 'DELETE' | 'PATCH' } + * @description PUT, DELETE, PATCH 요청 처리 함수 + * + * @returns {NextResponse} + */ +async function methodHandler(request: NextRequest): Promise { + const id = request.nextUrl.pathname.split('/').pop() ?? '' + const body = await request.json() + + switch (body.method) { + case 'PUT': + return updateSurveySaleDetail(id, body) + case 'DELETE': + return deleteSurveySaleDetail(id) + case 'PATCH': + return submitSurveySaleDetail(id, body) + default: + return NextResponse.json({ error: 'Invalid method' }, { status: HttpStatusCode.BadRequest }) + } +} + /** * @api {PUT} /api/survey-sales/:id 조사 매물 수정 API * @apiName PUT /api/survey-sales/:id @@ -92,9 +114,7 @@ async function getSurveySaleDetail(request: NextRequest): Promise * ... * } * */ -async function updateSurveySaleDetail(request: NextRequest): Promise { - const id = request.nextUrl.pathname.split('/').pop() ?? '' - const body = await request.json() +async function updateSurveySaleDetail(id: string, body: any): Promise { const service = new SurveySalesService({}) const result = await service.tryFunction(() => service.updateSurvey(Number(id), body.survey, body.isTemporary, body.storeId, body.role)) @@ -122,8 +142,7 @@ async function updateSurveySaleDetail(request: NextRequest): Promise { - const id = request.nextUrl.pathname.split('/').pop() ?? '' +async function deleteSurveySaleDetail(id: string): Promise { const service = new SurveySalesService({}) const result = await service.tryFunction(() => service.deleteSurvey(Number(id))) if (result instanceof ApiError) { @@ -167,9 +186,7 @@ async function deleteSurveySaleDetail(request: NextRequest): Promise { - const id = request.nextUrl.pathname.split('/').pop() ?? '' - const body = await request.json() +async function submitSurveySaleDetail(id: string, body: any): Promise { const service = new SurveySalesService({}) const result = await service.tryFunction(() => service.submitSurvey(Number(id), body.targetId, body.targetNm)) @@ -180,6 +197,4 @@ async function submitSurveySaleDetail(request: NextRequest): Promise { if (id === undefined) throw new Error() - const resp = await axiosInstance(null).put(`/api/survey-sales/${id}`, { + const resp = await axiosInstance(null).post(`/api/survey-sales/${id}`, { + method: 'PUT', survey: survey, isTemporary: isTemporary, storeId: storeId, @@ -306,7 +307,9 @@ export function useSurvey( const { mutateAsync: deleteSurvey, isPending: isDeletingSurvey } = useMutation({ mutationFn: async () => { if (id === null) throw new Error() - const resp = await axiosInstance(null).delete(`/api/survey-sales/${id}`) + const resp = await axiosInstance(null).post(`/api/survey-sales/${id}`, { + method: 'DELETE', + }) return resp.data }, onSuccess: () => { @@ -329,7 +332,8 @@ export function useSurvey( const { mutateAsync: submitSurvey, isPending: isSubmittingSurvey } = useMutation({ mutationFn: async ({ targetId, targetNm }: { targetId?: string | null; targetNm?: string | null }) => { if (!id) throw new Error() - const resp = await axiosInstance(null).patch(`/api/survey-sales/${id}`, { + const resp = await axiosInstance(null).post(`/api/survey-sales/${id}`, { + method: 'PATCH', targetId, targetNm, }) From a36cda98431d9cbecd84cd825ddf40e1401374d5 Mon Sep 17 00:00:00 2001 From: keyy1315 Date: Thu, 26 Jun 2025 17:34:34 +0900 Subject: [PATCH 2/2] docs: add annotaion for methodHandler api --- src/app/api/survey-sales/[id]/route.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/app/api/survey-sales/[id]/route.ts b/src/app/api/survey-sales/[id]/route.ts index 5fcb8eb..73852d3 100644 --- a/src/app/api/survey-sales/[id]/route.ts +++ b/src/app/api/survey-sales/[id]/route.ts @@ -60,10 +60,16 @@ async function getSurveySaleDetail(request: NextRequest): Promise } /** - * @param {NextRequest} request - body에 method 키 필요 { method: 'PUT' | 'DELETE' | 'PATCH' } - * @description PUT, DELETE, PATCH 요청 처리 함수 + * @api {POST} /api/survey-sales/:id 조사 매물 수정, 삭제, 제출 API + * @apiName POST /api/survey-sales/:id + * @apiGroup SurveySales + * @apiDescription 조사 매물 수정, 삭제, 제출 API * - * @returns {NextResponse} + * @apiParam {String} method 요청 메서드 (PUT, DELETE, PATCH) (required) + * @apiParam {Object} body 요청 본문 (required) + * + * @apiSuccess {NextResponse} 요청 처리 결과 + * @apiError {Number} 400 잘못된 요청 */ async function methodHandler(request: NextRequest): Promise { const id = request.nextUrl.pathname.split('/').pop() ?? ''