From 25cbd92a55dbf02b17c23cebfcddae82ecc65b08 Mon Sep 17 00:00:00 2001 From: Daseul Kim Date: Tue, 10 Jun 2025 15:42:38 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=A7=80=EB=B6=95=EC=9E=AC=EC=A0=81?= =?UTF-8?q?=ED=95=A9=EC=84=B1=20detail=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EB=B0=A9=EC=96=B4?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/api/suitable/route.ts | 13 ++++++++----- src/components/popup/SuitableDetailPopup.tsx | 2 +- src/components/suitable/SuitableList.tsx | 2 +- src/hooks/useSuitable.ts | 3 ++- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/app/api/suitable/route.ts b/src/app/api/suitable/route.ts index 888e663..c9ca8c4 100644 --- a/src/app/api/suitable/route.ts +++ b/src/app/api/suitable/route.ts @@ -12,7 +12,7 @@ import { Suitable } from '@/types/Suitable' * * @apiBody {FormData} form-data * @apiBody {String} form-data.ids 메인 ID 목록 (쉼표로 구분된 문자열) - * @apiBody {String} form-data.detailIds 상세 ID 목록 (쉼표로 구분된 문자열) + * @apiBody {String} [form-data.detailIds] 상세 ID 목록 (쉼표로 구분된 문자열) * * @apiExample {curl} Example usage: * curl -X POST \ @@ -44,10 +44,10 @@ export async function POST(request: NextRequest) { try { const body: Record = await request.json() const ids = body.ids - const detailIds = body.detailIds + const detailIds = body.detailIds || '' /* 파라미터 체크 */ - if (ids === '' || detailIds === '') { + if (ids === '') { return NextResponse.json({ error: '필수 파라미터가 누락되었습니다' }, { status: 400 }) } @@ -71,7 +71,7 @@ export async function POST(request: NextRequest) { , msd_json.memo FROM ms_suitable_detail msd_json WHERE msd.main_id = msd_json.main_id - AND msd_json.id IN (:detailIds) + --detailIds AND msd_json.id IN (:detailIds) FOR JSON PATH ) AS detail FROM ms_suitable_detail msd @@ -86,7 +86,10 @@ export async function POST(request: NextRequest) { /* 검색 조건 설정 */ query = query.replaceAll(':mainIds', ids) - query = query.replaceAll(':detailIds', detailIds) + if (detailIds) { + query = query.replace('--detailIds ', '') + query = query.replace(':detailIds', detailIds) + } const suitable: Suitable[] = await prisma.$queryRawUnsafe(query) diff --git a/src/components/popup/SuitableDetailPopup.tsx b/src/components/popup/SuitableDetailPopup.tsx index 461ac1b..6c41daf 100644 --- a/src/components/popup/SuitableDetailPopup.tsx +++ b/src/components/popup/SuitableDetailPopup.tsx @@ -68,7 +68,7 @@ export default function SuitableDetailPopup() {
{toCodeName(SUITABLE_HEAD_CODE.ROOF_SH_CD, item.roofShCd)}
- {toSuitableDetail(item.detail).map((subItem: SuitableDetail) => ( + {toSuitableDetail(item.detail)?.map((subItem: SuitableDetail) => (
{toCodeName(SUITABLE_HEAD_CODE.TRESTLE_MFPC_CD, subItem.trestleMfpcCd)}
diff --git a/src/components/suitable/SuitableList.tsx b/src/components/suitable/SuitableList.tsx index a0dc5be..3e87f54 100644 --- a/src/components/suitable/SuitableList.tsx +++ b/src/components/suitable/SuitableList.tsx @@ -83,7 +83,7 @@ export default function SuitableList() {
    - {toSuitableDetail(item.detail).map((subItem: SuitableDetail) => ( + {toSuitableDetail(item.detail)?.map((subItem: SuitableDetail) => (
  • diff --git a/src/hooks/useSuitable.ts b/src/hooks/useSuitable.ts index 8ee7ca7..4acb024 100644 --- a/src/hooks/useSuitable.ts +++ b/src/hooks/useSuitable.ts @@ -84,7 +84,7 @@ export function useSuitable() { const getSuitableDetails = async (ids: string, detailIds?: string): Promise => { try { const params: Record = { ids: ids } - if (detailIds) params.detailIds = detailIds + if (detailIds?.trim()) params.detailIds = detailIds const response = await axiosInstance(null).post('/api/suitable', params) return response.data } catch (error) { @@ -150,6 +150,7 @@ export function useSuitable() { */ const toSuitableDetailIds = (suitableDetailString: string): Set => { try { + if (!suitableDetailString) return new Set() return new Set(JSON.parse(suitableDetailString).map(({ id }: { id: number }) => id)) } catch (error) { console.error(`지붕재 적합성 detail 데이터 파싱 실패: ${error}`)