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);