dev #46

Merged
kjs merged 344 commits from dev into main 2025-09-22 18:17:24 +09:00
2 changed files with 333 additions and 0 deletions
Showing only changes of commit 6cac3dfa3f - Show all commits

View File

@ -1976,3 +1976,330 @@ export const saveUser = async (req: AuthenticatedRequest, res: Response) => {
});
}
};
/**
* POST /api/admin/companies
* API
* Java AdminController의
*/
export const createCompany = async (
req: AuthenticatedRequest,
res: Response
): Promise<void> => {
try {
logger.info("회사 등록 요청", {
body: req.body,
user: req.user,
});
const { company_name } = req.body;
// 필수 입력값 검증
if (!company_name || !company_name.trim()) {
res.status(400).json({
success: false,
message: "회사명을 입력해주세요.",
errorCode: "COMPANY_NAME_REQUIRED",
});
return;
}
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
});
await client.connect();
try {
// 회사명 중복 체크
const duplicateCheckQuery = `
SELECT COUNT(*) as count
FROM company_mng
WHERE company_name = $1
`;
const duplicateResult = await client.query(duplicateCheckQuery, [
company_name.trim(),
]);
if (parseInt(duplicateResult.rows[0].count) > 0) {
res.status(400).json({
success: false,
message: "이미 등록된 회사명입니다.",
errorCode: "COMPANY_NAME_DUPLICATE",
});
return;
}
// 회사 코드 생성 (COMPANY_1, COMPANY_2, ...)
const codeQuery = `
SELECT COALESCE(MAX(CAST(SUBSTRING(company_code FROM 9) AS INTEGER)), 0) + 1 as next_number
FROM company_mng
WHERE company_code LIKE 'COMPANY_%'
`;
const codeResult = await client.query(codeQuery);
const nextNumber = codeResult.rows[0].next_number;
const companyCode = `COMPANY_${nextNumber}`;
// 회사 정보 저장
const insertQuery = `
INSERT INTO company_mng (
company_code,
company_name,
writer,
regdate,
status
) VALUES ($1, $2, $3, $4, $5)
RETURNING *
`;
const writer = req.user
? `${req.user.userName}(${req.user.userId})`
: "시스템";
const insertValues = [
companyCode,
company_name.trim(),
writer,
new Date(),
"active",
];
const insertResult = await client.query(insertQuery, insertValues);
const createdCompany = insertResult.rows[0];
logger.info("회사 등록 성공", {
companyCode: createdCompany.company_code,
companyName: createdCompany.company_name,
writer: createdCompany.writer,
});
const response = {
success: true,
message: "회사가 성공적으로 등록되었습니다.",
data: {
company_code: createdCompany.company_code,
company_name: createdCompany.company_name,
writer: createdCompany.writer,
regdate: createdCompany.regdate,
status: createdCompany.status,
},
};
res.status(201).json(response);
} finally {
await client.end();
}
} catch (error) {
logger.error("회사 등록 실패", { error, body: req.body });
res.status(500).json({
success: false,
message: "회사 등록 중 오류가 발생했습니다.",
errorCode: "COMPANY_CREATE_ERROR",
error: error instanceof Error ? error.message : "Unknown error",
});
}
};
/**
* PUT /api/admin/companies/:companyCode
* API
*/
export const updateCompany = async (
req: AuthenticatedRequest,
res: Response
): Promise<void> => {
try {
const { companyCode } = req.params;
const { company_name, status } = req.body;
logger.info("회사 정보 수정 요청", {
companyCode,
body: req.body,
user: req.user,
});
// 필수 입력값 검증
if (!company_name || !company_name.trim()) {
res.status(400).json({
success: false,
message: "회사명을 입력해주세요.",
errorCode: "COMPANY_NAME_REQUIRED",
});
return;
}
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
});
await client.connect();
try {
// 회사명 중복 체크 (자기 자신 제외)
const duplicateCheckQuery = `
SELECT COUNT(*) as count
FROM company_mng
WHERE company_name = $1 AND company_code != $2
`;
const duplicateResult = await client.query(duplicateCheckQuery, [
company_name.trim(),
companyCode,
]);
if (parseInt(duplicateResult.rows[0].count) > 0) {
res.status(400).json({
success: false,
message: "이미 등록된 회사명입니다.",
errorCode: "COMPANY_NAME_DUPLICATE",
});
return;
}
// 회사 정보 수정
const updateQuery = `
UPDATE company_mng
SET company_name = $1, status = $2
WHERE company_code = $3
RETURNING *
`;
const updateValues = [
company_name.trim(),
status || "active",
companyCode,
];
const updateResult = await client.query(updateQuery, updateValues);
if (updateResult.rows.length === 0) {
res.status(404).json({
success: false,
message: "해당 회사를 찾을 수 없습니다.",
errorCode: "COMPANY_NOT_FOUND",
});
return;
}
const updatedCompany = updateResult.rows[0];
logger.info("회사 정보 수정 성공", {
companyCode: updatedCompany.company_code,
companyName: updatedCompany.company_name,
status: updatedCompany.status,
});
const response = {
success: true,
message: "회사 정보가 수정되었습니다.",
data: {
company_code: updatedCompany.company_code,
company_name: updatedCompany.company_name,
writer: updatedCompany.writer,
regdate: updatedCompany.regdate,
status: updatedCompany.status,
},
};
res.status(200).json(response);
} finally {
await client.end();
}
} catch (error) {
logger.error("회사 정보 수정 실패", { error, body: req.body });
res.status(500).json({
success: false,
message: "회사 정보 수정 중 오류가 발생했습니다.",
errorCode: "COMPANY_UPDATE_ERROR",
error: error instanceof Error ? error.message : "Unknown error",
});
}
};
/**
* DELETE /api/admin/companies/:companyCode
* API
*/
export const deleteCompany = async (
req: AuthenticatedRequest,
res: Response
): Promise<void> => {
try {
const { companyCode } = req.params;
logger.info("회사 삭제 요청", {
companyCode,
user: req.user,
});
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
});
await client.connect();
try {
// 회사 존재 여부 확인
const checkQuery = `
SELECT company_code, company_name
FROM company_mng
WHERE company_code = $1
`;
const checkResult = await client.query(checkQuery, [companyCode]);
if (checkResult.rows.length === 0) {
res.status(404).json({
success: false,
message: "해당 회사를 찾을 수 없습니다.",
errorCode: "COMPANY_NOT_FOUND",
});
return;
}
// 회사 삭제
const deleteQuery = `
DELETE FROM company_mng
WHERE company_code = $1
`;
await client.query(deleteQuery, [companyCode]);
logger.info("회사 삭제 성공", {
companyCode,
companyName: checkResult.rows[0].company_name,
});
const response = {
success: true,
message: "회사가 삭제되었습니다.",
data: {
company_code: companyCode,
company_name: checkResult.rows[0].company_name,
},
};
res.status(200).json(response);
} finally {
await client.end();
}
} catch (error) {
logger.error("회사 삭제 실패", { error });
res.status(500).json({
success: false,
message: "회사 삭제 중 오류가 발생했습니다.",
errorCode: "COMPANY_DELETE_ERROR",
error: error instanceof Error ? error.message : "Unknown error",
});
}
};

View File

@ -14,6 +14,9 @@ import {
saveUser, // 사용자 등록/수정
getCompanyList,
getCompanyListFromDB, // 실제 DB에서 회사 목록 조회
createCompany, // 회사 등록
updateCompany, // 회사 수정
deleteCompany, // 회사 삭제
getUserLocale,
setUserLocale,
getLanguageList,
@ -56,6 +59,9 @@ router.get("/departments", getDepartmentList); // 부서 목록 조회
// 회사 관리 API
router.get("/companies", getCompanyList);
router.get("/companies/db", getCompanyListFromDB); // 실제 DB에서 회사 목록 조회
router.post("/companies", createCompany); // 회사 등록
router.put("/companies/:companyCode", updateCompany); // 회사 수정
router.delete("/companies/:companyCode", deleteCompany); // 회사 삭제
// 사용자 로케일 API
router.get("/user-locale", getUserLocale);