diff options
Diffstat (limited to 'app/api/project-gtc/route.ts')
| -rw-r--r-- | app/api/project-gtc/route.ts | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/app/api/project-gtc/route.ts b/app/api/project-gtc/route.ts new file mode 100644 index 00000000..8fe4ad2e --- /dev/null +++ b/app/api/project-gtc/route.ts @@ -0,0 +1,154 @@ +import { NextRequest, NextResponse } from "next/server" +import { uploadProjectGtcFile, deleteProjectGtcFile, getProjectGtcList, getProjectGtcFile } from "@/lib/project-gtc/service" +import { promises as fs } from "fs" +import path from "path" + +// 파일 다운로드 +export async function GET(request: NextRequest) { + try { + const { searchParams } = new URL(request.url) + const projectId = searchParams.get("projectId") + const action = searchParams.get("action") + + // 목록 조회 + if (action !== "download") { + const page = parseInt(searchParams.get("page") || "1") + const perPage = parseInt(searchParams.get("perPage") || "10") + const search = searchParams.get("search") || "" + const sortParam = searchParams.get("sort") + + let sort: Array<{ id: string; desc: boolean }> = [] + if (sortParam) { + try { + sort = JSON.parse(sortParam) + } catch { + sort = [{ id: "projectCreatedAt", desc: true }] + } + } else { + sort = [{ id: "projectCreatedAt", desc: true }] + } + + const result = await getProjectGtcList({ + page, + perPage, + search, + sort, + }) + + return NextResponse.json(result) + } + + // 파일 다운로드 + if (!projectId) { + return NextResponse.json( + { error: "프로젝트 ID가 필요합니다." }, + { status: 400 } + ) + } + + const fileInfo = await getProjectGtcFile(parseInt(projectId)) + + if (!fileInfo) { + return NextResponse.json( + { error: "파일을 찾을 수 없습니다." }, + { status: 404 } + ) + } + + // 파일 경로 구성 + const filePath = path.join(process.cwd(), "public", fileInfo.filePath) + + try { + // 파일 읽기 + const fileBuffer = await fs.readFile(filePath) + + // 응답 헤더 설정 + const headers = new Headers() + headers.set('Content-Type', fileInfo.mimeType || 'application/octet-stream') + headers.set('Content-Disposition', `attachment; filename="${encodeURIComponent(fileInfo.originalFileName)}"`) + headers.set('Content-Length', fileInfo.fileSize?.toString() || '0') + + return new NextResponse(new Uint8Array(fileBuffer), { + status: 200, + headers, + }) + } catch (fileError) { + console.error("파일 읽기 오류:", fileError) + return NextResponse.json( + { error: "파일을 읽을 수 없습니다." }, + { status: 500 } + ) + } + } catch (error) { + console.error("Project GTC API 에러:", error) + return NextResponse.json( + { error: "요청 처리 중 오류가 발생했습니다." }, + { status: 500 } + ) + } +} + +// 파일 업로드 +export async function POST(request: NextRequest) { + try { + const formData = await request.formData() + const projectId = formData.get("projectId") as string + const file = formData.get("file") as File + + if (!projectId || !file) { + return NextResponse.json( + { error: "프로젝트 ID와 파일이 필요합니다." }, + { status: 400 } + ) + } + + const result = await uploadProjectGtcFile(parseInt(projectId), file) + + if (result.success) { + return NextResponse.json({ success: true, data: result.data }) + } else { + return NextResponse.json( + { error: result.error }, + { status: 400 } + ) + } + } catch (error) { + console.error("Project GTC 파일 업로드 API 에러:", error) + return NextResponse.json( + { error: "파일 업로드 중 오류가 발생했습니다." }, + { status: 500 } + ) + } +} + +// 파일 삭제 +export async function DELETE(request: NextRequest) { + try { + const { searchParams } = new URL(request.url) + const projectId = searchParams.get("projectId") + + if (!projectId) { + return NextResponse.json( + { error: "프로젝트 ID가 필요합니다." }, + { status: 400 } + ) + } + + const result = await deleteProjectGtcFile(parseInt(projectId)) + + if (result.success) { + return NextResponse.json({ success: true }) + } else { + return NextResponse.json( + { error: result.error }, + { status: 400 } + ) + } + } catch (error) { + console.error("Project GTC 파일 삭제 API 에러:", error) + return NextResponse.json( + { error: "파일 삭제 중 오류가 발생했습니다." }, + { status: 500 } + ) + } +}
\ No newline at end of file |
