feat: 권한 탭 분리 + 부서 인원 표시 + 다수 시스템 개선
- tkuser: 권한 관리를 별도 탭으로 분리, 부서 클릭 시 소속 인원 목록 표시 - system1: 모바일 UI 개선, nginx 권한 보정, 신고 카테고리 타입 마이그레이션 - system2: 신고 상세/보고서 개선, 내 보고서 페이지 추가 - system3: 이슈 뷰/수신함/관리함 개선 - gateway: 포털 라우팅 수정 - user-management API: 부서별 권한 벌크 설정 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -149,11 +149,77 @@ async function deletePermission(req, res, next) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* GET /api/permissions/departments/:deptId/permissions - 부서 권한 조회
|
||||
*/
|
||||
async function getDepartmentPermissions(req, res, next) {
|
||||
try {
|
||||
const deptId = parseInt(req.params.deptId);
|
||||
const permissions = await permissionModel.getDepartmentPermissions(deptId);
|
||||
res.json({ success: true, data: permissions });
|
||||
} catch (err) {
|
||||
next(err);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* POST /api/permissions/departments/:deptId/bulk-set - 부서 권한 일괄 설정
|
||||
*/
|
||||
async function bulkSetDepartmentPermissions(req, res, next) {
|
||||
try {
|
||||
const deptId = parseInt(req.params.deptId);
|
||||
const { permissions } = req.body;
|
||||
const grantedById = req.user.user_id || req.user.id;
|
||||
|
||||
const result = await permissionModel.bulkSetDepartmentPermissions({
|
||||
department_id: deptId,
|
||||
permissions,
|
||||
granted_by_id: grantedById
|
||||
});
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: `${result.updated_count}개의 부서 권한이 설정되었습니다`,
|
||||
updated_count: result.updated_count
|
||||
});
|
||||
} catch (err) {
|
||||
next(err);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* GET /api/permissions/users/:userId/effective-permissions - 출처 포함 권한 조회
|
||||
*/
|
||||
async function getUserPermissionsWithSource(req, res, next) {
|
||||
try {
|
||||
const userId = parseInt(req.params.userId);
|
||||
const requesterId = req.user.user_id || req.user.id;
|
||||
|
||||
// 관리자이거나 본인만 조회 가능
|
||||
if (req.user.role !== 'admin' && requesterId !== userId) {
|
||||
return res.status(403).json({ success: false, error: '권한이 없습니다' });
|
||||
}
|
||||
|
||||
const user = await userModel.findById(userId);
|
||||
if (!user) {
|
||||
return res.status(404).json({ success: false, error: '사용자를 찾을 수 없습니다' });
|
||||
}
|
||||
|
||||
const result = await permissionModel.getUserPermissionsWithSource(userId);
|
||||
res.json({ success: true, ...result });
|
||||
} catch (err) {
|
||||
next(err);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getUserPermissions,
|
||||
grantPermission,
|
||||
bulkGrant,
|
||||
checkAccess,
|
||||
getAvailablePages,
|
||||
deletePermission
|
||||
deletePermission,
|
||||
getDepartmentPermissions,
|
||||
bulkSetDepartmentPermissions,
|
||||
getUserPermissionsWithSource
|
||||
};
|
||||
|
||||
@@ -23,7 +23,7 @@ async function getUsers(req, res, next) {
|
||||
*/
|
||||
async function createUser(req, res, next) {
|
||||
try {
|
||||
const { username, password, name, full_name, department, role } = req.body;
|
||||
const { username, password, name, full_name, department, department_id, role } = req.body;
|
||||
|
||||
if (!username || !password) {
|
||||
return res.status(400).json({ success: false, error: '사용자명과 비밀번호는 필수입니다' });
|
||||
@@ -39,6 +39,7 @@ async function createUser(req, res, next) {
|
||||
password,
|
||||
name: name || full_name,
|
||||
department,
|
||||
department_id: department_id || null,
|
||||
role
|
||||
});
|
||||
res.status(201).json({ success: true, data: user });
|
||||
|
||||
Reference in New Issue
Block a user