import { insertReturning, query, execute } from '../../utils/db' import { getClientIp } from '../../utils/ip' import { getCurrentUserEmail, getCurrentUserId } from '../../utils/user' interface Attendee { employeeId?: number externalName?: string externalCompany?: string } interface CreateMeetingBody { meetingTitle: string meetingType: 'PROJECT' | 'INTERNAL' projectId?: number meetingDate: string startTime?: string endTime?: string location?: string rawContent?: string attendees?: Attendee[] } /** * 회의록 작성 * POST /api/meeting/create */ export default defineEventHandler(async (event) => { const body = await readBody(event) const clientIp = getClientIp(event) const userEmail = await getCurrentUserEmail(event) const userId = await getCurrentUserId(event) // 필수값 검증 if (!body.meetingTitle) { throw createError({ statusCode: 400, message: '회의 제목은 필수입니다.' }) } if (!body.meetingType) { throw createError({ statusCode: 400, message: '회의 유형은 필수입니다.' }) } if (!body.meetingDate) { throw createError({ statusCode: 400, message: '회의 일자는 필수입니다.' }) } if (body.meetingType === 'PROJECT' && !body.projectId) { throw createError({ statusCode: 400, message: '프로젝트 회의는 프로젝트 선택이 필수입니다.' }) } // 회의록 INSERT const meeting = await insertReturning(` INSERT INTO wr_meeting ( meeting_title, meeting_type, project_id, meeting_date, start_time, end_time, location, raw_content, ai_status, author_id, created_ip, created_email, updated_ip, updated_email ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, 'NONE', $9, $10, $11, $10, $11) RETURNING * `, [ body.meetingTitle, body.meetingType, body.meetingType === 'PROJECT' ? body.projectId : null, body.meetingDate, body.startTime || null, body.endTime || null, body.location || null, body.rawContent || null, userId, clientIp, userEmail ]) // 참석자 INSERT if (body.attendees && body.attendees.length > 0) { for (const att of body.attendees) { if (att.employeeId) { await execute(` INSERT INTO wr_meeting_attendee (meeting_id, employee_id) VALUES ($1, $2) `, [meeting.meeting_id, att.employeeId]) } else if (att.externalName) { await execute(` INSERT INTO wr_meeting_attendee (meeting_id, external_name, external_company) VALUES ($1, $2, $3) `, [meeting.meeting_id, att.externalName, att.externalCompany || null]) } } } return { success: true, meetingId: meeting.meeting_id, message: '회의록이 등록되었습니다.' } })