Files
tk-factory-services/user-management/api/controllers/notificationRecipientController.js
Hyungi Ahn 4b68431d2d fix(notifications): 알림 수신자 관리 본인 검증을 권한 검증으로 교체
본인 검증이 타인 수신자 추가/제거를 차단하는 문제 수정.
permissionModel.checkAccess로 tkuser.notification_recipients 권한 확인.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 16:33:21 +09:00

106 lines
3.8 KiB
JavaScript

// controllers/notificationRecipientController.js
const notificationRecipientModel = require('../models/notificationRecipientModel');
const permissionModel = require('../models/permissionModel');
async function checkNrPermission(user) {
const role = (user.role || '').toLowerCase();
if (['admin', 'system'].includes(role)) return true;
const access = await permissionModel.checkAccess(user.user_id, 'tkuser.notification_recipients');
return access.can_access;
}
const notificationRecipientController = {
// 알림 유형 목록
getTypes: async (req, res) => {
try {
const types = notificationRecipientModel.getTypes();
res.json({ success: true, data: types });
} catch (error) {
console.error('알림 유형 조회 오류:', error);
res.status(500).json({ success: false, error: '알림 유형 조회 실패' });
}
},
// 전체 수신자 목록 (유형별 그룹화)
getAll: async (req, res) => {
try {
const recipients = await notificationRecipientModel.getAll();
res.json({ success: true, data: recipients });
} catch (error) {
console.error(' 수신자 목록 조회 오류:', error.message);
console.error(' 스택:', error.stack);
res.status(500).json({ success: false, error: '수신자 목록 조회 실패', detail: error.message });
}
},
// 유형별 수신자 조회
getByType: async (req, res) => {
try {
const { type } = req.params;
const recipients = await notificationRecipientModel.getByType(type);
res.json({ success: true, data: recipients });
} catch (error) {
console.error('수신자 조회 오류:', error);
res.status(500).json({ success: false, error: '수신자 조회 실패' });
}
},
// 수신자 추가 (권한 보유 사용자)
add: async (req, res) => {
try {
const { notification_type, user_id } = req.body;
if (!notification_type || !user_id) {
return res.status(400).json({ success: false, error: '알림 유형과 사용자 ID가 필요합니다.' });
}
if (!await checkNrPermission(req.user)) {
return res.status(403).json({ success: false, error: '알림 수신자 관리 권한이 없습니다.' });
}
await notificationRecipientModel.add(notification_type, user_id, req.user?.user_id);
res.json({ success: true, message: '수신자가 추가되었습니다.' });
} catch (error) {
console.error('수신자 추가 오류:', error);
res.status(500).json({ success: false, error: '수신자 추가 실패' });
}
},
// 수신자 제거 (권한 보유 사용자)
remove: async (req, res) => {
try {
const { type, userId } = req.params;
if (!await checkNrPermission(req.user)) {
return res.status(403).json({ success: false, error: '알림 수신자 관리 권한이 없습니다.' });
}
await notificationRecipientModel.remove(type, userId);
res.json({ success: true, message: '수신자가 제거되었습니다.' });
} catch (error) {
console.error('수신자 제거 오류:', error);
res.status(500).json({ success: false, error: '수신자 제거 실패' });
}
},
// 유형별 수신자 일괄 설정
setRecipients: async (req, res) => {
try {
const { type } = req.params;
const { user_ids } = req.body;
if (!Array.isArray(user_ids)) {
return res.status(400).json({ success: false, error: 'user_ids 배열이 필요합니다.' });
}
await notificationRecipientModel.setRecipients(type, user_ids, req.user?.user_id);
res.json({ success: true, message: '수신자가 설정되었습니다.' });
} catch (error) {
console.error('수신자 설정 오류:', error);
res.status(500).json({ success: false, error: '수신자 설정 실패' });
}
}
};
module.exports = notificationRecipientController;