카테고리 기능 구현
This commit is contained in:
246
backend-node/src/controllers/tableCategoryValueController.ts
Normal file
246
backend-node/src/controllers/tableCategoryValueController.ts
Normal file
@@ -0,0 +1,246 @@
|
||||
import { Request, Response } from "express";
|
||||
import tableCategoryValueService from "../services/tableCategoryValueService";
|
||||
import { logger } from "../utils/logger";
|
||||
|
||||
/**
|
||||
* 테이블의 카테고리 컬럼 목록 조회
|
||||
*/
|
||||
export const getCategoryColumns = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const companyCode = req.user!.companyCode;
|
||||
const { tableName } = req.params;
|
||||
|
||||
const columns = await tableCategoryValueService.getCategoryColumns(
|
||||
tableName,
|
||||
companyCode
|
||||
);
|
||||
|
||||
return res.json({
|
||||
success: true,
|
||||
data: columns,
|
||||
});
|
||||
} catch (error: any) {
|
||||
logger.error(`카테고리 컬럼 조회 실패: ${error.message}`);
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "카테고리 컬럼 조회 중 오류가 발생했습니다",
|
||||
error: error.message,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 카테고리 값 목록 조회 (메뉴 스코프 적용)
|
||||
*/
|
||||
export const getCategoryValues = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const companyCode = req.user!.companyCode;
|
||||
const { tableName, columnName } = req.params;
|
||||
const menuId = parseInt(req.query.menuId as string, 10);
|
||||
const includeInactive = req.query.includeInactive === "true";
|
||||
|
||||
if (!menuId || isNaN(menuId)) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: "menuId 파라미터가 필요합니다",
|
||||
});
|
||||
}
|
||||
|
||||
const values = await tableCategoryValueService.getCategoryValues(
|
||||
tableName,
|
||||
columnName,
|
||||
menuId,
|
||||
companyCode,
|
||||
includeInactive
|
||||
);
|
||||
|
||||
return res.json({
|
||||
success: true,
|
||||
data: values,
|
||||
});
|
||||
} catch (error: any) {
|
||||
logger.error(`카테고리 값 조회 실패: ${error.message}`);
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "카테고리 값 조회 중 오류가 발생했습니다",
|
||||
error: error.message,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 카테고리 값 추가
|
||||
*/
|
||||
export const addCategoryValue = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const companyCode = req.user!.companyCode;
|
||||
const userId = req.user!.userId;
|
||||
const value = req.body;
|
||||
|
||||
const newValue = await tableCategoryValueService.addCategoryValue(
|
||||
value,
|
||||
companyCode,
|
||||
userId
|
||||
);
|
||||
|
||||
return res.status(201).json({
|
||||
success: true,
|
||||
data: newValue,
|
||||
});
|
||||
} catch (error: any) {
|
||||
logger.error(`카테고리 값 추가 실패: ${error.message}`);
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: error.message || "카테고리 값 추가 중 오류가 발생했습니다",
|
||||
error: error.message,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 카테고리 값 수정
|
||||
*/
|
||||
export const updateCategoryValue = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const companyCode = req.user!.companyCode;
|
||||
const userId = req.user!.userId;
|
||||
const valueId = parseInt(req.params.valueId);
|
||||
const updates = req.body;
|
||||
|
||||
if (isNaN(valueId)) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: "유효하지 않은 값 ID입니다",
|
||||
});
|
||||
}
|
||||
|
||||
const updatedValue = await tableCategoryValueService.updateCategoryValue(
|
||||
valueId,
|
||||
updates,
|
||||
companyCode,
|
||||
userId
|
||||
);
|
||||
|
||||
return res.json({
|
||||
success: true,
|
||||
data: updatedValue,
|
||||
});
|
||||
} catch (error: any) {
|
||||
logger.error(`카테고리 값 수정 실패: ${error.message}`);
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "카테고리 값 수정 중 오류가 발생했습니다",
|
||||
error: error.message,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 카테고리 값 삭제
|
||||
*/
|
||||
export const deleteCategoryValue = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const companyCode = req.user!.companyCode;
|
||||
const userId = req.user!.userId;
|
||||
const valueId = parseInt(req.params.valueId);
|
||||
|
||||
if (isNaN(valueId)) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: "유효하지 않은 값 ID입니다",
|
||||
});
|
||||
}
|
||||
|
||||
await tableCategoryValueService.deleteCategoryValue(
|
||||
valueId,
|
||||
companyCode,
|
||||
userId
|
||||
);
|
||||
|
||||
return res.json({
|
||||
success: true,
|
||||
message: "카테고리 값이 삭제되었습니다",
|
||||
});
|
||||
} catch (error: any) {
|
||||
logger.error(`카테고리 값 삭제 실패: ${error.message}`);
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: error.message || "카테고리 값 삭제 중 오류가 발생했습니다",
|
||||
error: error.message,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 카테고리 값 일괄 삭제
|
||||
*/
|
||||
export const bulkDeleteCategoryValues = async (
|
||||
req: Request,
|
||||
res: Response
|
||||
) => {
|
||||
try {
|
||||
const companyCode = req.user!.companyCode;
|
||||
const userId = req.user!.userId;
|
||||
const { valueIds } = req.body;
|
||||
|
||||
if (!Array.isArray(valueIds) || valueIds.length === 0) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: "삭제할 값 ID 목록이 필요합니다",
|
||||
});
|
||||
}
|
||||
|
||||
await tableCategoryValueService.bulkDeleteCategoryValues(
|
||||
valueIds,
|
||||
companyCode,
|
||||
userId
|
||||
);
|
||||
|
||||
return res.json({
|
||||
success: true,
|
||||
message: `${valueIds.length}개의 카테고리 값이 삭제되었습니다`,
|
||||
});
|
||||
} catch (error: any) {
|
||||
logger.error(`카테고리 값 일괄 삭제 실패: ${error.message}`);
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "카테고리 값 일괄 삭제 중 오류가 발생했습니다",
|
||||
error: error.message,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 카테고리 값 순서 변경
|
||||
*/
|
||||
export const reorderCategoryValues = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const companyCode = req.user!.companyCode;
|
||||
const { orderedValueIds } = req.body;
|
||||
|
||||
if (!Array.isArray(orderedValueIds) || orderedValueIds.length === 0) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: "순서 정보가 필요합니다",
|
||||
});
|
||||
}
|
||||
|
||||
await tableCategoryValueService.reorderCategoryValues(
|
||||
orderedValueIds,
|
||||
companyCode
|
||||
);
|
||||
|
||||
return res.json({
|
||||
success: true,
|
||||
message: "카테고리 값 순서가 변경되었습니다",
|
||||
});
|
||||
} catch (error: any) {
|
||||
logger.error(`카테고리 값 순서 변경 실패: ${error.message}`);
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "카테고리 값 순서 변경 중 오류가 발생했습니다",
|
||||
error: error.message,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user