const MeetingModel = require('../models/meetingModel'); const logger = require('../utils/logger'); const MeetingController = { // 회의록 목록 getAll: async (req, res) => { try { const { year, month, search } = req.query; const rows = await MeetingModel.getAll({ year, month, search }); res.json({ success: true, data: rows }); } catch (err) { logger.error('Meeting getAll error:', err); res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' }); } }, // 회의록 상세 getById: async (req, res) => { try { const meeting = await MeetingModel.getById(req.params.id); if (!meeting) return res.status(404).json({ success: false, message: '회의록을 찾을 수 없습니다.' }); res.json({ success: true, data: meeting }); } catch (err) { logger.error('Meeting getById error:', err); res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' }); } }, // 회의록 생성 create: async (req, res) => { try { const { meeting_date, title } = req.body; if (!meeting_date || !title) { return res.status(400).json({ success: false, message: '날짜와 제목은 필수입니다.' }); } const id = await MeetingModel.create({ ...req.body, created_by: req.user.user_id || req.user.id }); res.status(201).json({ success: true, data: { meeting_id: id }, message: '회의록이 생성되었습니다.' }); } catch (err) { logger.error('Meeting create error:', err); res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' }); } }, // 회의록 수정 update: async (req, res) => { try { const meetingId = req.params.id; const status = await MeetingModel.getStatus(meetingId); if (!status) return res.status(404).json({ success: false, message: '회의록을 찾을 수 없습니다.' }); // published 상태면 admin만 수정 가능 const userLevel = req.user.access_level || req.user.role; if (status === 'published' && !['admin', 'system'].includes(userLevel)) { return res.status(403).json({ success: false, message: '발행된 회의록은 관리자만 수정할 수 있습니다.' }); } await MeetingModel.update(meetingId, req.body); res.json({ success: true, message: '회의록이 수정되었습니다.' }); } catch (err) { logger.error('Meeting update error:', err); res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' }); } }, // 회의록 발행 publish: async (req, res) => { try { await MeetingModel.publish(req.params.id); res.json({ success: true, message: '회의록이 발행되었습니다.' }); } catch (err) { logger.error('Meeting publish error:', err); res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' }); } }, // 발행 취소 (admin only) unpublish: async (req, res) => { try { await MeetingModel.unpublish(req.params.id); res.json({ success: true, message: '발행이 취소되었습니다.' }); } catch (err) { logger.error('Meeting unpublish error:', err); res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' }); } }, // 회의록 삭제 delete: async (req, res) => { try { await MeetingModel.delete(req.params.id); res.json({ success: true, message: '회의록이 삭제되었습니다.' }); } catch (err) { logger.error('Meeting delete error:', err); res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' }); } }, // === 안건 === addItem: async (req, res) => { try { const { content } = req.body; if (!content) return res.status(400).json({ success: false, message: '안건 내용을 입력해주세요.' }); // published 체크 const status = await MeetingModel.getStatus(req.params.id); const userLevel = req.user.access_level || req.user.role; if (status === 'published' && !['admin', 'system'].includes(userLevel)) { return res.status(403).json({ success: false, message: '발행된 회의록은 관리자만 수정할 수 있습니다.' }); } const id = await MeetingModel.addItem(req.params.id, req.body); res.status(201).json({ success: true, data: { item_id: id }, message: '안건이 추가되었습니다.' }); } catch (err) { logger.error('Meeting addItem error:', err); res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' }); } }, updateItem: async (req, res) => { try { // published 체크 const status = await MeetingModel.getStatus(req.params.id); const userLevel = req.user.access_level || req.user.role; if (status === 'published' && !['admin', 'system'].includes(userLevel)) { return res.status(403).json({ success: false, message: '발행된 회의록은 관리자만 수정할 수 있습니다.' }); } await MeetingModel.updateItem(req.params.itemId, req.body); res.json({ success: true, message: '안건이 수정되었습니다.' }); } catch (err) { logger.error('Meeting updateItem error:', err); res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' }); } }, deleteItem: async (req, res) => { try { // published 체크 const status = await MeetingModel.getStatus(req.params.id); const userLevel = req.user.access_level || req.user.role; if (status === 'published' && !['admin', 'system'].includes(userLevel)) { return res.status(403).json({ success: false, message: '발행된 회의록은 관리자만 수정할 수 있습니다.' }); } await MeetingModel.deleteItem(req.params.itemId); res.json({ success: true, message: '안건이 삭제되었습니다.' }); } catch (err) { logger.error('Meeting deleteItem error:', err); res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' }); } }, // 조치상태 업데이트 (group_leader+) updateItemStatus: async (req, res) => { try { const { status } = req.body; if (!status) return res.status(400).json({ success: false, message: '상태를 선택해주세요.' }); await MeetingModel.updateItemStatus(req.params.itemId, status); res.json({ success: true, message: '조치상태가 업데이트되었습니다.' }); } catch (err) { logger.error('Meeting updateItemStatus error:', err); res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' }); } }, // 미완료 조치사항 getActionItems: async (req, res) => { try { const { status, responsible_user_id } = req.query; const rows = await MeetingModel.getActionItems({ status, responsible_user_id }); res.json({ success: true, data: rows }); } catch (err) { logger.error('Meeting getActionItems error:', err); res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' }); } } }; module.exports = MeetingController;