diff options
| author | joonhoekim <26rote@gmail.com> | 2025-09-22 19:33:16 +0900 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-09-22 19:33:16 +0900 |
| commit | 480ac58010604140d1a52fa2b839aedb6ac15941 (patch) | |
| tree | 4cc45c96ea174991d59c1a058ed9da05a2a3ac8c /app/api | |
| parent | ba35e67845f935c8ce0151c9ef1fefa0b0510faf (diff) | |
(김준회) POS I/F 로직 및 UI 처리 구현
Diffstat (limited to 'app/api')
| -rw-r--r-- | app/api/pos/download/route.ts | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/app/api/pos/download/route.ts b/app/api/pos/download/route.ts new file mode 100644 index 00000000..5328dc9d --- /dev/null +++ b/app/api/pos/download/route.ts @@ -0,0 +1,47 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { downloadPosFile } from '@/lib/pos/download-pos-file'; + +export async function GET(request: NextRequest) { + try { + const searchParams = request.nextUrl.searchParams; + const relativePath = searchParams.get('path'); + + if (!relativePath) { + return NextResponse.json( + { error: '파일 경로가 제공되지 않았습니다.' }, + { status: 400 } + ); + } + + const result = await downloadPosFile({ relativePath }); + + if (!result.success) { + return NextResponse.json( + { error: result.error }, + { status: 404 } + ); + } + + if (!result.fileBuffer || !result.fileName) { + return NextResponse.json( + { error: '파일을 읽을 수 없습니다.' }, + { status: 500 } + ); + } + + // 파일 다운로드 응답 생성 + const response = new NextResponse(result.fileBuffer); + + response.headers.set('Content-Type', result.mimeType || 'application/octet-stream'); + response.headers.set('Content-Disposition', `attachment; filename="${encodeURIComponent(result.fileName)}"`); + response.headers.set('Content-Length', result.fileBuffer.length.toString()); + + return response; + } catch (error) { + console.error('POS 파일 다운로드 API 오류:', error); + return NextResponse.json( + { error: '서버 내부 오류가 발생했습니다.' }, + { status: 500 } + ); + } +} |
