Files
weeklyreport/backend/api/meeting/create.post.ts

93 lines
2.7 KiB
TypeScript

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<CreateMeetingBody>(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: '회의록이 등록되었습니다.'
}
})