239 lines
6.2 KiB
TypeScript
239 lines
6.2 KiB
TypeScript
import { Response } from "express";
|
|
import { AuthenticatedRequest } from "../types/auth";
|
|
import tableCategoryValueService from "../services/tableCategoryValueService";
|
|
import { logger } from "../utils/logger";
|
|
|
|
/**
|
|
* 테이블의 카테고리 컬럼 목록 조회
|
|
*/
|
|
export const getCategoryColumns = async (req: AuthenticatedRequest, 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: AuthenticatedRequest, res: Response) => {
|
|
try {
|
|
const companyCode = req.user!.companyCode;
|
|
const { tableName, columnName } = req.params;
|
|
const includeInactive = req.query.includeInactive === "true";
|
|
|
|
const values = await tableCategoryValueService.getCategoryValues(
|
|
tableName,
|
|
columnName,
|
|
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: AuthenticatedRequest, 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: AuthenticatedRequest, 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: AuthenticatedRequest, 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: AuthenticatedRequest, 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,
|
|
});
|
|
}
|
|
};
|
|
|