사용자 상태 변경 구현
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user