83 lines
2.3 KiB
TypeScript
83 lines
2.3 KiB
TypeScript
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<ConfirmBody>(event)
|
|
const ip = getClientIp(event)
|
|
|
|
if (!meetingId) {
|
|
throw createError({ statusCode: 400, message: '회의록 ID가 필요합니다.' })
|
|
}
|
|
|
|
// 회의록 조회
|
|
const meeting = await queryOne<any>(`
|
|
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
|
|
}
|
|
})
|