import { query } from '../../utils/db' /** * 회의록 목록 조회 * GET /api/meeting/list * * Query params: * - projectId: 프로젝트 필터 (선택) * - meetingType: PROJECT | INTERNAL (선택) * - startDate: 시작일 (선택) * - endDate: 종료일 (선택) * - keyword: 검색어 (선택) * - page: 페이지 번호 (기본 1) * - pageSize: 페이지 크기 (기본 20) */ export default defineEventHandler(async (event) => { const params = getQuery(event) const projectId = params.projectId ? Number(params.projectId) : null const meetingType = params.meetingType as string | null const startDate = params.startDate as string | null const endDate = params.endDate as string | null const keyword = params.keyword as string | null const page = Number(params.page) || 1 const pageSize = Number(params.pageSize) || 20 const offset = (page - 1) * pageSize // WHERE 조건 구성 const conditions: string[] = [] const values: any[] = [] let paramIndex = 1 if (projectId) { conditions.push(`m.project_id = $${paramIndex++}`) values.push(projectId) } if (meetingType) { conditions.push(`m.meeting_type = $${paramIndex++}`) values.push(meetingType) } if (startDate) { conditions.push(`m.meeting_date >= $${paramIndex++}`) values.push(startDate) } if (endDate) { conditions.push(`m.meeting_date <= $${paramIndex++}`) values.push(endDate) } if (keyword) { conditions.push(`(m.meeting_title ILIKE $${paramIndex} OR m.raw_content ILIKE $${paramIndex})`) values.push(`%${keyword}%`) paramIndex++ } const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '' // 전체 건수 조회 const countSql = ` SELECT COUNT(*) as total FROM wr_meeting m ${whereClause} ` const countResult = await query(countSql, values) const total = Number(countResult[0]?.total || 0) // 목록 조회 const listSql = ` SELECT m.meeting_id, m.meeting_title, m.meeting_type, m.project_id, p.project_name, m.meeting_date, m.start_time, m.end_time, m.location, m.ai_status, m.author_id, e.employee_name as author_name, m.created_at, (SELECT COUNT(*) FROM wr_meeting_attendee WHERE meeting_id = m.meeting_id) as attendee_count FROM wr_meeting m LEFT JOIN wr_project_info p ON m.project_id = p.project_id LEFT JOIN wr_employee_info e ON m.author_id = e.employee_id ${whereClause} ORDER BY m.meeting_date DESC, m.created_at DESC LIMIT $${paramIndex++} OFFSET $${paramIndex++} ` values.push(pageSize, offset) const meetings = await query(listSql, values) return { meetings: meetings.map((m: any) => ({ meetingId: m.meeting_id, meetingTitle: m.meeting_title, meetingType: m.meeting_type, projectId: m.project_id, projectName: m.project_name, meetingDate: m.meeting_date, startTime: m.start_time, endTime: m.end_time, location: m.location, aiStatus: m.ai_status, authorId: m.author_id, authorName: m.author_name, attendeeCount: Number(m.attendee_count), createdAt: m.created_at })), pagination: { page, pageSize, total, totalPages: Math.ceil(total / pageSize) } } })