feat(tkuser): 부서 마스터 + 개인 추가 부여 권한 시스템 구현

부서 권한을 바닥(마스터)으로 설정하고 개인은 추가 부여만 가능하도록 변경.
부서 허용 항목은 개인 페이지에서 잠금(해제 불가) 표시되며,
부서 이동 시 기존 개인 권한이 자동 초기화됨.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-03-16 11:49:25 +09:00
parent f711a721ec
commit 4108a6e64a
5 changed files with 130 additions and 39 deletions

View File

@@ -164,6 +164,7 @@ async function getDepartmentPermissions(req, res, next) {
/**
* POST /api/permissions/departments/:deptId/bulk-set - 부서 권한 일괄 설정
* 저장 후 소속 사용자의 중복 개인 레코드 정리
*/
async function bulkSetDepartmentPermissions(req, res, next) {
try {
@@ -177,10 +178,34 @@ async function bulkSetDepartmentPermissions(req, res, next) {
granted_by_id: grantedById
});
// 소속 사용자의 중복 개인 레코드 정리
const { getPool } = require('../models/userModel');
const db = getPool();
const [deptUsers] = await db.query(
'SELECT user_id FROM sso_users WHERE department_id = ?', [deptId]
);
// 부서가 허용한 페이지 목록
const grantedPages = (permissions || [])
.filter(p => p.can_access)
.map(p => p.page_name);
let syncedUsers = 0;
if (grantedPages.length > 0 && deptUsers.length > 0) {
for (const u of deptUsers) {
const [delResult] = await db.query(
`DELETE FROM user_page_permissions WHERE user_id = ? AND page_name IN (${grantedPages.map(() => '?').join(',')})`,
[u.user_id, ...grantedPages]
);
if (delResult.affectedRows > 0) syncedUsers++;
}
}
res.json({
success: true,
message: `${result.updated_count} 부서 권한 설정되었습니다`,
updated_count: result.updated_count
message: `${result.updated_count}개 부서 권한 설정 (${deptUsers.length}명 적용)`,
updated_count: result.updated_count,
synced_users: deptUsers.length
});
} catch (err) {
next(err);

View File

@@ -5,6 +5,7 @@
*/
const userModel = require('../models/userModel');
const permissionModel = require('../models/permissionModel');
/**
* GET /api/users - 전체 사용자 목록
@@ -62,6 +63,14 @@ async function updateUser(req, res, next) {
delete data.full_name;
}
// 부서 변경 감지 → 개인 권한 초기화
if (data.department_id !== undefined) {
const existingUser = await userModel.findById(userId);
if (existingUser && existingUser.department_id !== data.department_id) {
await permissionModel.clearUserPermissionsForDepartmentChange(userId);
}
}
const user = await userModel.update(userId, data);
if (!user) {
return res.status(404).json({ success: false, error: '사용자를 찾을 수 없습니다' });