From f12c0d5ee2e99f6fcee9c332f2c87a0c570a655b Mon Sep 17 00:00:00 2001 From: swcho Date: Wed, 11 Jun 2025 17:40:43 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20I/I=20=EB=B6=84=EC=84=9D=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EC=8B=9C=20=EC=B2=A8=EB=B6=80=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC(.inp)=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/api/attachment/attachment-service.tsx | 1 + .../components/lib/utils/fileDeleteUtil.tsx | 109 ++++++++++++++++++ apps/sn/app/ii/rdii_result/page.tsx | 7 ++ apps/sn/app/ii/result/page.tsx | 7 ++ 4 files changed, 124 insertions(+) create mode 100644 apps/sn/app/components/lib/utils/fileDeleteUtil.tsx diff --git a/apps/sn/app/components/lib/api/attachment/attachment-service.tsx b/apps/sn/app/components/lib/api/attachment/attachment-service.tsx index 36390c0fb..ee3fb6cd9 100644 --- a/apps/sn/app/components/lib/api/attachment/attachment-service.tsx +++ b/apps/sn/app/components/lib/api/attachment/attachment-service.tsx @@ -16,6 +16,7 @@ export const ENDPOINT = { ATTACHMENTS: "/attach-service/api/v1/atfl/attachments", DOWNLOAD: "/attach-service/api/v1/atflcd/download", STREAM_VIDEO: "/attach-service/api/v1/stream/video", + DELETE_FILE_BY_ATFLCD: "/attach-service/api/v1/atfl/attachments/atflCd", }, }; diff --git a/apps/sn/app/components/lib/utils/fileDeleteUtil.tsx b/apps/sn/app/components/lib/utils/fileDeleteUtil.tsx new file mode 100644 index 000000000..bf8a70130 --- /dev/null +++ b/apps/sn/app/components/lib/utils/fileDeleteUtil.tsx @@ -0,0 +1,109 @@ +import { getCookie } from "@utils"; +import { ENDPOINT } from "../api/attachment/attachment-service"; + +const AUTH_USER_ID = process.env.NEXT_PUBLIC_AUTH_USER_ID || "token-id"; +const CLAIM_NAME = process.env.NEXT_PUBLIC_CLAIM_NAME || "Authorization"; + +type DeleteOptions = { + handleDeleteStart?: () => void; + handleDeleteSuccess?: (response: Response) => void; + handleDeleteError?: (error: Error) => void; +}; + +export const handleDelete = async ( + atflCd: string, + options?: DeleteOptions +): Promise => { + if (!atflCd) { + const error = new Error("첨부파일 코드가 필요합니다."); + options?.handleDeleteError?.(error); + throw error; + } + + try { + options?.handleDeleteStart?.(); + + const response = await fetch( + `${ENDPOINT.ATTACH_SERVICE.DELETE_FILE_BY_ATFLCD}/${atflCd}`, + { + method: "DELETE", + headers: { + "Content-Type": "application/json", + [CLAIM_NAME]: getCookie(CLAIM_NAME) ?? "", + [AUTH_USER_ID]: getCookie(AUTH_USER_ID) ?? "", + }, + } + ); + + if (!response.ok) { + throw new Error(`파일 삭제 실패: ${response.status} ${response.statusText}`); + } + + options?.handleDeleteSuccess?.(response); + console.log("파일 삭제 완료:", atflCd); + + } catch (error) { + const deleteError = error instanceof Error + ? error + : new Error("파일 삭제 중 알 수 없는 오류가 발생했습니다."); + + console.error("파일 삭제 오류:", deleteError); + options?.handleDeleteError?.(deleteError); + throw deleteError; + } +}; + +// 여러 파일을 삭제하는 함수 +// export const handleMultipleDelete = async ( +// atflCds: string[], +// options?: DeleteOptions & { +// handleProgress?: (completed: number, total: number) => void; +// } +// ): Promise => { +// if (!atflCds || atflCds.length === 0) { +// const error = new Error("삭제할 파일이 없습니다."); +// options?.handleDeleteError?.(error); +// throw error; +// } + +// try { +// options?.handleDeleteStart?.(); + +// const deletePromises = atflCds.map(async (atflCd, index) => { +// try { +// await handleDelete(atflCd); +// options?.handleProgress?.(index + 1, atflCds.length); +// return { success: true, atflCd }; +// } catch (error) { +// return { success: false, atflCd, error }; +// } +// }); + +// const results = await Promise.allSettled(deletePromises); +// const failedDeletes = results +// .filter((result): result is PromiseFulfilledResult<{ success: false; atflCd: string; error: any }> => +// result.status === 'fulfilled' && !result.value.success +// ) +// .map(result => result.value); + +// if (failedDeletes.length > 0) { +// const error = new Error( +// `일부 파일 삭제 실패: ${failedDeletes.map(f => f.atflCd).join(', ')}` +// ); +// options?.handleDeleteError?.(error); +// throw error; +// } + +// options?.handleDeleteSuccess?.(new Response()); +// console.log("모든 파일 삭제 완료:", atflCds); + +// } catch (error) { +// const deleteError = error instanceof Error +// ? error +// : new Error("파일 삭제 중 알 수 없는 오류가 발생했습니다."); + +// console.error("파일 삭제 오류:", deleteError); +// options?.handleDeleteError?.(deleteError); +// throw deleteError; +// } +// }; \ No newline at end of file diff --git a/apps/sn/app/ii/rdii_result/page.tsx b/apps/sn/app/ii/rdii_result/page.tsx index 8c799dc31..130c25419 100644 --- a/apps/sn/app/ii/rdii_result/page.tsx +++ b/apps/sn/app/ii/rdii_result/page.tsx @@ -6,6 +6,7 @@ import { useState } from 'react' import { useForm } from 'react-hook-form' import { z } from 'zod' import BaseLayout from '../BaseLayout' +import { handleDelete } from '@/components/lib/utils/fileDeleteUtil' const formSchema = z.object({ @@ -171,6 +172,12 @@ const Result = () => { // 삭제 API 호출 const response1 = await deleteData(`v1/rdiiAnlsRslt/${selectedRowData.rainInfwtAnlsSn}`); const response2 = await deleteData(`v1/rdiiAnls/${selectedRowData.rainInfwtAnlsSn}`); + // 첨부파일(inp파일) 삭제 API 호출 + handleDelete(selectedRowData.atflCd, { + handleDeleteStart: () => console.log("파일 삭제 시작"), + handleDeleteSuccess: (response) => console.log("파일 삭제 성공:", response), + handleDeleteError: (error) => console.error("파일 삭제 실패:", error), + }); console.log("File delete response1:", response1); console.log("File delete response2:", response2); diff --git a/apps/sn/app/ii/result/page.tsx b/apps/sn/app/ii/result/page.tsx index e41915593..e2015c8d9 100644 --- a/apps/sn/app/ii/result/page.tsx +++ b/apps/sn/app/ii/result/page.tsx @@ -6,6 +6,7 @@ import { useState } from 'react' import { useForm } from 'react-hook-form' import { z } from 'zod' import BaseLayout from '../BaseLayout' +import { handleDelete } from '@/components/lib/utils/fileDeleteUtil' const formSchema = z.object({ @@ -171,6 +172,12 @@ const Result = () => { // 삭제 API 호출 const response1 = await deleteData(`v1/inftwtAnlsRslt/${selectedRowData.inftwtAnlsSn}`); const response2 = await deleteData(`v1/inftwtAnls/${selectedRowData.inftwtAnlsSn}`); + // 첨부파일(inp파일) 삭제 API 호출 + handleDelete(selectedRowData.atflCd, { + handleDeleteStart: () => console.log("파일 삭제 시작"), + handleDeleteSuccess: (response) => console.log("파일 삭제 성공:", response), + handleDeleteError: (error) => console.error("파일 삭제 실패:", error), + }); console.log("File delete response1:", response1); console.log("File delete response2:", response2);