카테고리 트리 기능 추가 및 관련 API 구현
- 카테고리 트리 컨트롤러와 서비스 추가: 트리 구조를 지원하는 카테고리 값 관리 기능을 구현하였습니다. - 카테고리 트리 API 클라이언트 추가: CRUD 작업을 위한 API 클라이언트를 구현하였습니다. - 카테고리 값 관리 컴포넌트 및 설정 패널 추가: 사용자 인터페이스에서 카테고리 값을 관리할 수 있도록 트리 구조 기반의 컴포넌트를 추가하였습니다. - 관련 라우트 및 레지스트리 업데이트: 카테고리 트리 관련 라우트를 추가하고, 컴포넌트 레지스트리에 등록하였습니다. 이로 인해 카테고리 관리의 효율성이 향상되었습니다.
This commit is contained in:
226
backend-node/src/controllers/categoryTreeController.ts
Normal file
226
backend-node/src/controllers/categoryTreeController.ts
Normal file
@@ -0,0 +1,226 @@
|
||||
/**
|
||||
* 카테고리 트리 컨트롤러 (테스트용)
|
||||
*/
|
||||
|
||||
import { Router, Request, Response } from "express";
|
||||
import { categoryTreeService, CreateCategoryValueInput, UpdateCategoryValueInput } from "../services/categoryTreeService";
|
||||
import { logger } from "../utils/logger";
|
||||
|
||||
const router = Router();
|
||||
|
||||
// 인증된 사용자 타입
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
userId: string;
|
||||
companyCode: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 카테고리 트리 조회
|
||||
* GET /api/category-tree/test/:tableName/:columnName
|
||||
*/
|
||||
router.get("/test/:tableName/:columnName", async (req: AuthenticatedRequest, res: Response) => {
|
||||
try {
|
||||
const { tableName, columnName } = req.params;
|
||||
const companyCode = req.user?.companyCode || "*";
|
||||
|
||||
const tree = await categoryTreeService.getCategoryTree(companyCode, tableName, columnName);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: tree,
|
||||
});
|
||||
} catch (error: unknown) {
|
||||
const err = error as Error;
|
||||
logger.error("카테고리 트리 조회 API 오류", { error: err.message });
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: err.message,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 카테고리 목록 조회 (플랫 리스트)
|
||||
* GET /api/category-tree/test/:tableName/:columnName/flat
|
||||
*/
|
||||
router.get("/test/:tableName/:columnName/flat", async (req: AuthenticatedRequest, res: Response) => {
|
||||
try {
|
||||
const { tableName, columnName } = req.params;
|
||||
const companyCode = req.user?.companyCode || "*";
|
||||
|
||||
const list = await categoryTreeService.getCategoryList(companyCode, tableName, columnName);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: list,
|
||||
});
|
||||
} catch (error: unknown) {
|
||||
const err = error as Error;
|
||||
logger.error("카테고리 목록 조회 API 오류", { error: err.message });
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: err.message,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 카테고리 값 단일 조회
|
||||
* GET /api/category-tree/test/value/:valueId
|
||||
*/
|
||||
router.get("/test/value/:valueId", async (req: AuthenticatedRequest, res: Response) => {
|
||||
try {
|
||||
const { valueId } = req.params;
|
||||
const companyCode = req.user?.companyCode || "*";
|
||||
|
||||
const value = await categoryTreeService.getCategoryValue(companyCode, Number(valueId));
|
||||
|
||||
if (!value) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
error: "카테고리 값을 찾을 수 없습니다",
|
||||
});
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: value,
|
||||
});
|
||||
} catch (error: unknown) {
|
||||
const err = error as Error;
|
||||
logger.error("카테고리 값 조회 API 오류", { error: err.message });
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: err.message,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 카테고리 값 생성
|
||||
* POST /api/category-tree/test/value
|
||||
*/
|
||||
router.post("/test/value", async (req: AuthenticatedRequest, res: Response) => {
|
||||
try {
|
||||
const input: CreateCategoryValueInput = req.body;
|
||||
const companyCode = req.user?.companyCode || "*";
|
||||
const createdBy = req.user?.userId;
|
||||
|
||||
if (!input.tableName || !input.columnName || !input.valueCode || !input.valueLabel) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
error: "tableName, columnName, valueCode, valueLabel은 필수입니다",
|
||||
});
|
||||
}
|
||||
|
||||
const value = await categoryTreeService.createCategoryValue(companyCode, input, createdBy);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: value,
|
||||
});
|
||||
} catch (error: unknown) {
|
||||
const err = error as Error;
|
||||
logger.error("카테고리 값 생성 API 오류", { error: err.message });
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: err.message,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 카테고리 값 수정
|
||||
* PUT /api/category-tree/test/value/:valueId
|
||||
*/
|
||||
router.put("/test/value/:valueId", async (req: AuthenticatedRequest, res: Response) => {
|
||||
try {
|
||||
const { valueId } = req.params;
|
||||
const input: UpdateCategoryValueInput = req.body;
|
||||
const companyCode = req.user?.companyCode || "*";
|
||||
const updatedBy = req.user?.userId;
|
||||
|
||||
const value = await categoryTreeService.updateCategoryValue(companyCode, Number(valueId), input, updatedBy);
|
||||
|
||||
if (!value) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
error: "카테고리 값을 찾을 수 없습니다",
|
||||
});
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: value,
|
||||
});
|
||||
} catch (error: unknown) {
|
||||
const err = error as Error;
|
||||
logger.error("카테고리 값 수정 API 오류", { error: err.message });
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: err.message,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 카테고리 값 삭제
|
||||
* DELETE /api/category-tree/test/value/:valueId
|
||||
*/
|
||||
router.delete("/test/value/:valueId", async (req: AuthenticatedRequest, res: Response) => {
|
||||
try {
|
||||
const { valueId } = req.params;
|
||||
const companyCode = req.user?.companyCode || "*";
|
||||
|
||||
const success = await categoryTreeService.deleteCategoryValue(companyCode, Number(valueId));
|
||||
|
||||
if (!success) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
error: "카테고리 값을 찾을 수 없습니다",
|
||||
});
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: "삭제되었습니다",
|
||||
});
|
||||
} catch (error: unknown) {
|
||||
const err = error as Error;
|
||||
logger.error("카테고리 값 삭제 API 오류", { error: err.message });
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: err.message,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 테이블의 카테고리 컬럼 목록 조회
|
||||
* GET /api/category-tree/test/columns/:tableName
|
||||
*/
|
||||
router.get("/test/columns/:tableName", async (req: AuthenticatedRequest, res: Response) => {
|
||||
try {
|
||||
const { tableName } = req.params;
|
||||
const companyCode = req.user?.companyCode || "*";
|
||||
|
||||
const columns = await categoryTreeService.getCategoryColumns(companyCode, tableName);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: columns,
|
||||
});
|
||||
} catch (error: unknown) {
|
||||
const err = error as Error;
|
||||
logger.error("카테고리 컬럼 목록 조회 API 오류", { error: err.message });
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: err.message,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
|
||||
Reference in New Issue
Block a user