사용자 상태 변경 구현

This commit is contained in:
dohyeons
2025-08-26 09:56:45 +09:00
parent b43a88a045
commit 4f6be8f551
5 changed files with 143 additions and 11 deletions

View File

@@ -3,6 +3,7 @@ import { logger } from "../utils/logger";
import { AuthenticatedRequest } from "../types/auth";
import { ApiResponse } from "../types/common";
import { Client } from "pg";
import config from "../config/environment";
import { AdminService } from "../services/adminService";
import { EncryptUtil } from "../utils/encryptUtil";
@@ -1984,6 +1985,140 @@ export const getUserHistory = async (
}
};
/**
* PATCH /api/admin/users/:userId/status
* 사용자 상태 변경 API (부분 수정)
* 기존 Java AdminController.changeUserStatus() 포팅
*/
export const changeUserStatus = async (
req: AuthenticatedRequest,
res: Response
) => {
try {
const { userId } = req.params;
const { status } = req.body;
logger.info("사용자 상태 변경 요청", { userId, status, user: req.user });
// 필수 파라미터 검증
if (!userId || !status) {
res.status(400).json({
result: false,
msg: "사용자 ID와 상태는 필수입니다.",
});
return;
}
// 상태 값 검증
if (!["active", "inactive"].includes(status)) {
res.status(400).json({
result: false,
msg: "유효하지 않은 상태값입니다. (active, inactive만 허용)",
});
return;
}
const client = new Client({
connectionString: config.databaseUrl,
});
try {
await client.connect();
// 1. 사용자 존재 여부 확인
const userCheckResult = await client.query(
"SELECT user_id, user_name, status FROM user_info WHERE user_id = $1",
[userId]
);
if (userCheckResult.rows.length === 0) {
res.status(404).json({
result: false,
msg: "사용자를 찾을 수 없습니다.",
});
return;
}
const currentUser = userCheckResult.rows[0];
// 2. 상태 변경 쿼리 실행
let updateQuery = `
UPDATE user_info
SET status = $1
`;
const queryParams = [status];
// active/inactive에 따른 END_DATE 처리
if (status === "inactive") {
updateQuery += `, end_date = NOW()`;
} else if (status === "active") {
updateQuery += `, end_date = NULL`;
}
updateQuery += ` WHERE user_id = $2`;
queryParams.push(userId);
const updateResult = await client.query(updateQuery, queryParams);
if (updateResult.rowCount && updateResult.rowCount > 0) {
// 3. 사용자 이력 저장 (선택적)
try {
await client.query(
`
INSERT INTO user_info_history
(user_id, user_name, dept_code, dept_name, user_type_name, history_type, writer, reg_date, status, sabun)
VALUES ($1, $2, '', '', '', '사용자 상태 변경', $3, NOW(), $4, '')
`,
[
userId,
currentUser.user_name || userId,
req.user?.userId || "system",
status,
]
);
} catch (historyError) {
logger.warn("사용자 이력 저장 실패", {
error: historyError,
userId,
status,
});
// 이력 저장 실패는 치명적이지 않으므로 계속 진행
}
logger.info("사용자 상태 변경 성공", {
userId,
oldStatus: currentUser.status,
newStatus: status,
updatedBy: req.user?.userId,
});
res.json({
result: true,
msg: `사용자 상태가 ${status === "active" ? "활성" : "비활성"}으로 변경되었습니다.`,
});
} else {
res.status(400).json({
result: false,
msg: "사용자 상태 변경에 실패했습니다.",
});
}
} finally {
await client.end();
}
} catch (error) {
logger.error("사용자 상태 변경 중 오류 발생", {
error,
userId: req.params.userId,
status: req.body.status,
});
res.status(500).json({
result: false,
msg: "시스템 오류가 발생했습니다.",
});
}
};
export const saveUser = async (req: AuthenticatedRequest, res: Response) => {
try {
const userData = req.body;