기능구현중
This commit is contained in:
122
server/api/meeting/list.get.ts
Normal file
122
server/api/meeting/list.get.ts
Normal file
@@ -0,0 +1,122 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user