import { queryOne, execute, insertReturning } from '../../../utils/db' import { requireAuth } from '../../../utils/session' import { getClientIp } from '../../../utils/ip' interface ConfirmBody { selectedTodos?: Array<{ agendaNo: number todoIndex: number title: string assignee?: string }> } /** * AI 분석 결과 확정 + TODO 생성 * POST /api/meeting/[id]/confirm */ export default defineEventHandler(async (event) => { const employeeId = await requireAuth(event) const meetingId = parseInt(event.context.params?.id || '0') const body = await readBody(event) const ip = getClientIp(event) if (!meetingId) { throw createError({ statusCode: 400, message: '회의록 ID가 필요합니다.' }) } // 회의록 조회 const meeting = await queryOne(` SELECT meeting_id, ai_summary, ai_status, project_id FROM wr_meeting WHERE meeting_id = $1 `, [meetingId]) if (!meeting) { throw createError({ statusCode: 404, message: '회의록을 찾을 수 없습니다.' }) } if (!meeting.ai_summary) { throw createError({ statusCode: 400, message: 'AI 분석 결과가 없습니다.' }) } const aiResult = typeof meeting.ai_summary === 'string' ? JSON.parse(meeting.ai_summary) : meeting.ai_summary // 선택된 TODO 생성 const createdTodos: any[] = [] if (body.selectedTodos && body.selectedTodos.length > 0) { for (const todo of body.selectedTodos) { const inserted = await insertReturning(` INSERT INTO wr_todo ( source_type, meeting_id, project_id, todo_title, todo_description, todo_status, author_id, created_at, created_ip ) VALUES ('MEETING', $1, $2, $3, $4, 'PENDING', $5, NOW(), $6) RETURNING todo_id `, [ meetingId, meeting.project_id, todo.title, `안건 ${todo.agendaNo}에서 추출`, employeeId, ip ]) createdTodos.push({ todoId: inserted.todo_id, title: todo.title }) } } // 상태 업데이트 await execute(` UPDATE wr_meeting SET ai_status = 'CONFIRMED', ai_confirmed_at = NOW() WHERE meeting_id = $1 `, [meetingId]) return { success: true, message: `확정 완료. ${createdTodos.length}개의 TODO가 생성되었습니다.`, createdTodos } })