108 lines
2.9 KiB
TypeScript
108 lines
2.9 KiB
TypeScript
import { queryOne, execute } from '../../../utils/db'
|
|
import { getClientIp } from '../../../utils/ip'
|
|
import { getCurrentUserEmail } from '../../../utils/user'
|
|
|
|
interface Attendee {
|
|
employeeId?: number
|
|
externalName?: string
|
|
externalCompany?: string
|
|
}
|
|
|
|
interface UpdateMeetingBody {
|
|
meetingTitle: string
|
|
meetingType: 'PROJECT' | 'INTERNAL'
|
|
projectId?: number
|
|
meetingDate: string
|
|
startTime?: string
|
|
endTime?: string
|
|
location?: string
|
|
rawContent?: string
|
|
attendees?: Attendee[]
|
|
}
|
|
|
|
/**
|
|
* 회의록 수정
|
|
* PUT /api/meeting/[id]/update
|
|
*/
|
|
export default defineEventHandler(async (event) => {
|
|
const meetingId = Number(getRouterParam(event, 'id'))
|
|
const body = await readBody<UpdateMeetingBody>(event)
|
|
const clientIp = getClientIp(event)
|
|
const userEmail = await getCurrentUserEmail(event)
|
|
|
|
if (!meetingId) {
|
|
throw createError({ statusCode: 400, message: '회의록 ID가 필요합니다.' })
|
|
}
|
|
|
|
// 회의록 존재 확인
|
|
const existing = await queryOne(`
|
|
SELECT meeting_id FROM wr_meeting WHERE meeting_id = $1
|
|
`, [meetingId])
|
|
|
|
if (!existing) {
|
|
throw createError({ statusCode: 404, message: '회의록을 찾을 수 없습니다.' })
|
|
}
|
|
|
|
// 필수값 검증
|
|
if (!body.meetingTitle) {
|
|
throw createError({ statusCode: 400, message: '회의 제목은 필수입니다.' })
|
|
}
|
|
if (body.meetingType === 'PROJECT' && !body.projectId) {
|
|
throw createError({ statusCode: 400, message: '프로젝트 회의는 프로젝트 선택이 필수입니다.' })
|
|
}
|
|
|
|
// 회의록 UPDATE
|
|
await execute(`
|
|
UPDATE wr_meeting SET
|
|
meeting_title = $1,
|
|
meeting_type = $2,
|
|
project_id = $3,
|
|
meeting_date = $4,
|
|
start_time = $5,
|
|
end_time = $6,
|
|
location = $7,
|
|
raw_content = $8,
|
|
updated_at = NOW(),
|
|
updated_ip = $9,
|
|
updated_email = $10
|
|
WHERE meeting_id = $11
|
|
`, [
|
|
body.meetingTitle,
|
|
body.meetingType,
|
|
body.meetingType === 'PROJECT' ? body.projectId : null,
|
|
body.meetingDate,
|
|
body.startTime || null,
|
|
body.endTime || null,
|
|
body.location || null,
|
|
body.rawContent || null,
|
|
clientIp,
|
|
userEmail,
|
|
meetingId
|
|
])
|
|
|
|
// 참석자 갱신 (기존 삭제 후 새로 INSERT)
|
|
await execute(`DELETE FROM wr_meeting_attendee WHERE meeting_id = $1`, [meetingId])
|
|
|
|
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)
|
|
`, [meetingId, att.employeeId])
|
|
} else if (att.externalName) {
|
|
await execute(`
|
|
INSERT INTO wr_meeting_attendee (meeting_id, external_name, external_company)
|
|
VALUES ($1, $2, $3)
|
|
`, [meetingId, att.externalName, att.externalCompany || null])
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
success: true,
|
|
meetingId,
|
|
message: '회의록이 수정되었습니다.'
|
|
}
|
|
})
|