const express = require('express'); const router = express.Router(); const { getDb } = require('../dbPool'); const { requireAuth, requireAdmin } = require('../middlewares/auth'); /** * 모든 페이지 목록 조회 * GET /api/pages */ router.get('/pages', requireAuth, async (req, res) => { try { const db = await getDb(); const [pages] = await db.query(` SELECT id, page_key, page_name, page_path, category, description, is_admin_only, display_order FROM pages ORDER BY display_order, page_name `); res.json({ success: true, data: pages }); } catch (error) { console.error('페이지 목록 조회 오류:', error); res.status(500).json({ success: false, error: '페이지 목록을 불러오는데 실패했습니다.' }); } }); /** * 특정 사용자의 페이지 접근 권한 조회 * GET /api/users/:userId/page-access */ router.get('/users/:userId/page-access', requireAuth, async (req, res) => { try { const { userId } = req.params; const db = await getDb(); // 사용자의 역할 확인 const [userRows] = await db.query(` SELECT u.user_id, u.username, u.role_id, r.name as role_name FROM users u LEFT JOIN roles r ON u.role_id = r.id WHERE u.user_id = ? `, [userId]); if (userRows.length === 0) { return res.status(404).json({ success: false, error: '사용자를 찾을 수 없습니다.' }); } const user = userRows[0]; // Admin/System Admin인 경우 모든 페이지 접근 가능 if (user.role_name === 'Admin' || user.role_name === 'System Admin') { const [allPages] = await db.query(` SELECT id, page_key, page_name, page_path, category, is_admin_only FROM pages ORDER BY display_order, page_name `); const pageAccess = allPages.map(page => ({ page_id: page.id, page_key: page.page_key, page_name: page.page_name, page_path: page.page_path, category: page.category, is_admin_only: page.is_admin_only, can_access: true, is_default: true // Admin은 기본적으로 모든 권한 보유 })); return res.json({ success: true, data: { user, pageAccess } }); } // 일반 사용자의 페이지 접근 권한 조회 const [pageAccess] = await db.query(` SELECT p.id as page_id, p.page_key, p.page_name, p.page_path, p.category, p.is_admin_only, COALESCE(upa.can_access, p.is_default_accessible, 0) as can_access, upa.granted_at, u2.username as granted_by_username FROM pages p LEFT JOIN user_page_access upa ON p.id = upa.page_id AND upa.user_id = ? LEFT JOIN users u2 ON upa.granted_by = u2.user_id WHERE p.is_admin_only = 0 ORDER BY p.display_order, p.page_name `, [userId]); res.json({ success: true, data: { user, pageAccess } }); } catch (error) { console.error('페이지 접근 권한 조회 오류:', error); res.status(500).json({ success: false, error: '페이지 접근 권한을 불러오는데 실패했습니다.' }); } }); /** * 사용자에게 페이지 접근 권한 부여/회수 * POST /api/users/:userId/page-access * Body: { pageIds: [1, 2, 3], canAccess: true } */ router.post('/users/:userId/page-access', requireAuth, async (req, res) => { try { const { userId } = req.params; const { pageIds, canAccess } = req.body; const adminUserId = req.user.user_id; // 권한을 부여하는 Admin의 user_id // Admin 권한 확인 const db = await getDb(); const [adminRows] = await db.query(` SELECT u.role_id, r.name as role_name FROM users u LEFT JOIN roles r ON u.role_id = r.id WHERE u.user_id = ? `, [adminUserId]); if (adminRows.length === 0 || (adminRows[0].role_name !== 'Admin' && adminRows[0].role_name !== 'System Admin')) { return res.status(403).json({ success: false, error: '권한이 없습니다. Admin 계정만 사용자 권한을 관리할 수 있습니다.' }); } // 사용자 존재 확인 const [userRows] = await db.query('SELECT user_id FROM users WHERE user_id = ?', [userId]); if (userRows.length === 0) { return res.status(404).json({ success: false, error: '사용자를 찾을 수 없습니다.' }); } // 페이지 접근 권한 업데이트 for (const pageId of pageIds) { // 기존 권한 확인 const [existing] = await db.query( 'SELECT * FROM user_page_access WHERE user_id = ? AND page_id = ?', [userId, pageId] ); if (existing.length > 0) { // 업데이트 await db.query( 'UPDATE user_page_access SET can_access = ?, granted_at = NOW(), granted_by = ? WHERE user_id = ? AND page_id = ?', [canAccess ? 1 : 0, adminUserId, userId, pageId] ); } else { // 삽입 await db.query( 'INSERT INTO user_page_access (user_id, page_id, can_access, granted_by) VALUES (?, ?, ?, ?)', [userId, pageId, canAccess ? 1 : 0, adminUserId] ); } } res.json({ success: true, message: '페이지 접근 권한이 업데이트되었습니다.' }); } catch (error) { console.error('페이지 접근 권한 부여 오류:', error); res.status(500).json({ success: false, error: '페이지 접근 권한을 업데이트하는데 실패했습니다.' }); } }); /** * 특정 페이지의 접근 권한 회수 * DELETE /api/users/:userId/page-access/:pageId */ router.delete('/users/:userId/page-access/:pageId', requireAuth, async (req, res) => { try { const { userId, pageId } = req.params; const adminUserId = req.user.user_id; // Admin 권한 확인 const db = await getDb(); const [adminRows] = await db.query(` SELECT u.role_id, r.name as role_name FROM users u LEFT JOIN roles r ON u.role_id = r.id WHERE u.user_id = ? `, [adminUserId]); if (adminRows.length === 0 || (adminRows[0].role_name !== 'Admin' && adminRows[0].role_name !== 'System Admin')) { return res.status(403).json({ success: false, error: '권한이 없습니다.' }); } // 접근 권한 삭제 await db.query( 'DELETE FROM user_page_access WHERE user_id = ? AND page_id = ?', [userId, pageId] ); res.json({ success: true, message: '페이지 접근 권한이 회수되었습니다.' }); } catch (error) { console.error('페이지 접근 권한 회수 오류:', error); res.status(500).json({ success: false, error: '페이지 접근 권한을 회수하는데 실패했습니다.' }); } }); /** * 모든 사용자의 페이지 접근 권한 요약 조회 (Admin용) * GET /api/page-access/summary */ router.get('/page-access/summary', requireAuth, async (req, res) => { try { const adminUserId = req.user.user_id; // Admin 권한 확인 const db = await getDb(); const [adminRows] = await db.query(` SELECT u.role_id, r.name as role_name FROM users u LEFT JOIN roles r ON u.role_id = r.id WHERE u.user_id = ? `, [adminUserId]); if (adminRows.length === 0 || (adminRows[0].role_name !== 'Admin' && adminRows[0].role_name !== 'System Admin')) { return res.status(403).json({ success: false, error: '권한이 없습니다.' }); } // 모든 사용자와 페이지 권한 조회 const [summary] = await db.query(` SELECT u.user_id, u.username, u.name, r.name as role_name, COUNT(DISTINCT upa.page_id) as accessible_pages_count, (SELECT COUNT(*) FROM pages WHERE is_admin_only = 0) as total_pages_count FROM users u LEFT JOIN roles r ON u.role_id = r.id LEFT JOIN user_page_access upa ON u.user_id = upa.user_id AND upa.can_access = 1 WHERE r.name NOT IN ('Admin', 'System Admin') GROUP BY u.user_id, u.username, u.name, r.name ORDER BY u.username `); res.json({ success: true, data: summary }); } catch (error) { console.error('페이지 접근 권한 요약 조회 오류:', error); res.status(500).json({ success: false, error: '페이지 접근 권한 요약을 불러오는데 실패했습니다.' }); } }); module.exports = router;