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 } ) } }