feat: 회의록 자동 작성 웹 서비스 구현

- 오디오 파일 업로드 + 유효성 검사
- 실시간 음성 인식 (Web Speech API)
- 회의록 생성 (단순 STT→MD 변환 / Gemini AI 요약)
- 마크다운/HTML 내보내기
- PostgreSQL + Prisma ORM
- Docker Compose 배포 지원
- TDD: 31개 테스트, 96% 커버리지
This commit is contained in:
nad4 committed 2026-04-11 23:18:05 +09:00
1 parent b5743fe896
commit adb48c2352
31 files changed
+4288 -82

No files matched your search

+36
View File
@@ -0,0 +1,36 @@
import { NextRequest } from 'next/server'
import { handleUpload } from '@/lib/upload-handler'
import { writeFile, mkdir } from 'fs/promises'
import path from 'path'
const UPLOAD_DIR = path.join(process.cwd(), 'uploads')
export async function POST(request: NextRequest) {
try {
const formData = await request.formData()
const result = await handleUpload(formData)
if (!result.success) {
return Response.json({ error: result.error }, { status: 400 })
}
const audioFile = formData.get('audio') as File
const buffer = Buffer.from(await audioFile.arrayBuffer())
await mkdir(UPLOAD_DIR, { recursive: true })
const timestamp = Date.now()
const safeFileName = `${timestamp}_${result.data.fileName.replace(/[^a-zA-Z0-9._-]/g, '_')}`
const filePath = path.join(UPLOAD_DIR, safeFileName)
await writeFile(filePath, buffer)
return Response.json({
...result.data,
savedAs: safeFileName,
})
} catch (err) {
const message = err instanceof Error ? err.message : '알 수 없는 오류'
return Response.json({ error: `업로드 처리 실패: ${message}` }, { status: 500 })
}
}