전체 카테고리 키 목록 조회 API 및 관련 기능 추가

- 카테고리 트리 컨트롤러에 전체 카테고리 키 목록 조회 라우트 추가: GET /api/category-tree/test/all-category-keys
- 카테고리 트리 서비스에 전체 카테고리 키 목록 조회 메서드 구현: 모든 테이블과 컬럼 조합을 반환
- 채번규칙 컨트롤러에서 폼 데이터 처리 기능 추가: 코드 미리보기 시 카테고리 기반 폼 데이터 사용
- 관련 API 클라이언트 및 타입 정의 업데이트: 카테고리 키 조회 및 채번규칙 API에 대한 요청 처리 개선

이로 인해 카테고리 관리 및 채번규칙 테스트의 효율성이 향상되었습니다.
This commit is contained in:
kjs
2026-01-21 17:51:59 +09:00
parent ae4e21e1ac
commit 623ade4f28
14 changed files with 1601 additions and 138 deletions

View File

@@ -202,9 +202,10 @@ router.delete("/:ruleId", authenticateToken, async (req: AuthenticatedRequest, r
router.post("/:ruleId/preview", authenticateToken, async (req: AuthenticatedRequest, res: Response) => {
const companyCode = req.user!.companyCode;
const { ruleId } = req.params;
const { formData } = req.body; // 폼 데이터 (카테고리 기반 채번 시 사용)
try {
const previewCode = await numberingRuleService.previewCode(ruleId, companyCode);
const previewCode = await numberingRuleService.previewCode(ruleId, companyCode, formData);
return res.json({ success: true, data: { generatedCode: previewCode } });
} catch (error: any) {
logger.error("코드 미리보기 실패", { error: error.message });
@@ -321,4 +322,90 @@ router.post("/test/save", authenticateToken, async (req: AuthenticatedRequest, r
}
});
// [테스트] 테스트 테이블에서 채번규칙 삭제
router.delete("/test/:ruleId", authenticateToken, async (req: AuthenticatedRequest, res: Response) => {
const companyCode = req.user!.companyCode;
const { ruleId } = req.params;
try {
await numberingRuleService.deleteRuleFromTest(ruleId, companyCode);
return res.json({ success: true });
} catch (error: any) {
logger.error("테스트 테이블에서 채번규칙 삭제 실패", {
error: error.message,
companyCode,
ruleId,
});
return res.status(500).json({ success: false, error: error.message });
}
});
// [테스트] 카테고리 조건 포함 채번규칙 조회
router.get("/test/by-column-with-category", authenticateToken, async (req: AuthenticatedRequest, res: Response) => {
const companyCode = req.user!.companyCode;
const { tableName, columnName, categoryColumn, categoryValueId } = req.query;
try {
if (!tableName || typeof tableName !== "string") {
return res.status(400).json({ success: false, error: "tableName is required" });
}
if (!columnName || typeof columnName !== "string") {
return res.status(400).json({ success: false, error: "columnName is required" });
}
const rule = await numberingRuleService.getNumberingRuleByColumnWithCategory(
companyCode,
tableName,
columnName,
categoryColumn as string | undefined,
categoryValueId ? Number(categoryValueId) : undefined
);
if (!rule) {
return res.status(404).json({ success: false, error: "규칙을 찾을 수 없습니다" });
}
return res.json({ success: true, data: rule });
} catch (error: any) {
logger.error("카테고리 조건 포함 채번규칙 조회 실패", {
error: error.message,
companyCode,
tableName,
columnName,
});
return res.status(500).json({ success: false, error: error.message });
}
});
// [테스트] 테이블.컬럼별 모든 채번규칙 조회 (카테고리 조건별)
router.get("/test/rules-by-table-column", authenticateToken, async (req: AuthenticatedRequest, res: Response) => {
const companyCode = req.user!.companyCode;
const { tableName, columnName } = req.query;
try {
if (!tableName || typeof tableName !== "string") {
return res.status(400).json({ success: false, error: "tableName is required" });
}
if (!columnName || typeof columnName !== "string") {
return res.status(400).json({ success: false, error: "columnName is required" });
}
const rules = await numberingRuleService.getRulesByTableColumn(
companyCode,
tableName,
columnName
);
return res.json({ success: true, data: rules });
} catch (error: any) {
logger.error("테이블.컬럼별 채번규칙 목록 조회 실패", {
error: error.message,
companyCode,
tableName,
columnName,
});
return res.status(500).json({ success: false, error: error.message });
}
});
export default router;