summaryrefslogtreecommitdiff
path: root/app/api/project-gtc
diff options
context:
space:
mode:
Diffstat (limited to 'app/api/project-gtc')
-rw-r--r--app/api/project-gtc/route.ts154
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