feat: modify inquiry save requestParameter to formdata add files

This commit is contained in:
Dayoung 2025-05-14 11:06:24 +09:00
parent 59b1f3198c
commit b4dfc2211f
8 changed files with 58 additions and 18 deletions

View File

@ -13,6 +13,7 @@ export async function GET(request: Request) {
try { try {
const response = await axios.get(`${process.env.NEXT_PUBLIC_INQUIRY_API_URL}/api/qna/detail?${queryStringFormatter(params)}`) const response = await axios.get(`${process.env.NEXT_PUBLIC_INQUIRY_API_URL}/api/qna/detail?${queryStringFormatter(params)}`)
console.log('response.data detail:: ', response.data)
if (response.status === 200) { if (response.status === 200) {
return NextResponse.json(response.data) return NextResponse.json(response.data)
} }

View File

@ -0,0 +1,15 @@
import axios from 'axios'
import { NextResponse } from 'next/server'
export async function GET(request: Request) {
const { searchParams } = new URL(request.url)
const encodeFileNo = searchParams.get('encodeFileNo')
if (!encodeFileNo) {
return NextResponse.json({ error: 'fileNo is required' }, { status: 400 })
}
const response = await axios.get(`${process.env.NEXT_PUBLIC_INQUIRY_API_URL}/api/file/downloadFile?encodeFileNo=${encodeFileNo}`)
console.log('response.data:: ', response.data)
return NextResponse.json(response.data)
}

View File

@ -17,7 +17,7 @@ export async function GET(request: Request) {
try { try {
const response = await axios.get(`${process.env.NEXT_PUBLIC_INQUIRY_API_URL}/api/qna/list?${queryStringFormatter(params)}`) const response = await axios.get(`${process.env.NEXT_PUBLIC_INQUIRY_API_URL}/api/qna/list?${queryStringFormatter(params)}`)
console.log('response.data:: ', response.data)
if (response.status === 200) { if (response.status === 200) {
return NextResponse.json(response.data) return NextResponse.json(response.data)
} }

View File

@ -2,13 +2,21 @@ import axios from 'axios'
import { NextResponse } from 'next/server' import { NextResponse } from 'next/server'
export async function POST(request: Request) { export async function POST(request: Request) {
const body = await request.json() const formData = await request.formData()
console.log('formData:: ', formData)
// const body = await request.json()
// console.log('body:: ', body)
const response = await axios.post(`${process.env.NEXT_PUBLIC_INQUIRY_API_URL}/api/qna/save`, body) try {
const response = await axios.post(`${process.env.NEXT_PUBLIC_INQUIRY_API_URL}/api/qna/save`, formData)
console.log('response.data:: ', response.data)
if (response.status === 200) { if (response.status === 200) {
return NextResponse.json(response.data) return NextResponse.json(response.data)
}
return NextResponse.json({ error: response.data }, { status: response.status })
} catch (error) {
console.error('error:: ', error)
return NextResponse.json({ error: 'Failed to save qna' }, { status: 500 })
} }
return NextResponse.json({ error: 'Failed to save qna' }, { status: response.status })
} }

View File

@ -1,8 +1,9 @@
'use client' 'use client'
import { useInquiry } from '@/hooks/useInquiry'
import { Inquiry } from '@/types/Inquiry' import { Inquiry } from '@/types/Inquiry'
export default function Answer({ inquiryDetail }: { inquiryDetail: Inquiry}) { export default function Answer({ inquiryDetail, downloadFile }: { inquiryDetail: Inquiry; downloadFile: (encodeFileNo: number) => Promise<File> }) {
return ( return (
<> <>
<div className="inquiry-answer-wrap"> <div className="inquiry-answer-wrap">
@ -21,7 +22,7 @@ export default function Answer({ inquiryDetail }: { inquiryDetail: Inquiry}) {
<ul className="file-list"> <ul className="file-list">
{inquiryDetail?.ansListFile?.map((file) => ( {inquiryDetail?.ansListFile?.map((file) => (
<li className="file-item" key={file.fileNo}> <li className="file-item" key={file.fileNo}>
<button className="file-item-bx"> <button className="file-item-bx" onClick={() => downloadFile(Number(file.encodeFileNo))}>
<div className="file-item-name">{file.srcFileNm} </div> <div className="file-item-name">{file.srcFileNm} </div>
</button> </button>
</li> </li>

View File

@ -12,7 +12,7 @@ export default function Detail() {
const params = useParams() const params = useParams()
const id = params.id const id = params.id
const { inquiryDetail } = useInquiry(Number(id), '5200') const { inquiryDetail, downloadFile } = useInquiry(Number(id), '5200')
const router = useRouter() const router = useRouter()
return ( return (
@ -66,7 +66,7 @@ export default function Detail() {
<ul className="file-list"> <ul className="file-list">
{inquiryDetail?.listFile?.map((file) => ( {inquiryDetail?.listFile?.map((file) => (
<li className="file-item"> <li className="file-item">
<button className="file-item-bx"> <button className="file-item-bx" onClick={() => downloadFile(Number(file.encodeFileNo))}>
<div className="file-item-name">{file.srcFileNm} </div> <div className="file-item-name">{file.srcFileNm} </div>
</button> </button>
</li> </li>
@ -75,7 +75,7 @@ export default function Detail() {
</div> </div>
</div> </div>
{inquiryDetail?.answerYn === 'Y' && inquiryDetail && <Answer inquiryDetail={inquiryDetail} />} {inquiryDetail?.answerYn === 'Y' && inquiryDetail && <Answer inquiryDetail={inquiryDetail} downloadFile={downloadFile} />}
<div className="sale-edit-btn"> <div className="sale-edit-btn">
<button className="btn-frame n-blue icon" onClick={() => router.push('/inquiry/list')}> <button className="btn-frame n-blue icon" onClick={() => router.push('/inquiry/list')}>

View File

@ -11,7 +11,7 @@ export default function RegistForm() {
const { session } = useSessionStore() const { session } = useSessionStore()
const router = useRouter() const router = useRouter()
/// TODO: 세션 정보 적용 // TODO: 세션 정보 적용 | 현재는 test용 정보 적용
// useEffect(() => { // useEffect(() => {
// setInquiryRequest({ ...inquiryRequest, regId: session?.userId ?? '', regUserNm: session?.userNm ?? '' }) // setInquiryRequest({ ...inquiryRequest, regId: session?.userId ?? '', regUserNm: session?.userNm ?? '' })
// }, [session]) // }, [session])
@ -24,7 +24,7 @@ export default function RegistForm() {
qnaClsSmlCd: null, qnaClsSmlCd: null,
title: '', title: '',
contents: null, contents: null,
regId: '', regId: 'X112',
regUserNm: 'TEST', regUserNm: 'TEST',
regUserTelNo: null, regUserTelNo: null,
storeId: null, storeId: null,
@ -46,7 +46,7 @@ export default function RegistForm() {
const handleSubmit = async () => { const handleSubmit = async () => {
if (confirm('お問い合わせを登録しますか? Hanwha Japanの担当者にお問い合わせメールが送信されます。')) { if (confirm('お問い合わせを登録しますか? Hanwha Japanの担当者にお問い合わせメールが送信されます。')) {
const res = await saveInquiry(inquiryRequest) const res = await saveInquiry({ inquiryRequest, files: attachedFiles })
alert('保存されました。') alert('保存されました。')
router.push(`/inquiry/${res.qnaNo}`) router.push(`/inquiry/${res.qnaNo}`)
} }

View File

@ -12,7 +12,8 @@ export function useInquiry(
inquiryDetail: Inquiry | null inquiryDetail: Inquiry | null
isLoadingInquiryDetail: boolean isLoadingInquiryDetail: boolean
isSavingInquiry: boolean isSavingInquiry: boolean
saveInquiry: (inquiryRequest: InquiryRequest) => Promise<InquirySaveResponse> saveInquiry: (params: { inquiryRequest: InquiryRequest; files: File[] }) => Promise<InquirySaveResponse>
downloadFile: (encodeFileNo: number) => Promise<File>
} { } {
const { session } = useSessionStore() const { session } = useSessionStore()
const queryClient = useQueryClient() const queryClient = useQueryClient()
@ -50,8 +51,16 @@ export function useInquiry(
}) })
const { mutateAsync: saveInquiry, isPending: isSavingInquiry } = useMutation({ const { mutateAsync: saveInquiry, isPending: isSavingInquiry } = useMutation({
mutationFn: async (inquiryRequest: InquiryRequest) => { mutationFn: async ({ inquiryRequest, files }: { inquiryRequest: InquiryRequest; files: File[] }) => {
const resp = await axiosInstance(null).post<{ data: InquirySaveResponse }>('/api/qna/save', inquiryRequest) const formData = new FormData()
Object.entries(inquiryRequest).forEach(([key, value]) => {
formData.append(key, value ?? '')
})
files.forEach((file) => {
formData.append('files', file)
})
const resp = await axiosInstance(null).post<{ data: InquirySaveResponse }>('/api/qna/save', formData)
return resp.data.data return resp.data.data
}, },
onSuccess: () => { onSuccess: () => {
@ -59,6 +68,11 @@ export function useInquiry(
}, },
}) })
const downloadFile = async (encodeFileNo: number) => {
const resp = await axiosInstance(null).get<File>(`/api/qna/file`, { params: { encodeFileNo } })
return resp.data
}
return { return {
inquiryList: inquiryList ?? [], inquiryList: inquiryList ?? [],
inquiryDetail: inquiryDetail ?? null, inquiryDetail: inquiryDetail ?? null,
@ -66,5 +80,6 @@ export function useInquiry(
isLoadingInquiryDetail, isLoadingInquiryDetail,
isSavingInquiry, isSavingInquiry,
saveInquiry, saveInquiry,
downloadFile,
} }
} }