93 lines
2.7 KiB
TypeScript
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: '회의록이 등록되었습니다.'
|
|
}
|
|
})
|